ระบบแจ้งเตือน Appsheet เข้า Line พร้อมรูป

🙌 สำหรับใครที่ใช้งาน Appsheet อยู่ และอยากทำให้ระบบมัน ส่งแจ้งเตือนเข้า Line อัตโนมัติ แบบ real-time พร้อมส่งรูปได้ด้วย

โดยโพสนี้จะมาสอนแบบ step-by-step ครับ ถ้าพร้อมแล้วก็สามารถเปิดหน้าระบบ appsheet ของเราขึ้นมาได้เลย

📌 เหมาะกับใคร?

  • คนที่ใช้งาน Appsheet อยู่แล้ว แต่อยากให้ระบบมัน เด้งแจ้งเตือนเข้า Line อัตโนมัติ
  • เจ้าของร้าน/เจ้าของธุรกิจที่อยาก รู้ความเคลื่อนไหวทันที (เช่น มีลูกค้าใหม่ หรือมีคำสั่งซื้อเข้า)
  • คนที่ไม่เคยเขียนโค้ด แต่ อยากเชื่อม Appsheet กับ Line แบบง่ายๆ

📦 สิ่งที่คุณจะได้จากโพสนี้

  • ✅ ฟรี! Script ตัวอย่างพร้อมใช้งานทันที
  • ✅ วิธี เชื่อม Google Apps Script กับ Appsheet แบบจับมือทำ
  • ✅ การส่งข้อมูลเป็น Flex Message แบบสวยๆ ไม่ใช่แค่ส่งข้อความโล้นๆ
  • ✅ เอาเทคนิคไปปรับใช้กับระบบอื่นๆได้

เริ่มต้นให้เราทำการสร้าง script ขึ้นมาก่อน โดยให้เราพิมพ์คำว่า “script.new” ลงไปที่ url เพื่อไปยังหน้า Google App Script ได้เลย และหลังจากนั้นให้นำเอา Code ดังต่อไปนี้ไปวางได้เลย

function sendLineFlexMessage(id, name, unit, imageUrl) {
  const LINE_TOKEN = 'Your line Token'; // ⚠️ Replace with your actual LINE Token
  const GROUP_ID = 'Your line target ID'; // ⚠️ Replace with your target ID

  // This is your original Flex Message content. No changes are needed here.
  const flexContent = {
    type: "bubble",
    body: {
      type: "box",
      layout: "vertical",
      contents: [
        {
          type: "text",
          text: "📋 New Contact Info",
          weight: "bold",
          size: "lg",
          margin: "none"
        },
        {
          type: "separator",
          margin: "md"
        },
        {
          type: "box",
          layout: "vertical",
          margin: "md",
          spacing: "sm",
          contents: [
            {
              type: "box",
              layout: "baseline",
              contents: [
                { type: "text", text: "🧍 id", size: "sm", color: "#555555", flex: 2 },
                { type: "text", text: id || "-", size: "sm", color: "#111111", flex: 4 }
              ]
            },
            {
              type: "box",
              layout: "baseline",
              contents: [
                { type: "text", text: "🧍 name", size: "sm", color: "#555555", flex: 2 },
                { type: "text", text: name || "-", size: "sm", color: "#111111", flex: 4 }
              ]
            },
            {
              type: "box",
              layout: "baseline",
              contents: [
                { type: "text", text: "📞 unit", size: "sm", color: "#555555", flex: 2 },
                { type: "text", text: unit || "-", size: "sm", color: "#111111", flex: 4 }
              ]
            }
          ]
        }
      ]
    }
  };

  imageUrl = getDirectDriveUrlFromAppSheetPath(imageUrl);

  // Construct the payload with BOTH the new image message and the existing flex message.
  const payload = {
    to: GROUP_ID,
    messages: [
      {
        // This is the new image message object
        type: "image",
        originalContentUrl: imageUrl,
        previewImageUrl: imageUrl // URL for the thumbnail in the chat list
      },
      {
        // This is your existing flex message object
        type: "flex",
        altText: "New contact added with a picture.", // Update alt text for notifications
        contents: flexContent
      }
    ]
  };

  const options = {
    method: "post",
    contentType: "application/json",
    headers: {
      "Authorization": "Bearer " + LINE_TOKEN
    },
    payload: JSON.stringify(payload),
    muteHttpExceptions: true // Helps in debugging by not throwing an error on failure
  };

  const response = UrlFetchApp.fetch("https://api.line.me/v2/bot/message/push", options);
  Logger.log(response.getContentText()); // Check the execution log to see the API response
}

