แจกฟรี template การส่งแจ้งเตือนจาก Google Sheets ไปยัง Line ด้วย Line Messaging API

เริ่มต้น

เนื่องจากบริการ Line Notify กำลังจะเลิกให้บริการในวันที่ 31 มีนาคม 2025

Screenshot

แล้วถ้าเราใช้บริการใช้ Line Notify ในการส่งแจ้งเตือนจาก Google Sheets ไปยังไลน์อยู่ ในกรณีนี้เราจะมีทางเลือกยังไงบ้าง 🙁

นี้เลยเป็นที่มาของโพสนี้ ที่ผมจะมาอธิบาย option ต่างๆที่เราสามารถใช้บริการแทน Line Notify ได้

พร้อมทั้งสอนวิธีในการเปลี่ยน code จาก Line Notify ให้มาเป็น Line Messaging API

ซึ่ง Line Messaging API นั้นก็คือบริการใหม่ของ Line ที่เราจะสามารถส่งแจ้งเตือนไปยัง LineOA ได้

โดย Line Messaging API นั้นก็มาพร้อมข้อดีหลายอย่าง เช่น เรื่องการวิเคราะห์สถิติ การระบุข้อความให้ผู้รับที่เรากำหนดได้ ความสามารถส่งข้อมูลแบบ flex message

แต่ข้อเสียหลักๆก็คือ Line Messaging API สามารถส่งข้อความได้ฟรีเพียง 300 ข้อความต่อเดือนเท่านั้น
(โดยกรณีที่เรามีการ broadcast ข้อมูลเข้าในกลุ่มไลน์ที่มี user มากกว่า 1 ระบบก็จะคิดข้อความคูณตามจำนวน user ด้วยเช่นกัน)

แนวทางการแก้ไข

ในปัจจุบันถ้าเราไม่ได้ใช้ line notify เราสามารถเลือกใช้วิธีดังต่อไปนี้ได้

  1. ใช้ Line Messaging API ที่มีข้อดีคือ user ไม่จำเป็นต้องปรับตัว ยังสามารถรับแจ้งเตือนผ่านทาง line ต่อได้ เพียงแต่ว่าจะมีค่าใช้จ่ายในกรณีที่มีการส่งข้อความเกิน 300 ครั้งต่อเดือน
  2. ใช้บริการ Whatapps ซึ่งเป็นบริการที่เราสามารถเขียน script ขึ้นมาใช้บริการได้ฟรี โดย Whatapps เป็นบริการส่งข้อความที่ใช้งานแพร่หลายในต่างประเทศ แต่ในประเทศไทยอาจจะไม่ค่อยมี user ใช้งาน ทำให้กลายเป็นอุปสรรคสำคัญ
  3. ใช้บริการ telegram เป็นอีกหนึ่งบริการที่ใช้งานได้ฟรี และ script ในการส่งแจ้งเตือนไปยัง telegram นั้นเขียนไม่ยาก โดยอุปสรรคเรื่องของ user ใช้งานยังคงเป็นอุปสรรคสำคัญเช่นกัน แต่ถ้าคุณใช้ในกรณีส่งแจ้งเตือนข้อมูลต่างๆให้ตัวเองเป็นหลัก เช่น แจ้งเตือนราคาหน่วยลงทุน ก็สามารถใช้บริการของ telegram ได้เลย
  4. ใช้บริการ Discord Bot โดย discord bot เป็นอีกหนึ่งช่องทางที่ใช้งานฟรี แต่ข้อเสียคือการเขียน script และการ setup อาจจะมีความซับซ้อนกว่าวิธีอื่น รวมถึง discord อาจจะไม่เหมาะกรณีนำมาใช้งานในองค์กรบางประเภท

โดย content นี้ผมจะมานำเสนอ script ในการส่งแจ้งเตือนโดยใช้ Line Messaging API

Script แจ้งเตือนผ่านทาง Line Messaging API