function getDirectDriveUrlFromAppSheetPath(appSheetPath) {
  // Check if the input is valid
  if (!appSheetPath || appSheetPath.indexOf('/') === -1) {
    Logger.log("Invalid or empty AppSheet path provided.");
    return null;
  }

  try {
    // 1. Split the path into folder name and file name
    const parts = appSheetPath.split('/');
    const folderName = parts[0];
    const fileName = parts[1];

    // 2. Find the Google Drive folder by its name.
    // DriveApp.getFoldersByName returns an iterator, so we use .next() to get the first match.
    const folders = DriveApp.getFoldersByName(folderName);
    if (!folders.hasNext()) {
      Logger.log("Folder not found: " + folderName);
      return null;
    }
    const folder = folders.next();

    // 3. Find the file within that folder by its name.
    // folder.getFilesByName also returns an iterator.
    const files = folder.getFilesByName(fileName);
    if (!files.hasNext()) {
      Logger.log("File not found: " + fileName + " in folder " + folderName);
      return null;
    }
    const file = files.next();

    // 4. Get the ID of the found file.
    const fileId = file.getId();

    // 5. Construct the direct download URL in the desired format.
    const directUrl = "https://lh3.googleusercontent.com/d/" + fileId;
    
    Logger.log("Successfully converted path to URL: " + directUrl);
    return directUrl;

  } catch (e) {
    Logger.log("An error occurred: " + e.toString());
    return null;
  }
}

โดยสิ่งที่เราจำเป็นต้องแก้ไขมีดังต่อไปนี้

  1. ตัวแปรที่บรรทัดที่ 1 ให้เราทำการดูว่าค่าที่เราต้องการจะส่งแจ้งเตือนนั้นมีกี่ค่าและเป็นค่าอะไรบ้าง อย่างเช่นในตัวอย่างจะเป็น 4 ค่ามี รหัสสินค้า ชื่อสินค้า หน่วยนับ และ ลิงค์รูปภาพ เราก็จะใส่ตัวแปรเป็น id,name,unit,imageUrl
  2. หลังจากนั้นให้เราทำการแก้ไขตัวแปร LINE_TOKEN ในบรรทัดที่ 2 โดย Line Access Token ให้เราไปนำมาจากหน้า developers.line.biz แล้วเลือก LineOA ที่เราได้สร้างไว้แล้ว click ที่หน้า Messaging API ที่ด้านล่างสุดเราจะเจอ Line Access Token ของเรา ก็ให้ทำการ copy มาวางที่นี้ได้เลย
  3. GroupID ในบรรทัดที่ 3 โดยตัวแปรนี้จะเป็นตัวที่กำหนดว่าเราจะให้ script ของเราส่งข้อความไปหาใคร หรือ linegroup อะไร ซึ่งเราสามารถใช้วิธีการนำเอา webhook จากเว็บ webhook.site มาผูกที่หน้า Messaging API ในส่วนของ webhook url ได้ และเมื่อเราทักข้อความเข้าไปหา LineOA ตัวนี้ ระบบจะขึ้นตัวเลขของ GroupID หรือ UserID มาในหน้า Webhook.site เราก็สามารถ copy มาวางที่ script ของเราได้เลย
  4. หลังจากนั้นก็ให้เราทำการเปลี่ยนข้อมูลใน flexmessage ให้เป็นไปตามที่เราต้องการ โดยใช้ตัวแปรใหม่ที่เราได้สร้างขึ้นมา

หลังจากนั้นให้เราไปที่หลังบ้าน Appsheet ของเรา เลือกที่ เมนู automation และสร้าง automation โดยในส่วนของ trigger ให้เราเลือกว่าเมื่อเกิดเหตุการณ์อะไรใน Table อะไรระบบถึง run automation ตัวนี้

และในส่วนของ process ที่ต้องการให้ run ให้เราเลือกเป็น Call a script แล้วทำการเลือก script ที่เราได้สร้างไว้ หลังจากนั้นให้เลือกชื่อ function ที่ต้องการ และระบุว่าตัวแปรต่างๆที่เราได้ระบบไว้ใน script จะให้ไปดึงค่าใหนจากตารางข้อมูลยืมมาแจ้งเตือน

Screenshot

แค่นี้เป็นอันเรียบร้อยครับ เมื่อเราได้ใส่ข้อมูลใน Appsheet ระบบก็จะทำการแจ้งเตือนไปยัง line ของเราแบบอัตโนมัติ

Screenshot

ถ้าใครงงขั้นตอนใหนก็สามารถกดดูรายละเอียดเพิ่มเติมได้ที่คลิปด้านล่างเลยครับ

สามารถ download template Appsheet ต่างๆของช่องได้ที่นี้เลย
🔗 Link download Template Appsheet

💳 ชอบคลิปที่ช่วยเพิ่มประสิทธิภาพการทำงานแบบนี้สามารถสมัครสมาชิกช่องได้ที่ 
https://www.youtube.com/channel/UChxmhkD8uSSzUOkfMO_p5oQ/join

🎥 อุปกรณ์ที่ผมใช้

กล้อง Sony ZV-E10 kit 16-50mm
Mouse Logitech MX Master 3s
MacBook Air M2
ไมค์ wireless Saramonic Blink 500
เก้าอี้ Anda Seat X-Air Pro Ergonomic Gaming Chair
แขนจับจอ Anda Seat Stealth A6L Ergonomic Monitor Arm
ไมโครโฟน AKG Lyra
ไฟส่องหน้าจอ Xiaomi Light Bar

Leave a Reply

Your email address will not be published. Required fields are marked *