เราสามารถ copy code ด้านล่างเพื่อนำไปใช้สำหรับการแจ้งเตือนไปยัง LineOA ได้ทันที

โดยความแตกต่างเมื่อเทียบกับ Line Notify คือ

  1. เราจะต้องทำการสร้าง LineOA ขึ้นมาก่อน
  2. เราจะต้องทำการ enable Messaging API ภายใน LineOA
  3. เราจะต้องมี userID หรือ groupID ของคนหรือกลุ่ม line ที่เราต้องการจะส่งข้อความไปเสียก่อน

โดยวิธีการสามารถดูได้จากคลิปด้านล่างเลยครับ

หลังจาก copy script ไปวางใน file google sheets เรียบร้อยแล้ว ให้ทำการแก้ไขข้อมูลใน 5 บรรทัดแรกสุดของ code เสียก่อน

และหลังจากนั้นก็สามารถใช้ function DailyReportToLine ในการส่งข้อความไปยัง line ได้ทันที

หรือถ้าอยากส่งไปเป็นข้อความ flex message ก็สามารถใช้ฟังชั่น DailyReportToLineFlex แทนได้เช่นกัน (วิธีการ setup flex message สามารถดูได้จากคลิปด้านล่างบทความได้เช่นกันครับ)

// แก้ไขข้อมูลที่นี้ก่อนใช้งาน //
const sheetid = ""; //ใส่ ID ของ Google Sheets ของเราจาก URL ของ Google Sheets
const ssName = "รายงานขายรายวัน-line"; //ใส่หน้าที่ต้องการดึงรายงานขาย
var accessToken = ''; //ใส่ Channel Accesstoken จาก https://developers.line.biz
var groupId = ''; //กรณีต้องการส่งข้อความไปยัง group line หา ID จาก https://webhook.site/
var userId = ''; //กรณีต้องการส่งข้อความไปยัง user หา ID user จาก https://webhook.site/
var flexMessageSheet = "FlexMessage" //ชื่อชีทที่เก็บข้อมูล FlexMessage

var ss = SpreadsheetApp.openById(sheetid).getSheetByName(ssName);
var flexSheet = SpreadsheetApp.openById(sheetid).getSheetByName(flexMessageSheet);

var saleReport = {
    date: " ",
    todaysale: " ",
    todaygr: " ",
    monthlysale: " "
};

function DailyReportToLineFlex(){

  saleReport.date = DateConvert(ss.getRange('B2').getValue());
  saleReport.todaysale = formatNumber(ss.getRange('B3').getValue());
  saleReport.todaygr = formatNumber(ss.getRange('B4').getValue());
  saleReport.monthlysale = formatNumber(ss.getRange('B5').getValue());

  Logger.log(saleReport)
  sendFlexMsg(groupId,saleReport);
}

function sendFlexMsg(uid,saleReport){
  var flexMessage = JSON.parse(flexSheet.getRange("B2").getValue());
  replaceVariables(flexMessage,saleReport);
  
  var lineHeader = {
    "Content-Type": "application/json",
    "Authorization" : "Bearer " + accessToken
  };

  var url = "https://api.line.me/v2/bot/message/push";

  var payload = {
    to: uid,
    messages: [
      {
        "type": "flex",
        "altText": "This is a Flex Message",
        "contents": flexMessage,
      },
    ],
  };

  var options = {
    "method": "post",
    "headers": lineHeader,
    "payload": JSON.stringify(payload),
  };

  var response = UrlFetchApp.fetch(url, options);
  Logger.log(response.getContentText());
}

function DailyReportToLine() {
  
  var ss = SpreadsheetApp.openById(sheetid).getSheetByName(ssName);
  var msg;

  // --------- Your Message Go here --------//
  msg = "รายงานยอดขายประจำวันที่ " + DateConvert(ss.getRange('B2').getValue()) + "\n" +
        ss.getRange('A3').getValue() + " " + formatNumber(ss.getRange('B3').getValue()) + "\n" +
        ss.getRange('A4').getValue() + " " + formatNumber(ss.getRange('B4').getValue()) + "\n" +
        ss.getRange('A5').getValue() + " " + formatNumber(ss.getRange('B5').getValue()) + "\n";
  // ------------------------------------//

  Logger.log(msg);
  sendLineMessage(accessToken, userId, msg);
}

function sendLineMessage(token, recipientId, text) {
  var payload = JSON.stringify({
    to: recipientId,
    messages: [{type: 'text', text: text}]
  });

  var options = {
    'method': 'post',
    'contentType': 'application/json',
    'headers': {
      'Authorization': 'Bearer ' + token
    },
    'payload': payload
  };

  UrlFetchApp.fetch('https://api.line.me/v2/bot/message/push', options);
}

function replaceVariables(obj, variables) {
  for (var key in obj) {
    if (typeof obj[key] === "string") {
      // Replace variables in strings
      obj[key] = replaceVariablesInString(obj[key], variables);
    } else if (typeof obj[key] === "object") {
      // Recursively replace variables in nested objects
      replaceVariables(obj[key], variables);
    }
  }
}

function replaceVariablesInString(str, variables) {
  for (var key in variables) {
    var placeholder = "{{" + key + "}}";
    if (str.includes(placeholder)) {
      str = str.replace(placeholder, variables[key]);
    }
  }
  return str;
}

function ClearContentsAndFormatting(clearSheet,clearRange) {
  var range = clearSheet.getRange(clearRange);
 // Configure what to clear in the range
  var options = {
    formatOnly: true,
    contentsOnly: true
  };
 // Pass the options object to the clear() method
 range.clear(options);
}

function formatNumber(number) {
  return number.toLocaleString();
}

function DateConvert(date) {

    var yyyy = date.getFullYear().toString();
    var mm = (date.getMonth()+1).toString(); // getMonth() is zero-based
    var dd  = date.getDate().toString();

    return (dd[1]?dd:"0"+dd[0]) + '-' + (mm[1]?mm:"0"+mm[0]) + '-' + yyyy;
}

ถ้าต้องการได้ download file template google sheets พร้อม script ส่งไลน์และระบบสต๊อกสินค้าก็สามารถโหลดจาก link ด้านล่างได้เลยครับ

🔗 โหลด 📦 Template สต๊อกสินค้า พร้อม ระบบรายงานสินค้าเคลื่อนไหว (line messaging) ได้ที่นี้
download template here

👌 สนใจดูคลิปเต็ม สอนการส่งแจ้งเตือนจาก Google Sheets ไปยัง Line ด้วย Line Messaging API สามารถคลิกดูที่ด้านล่างได้เลยครับ

💳 ชอบคลิปที่ช่วยเพิ่มประสิทธิภาพการทำงานแบบนี้สามารถสมัครสมาชิกช่องได้ที่ 
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

4 Comments

  1. สอบถามครับ ติดปัญหา
    ข้อผิดพลาด
    Exception: Request failed for https://api.line.me returned code 400. Truncated server response: {“message”:”A message (messages[0]) in the request body is invalid”,”details”:[{“message”:”must be non-empty text”,”property”:”/body/contents/4/con… (use muteHttpExceptions option to examine full response)
    sendFlexMsg @ รหัส.gs:80
    DailyReportToLineFlex @ รหัส.gs:49

    1. ขึ้นแบบนี้แปลว่าเราอาจจะส่งข้อความที่เป็นว่างๆเข้าไปในฟังชั่นส่งไลน์ครับ

  2. สอบถามครับหากผมต้องการส่งรูปภาพ โดยการส่งจากgoogle sheet ได้ไหมครับ

    1. รูปที่อยู่ใน cell น่าจะไม่ได้ แต่ถ้าเป็นรูปที่ upload ลง google drive สามารถทำได้ครับ

Leave a Reply to admin Cancel reply

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