ในฐานะครู อาจารย์ หรือผู้ดูแลคอร์ส เราต่างรู้ดีว่า “งานเอกสาร” หลังการสอบคือฝันร้าย การรวบรวมคะแนน, สรุปเกรด, และที่สำคัญที่สุดคือ “การแจ้งคะแนน” ให้นักเรียน/นักศึกษาทราบทีละคน คือกระบวนการที่ซ้ำซาก, กินเวลา, และเสี่ยงต่อความผิดพลาด
จะดีกว่าไหม ถ้าเราเปลี่ยนจาก “ครู” มาเป็น “ผู้ควบคุมระบบ”?
จะดีกว่าไหม ถ้าเรากรอกคะแนนใน Google Sheets ปุ๊บ… นักเรียนก็ได้รับแจ้งเตือนคะแนนของตัวเองผ่าน LINE ส่วนตัวทันที?
บทความนี้คือคู่มือฉบับสมบูรณ์ (ที่อัปเดตและทำได้จริง) ที่จะเปลี่ยน Google Sheets ธรรมดาๆ ให้กลายเป็น “ศูนย์บัญชาการ” แจ้งเตือนคะแนนอัตโนมัติ โดยใช้พลังของ Google Apps Script และ LINE Messaging API
🤖 ภาพรวมระบบ: มันทำงานอย่างไร?
ก่อนจะเริ่มโค้ดดิ้ง มาดูแผนผังการทำงานที่เรากำลังจะสร้างกันก่อน:
กระบวนการนี้แบ่งเป็น 2 ส่วนหลัก:
- การลงทะเบียน (ครั้งแรก): นักเรียนเพิ่ม LINE Bot ของเราเป็นเพื่อน และ “พิมพ์รหัสนักเรียน” ของตนเองส่งมา Apps Script จะ “ดักจับ” ข้อความนั้น แล้วบันทึก
LINE UserID(ที่อยู่ของนักเรียนบน LINE) คู่กับรหัสนักเรียนใน Google Sheet - การส่งคะแนน (เมื่อเกรดออก): ครู “กรอกคะแนน” ลงใน Google Sheet จากนั้น “เลือกแถว” ที่ต้องการแจ้งเตือน แล้วกด “ปุ่มเมนูพิเศษ” ที่เราสร้างขึ้น… ระบบจะยิงคะแนนไปหา LINE ของนักเรียนที่ถูกเลือกทันที
ภาคที่ 1: การตั้งค่า “LINE Bot” (ผู้ส่งสาร)
สิ่งแรกที่เราต้องการคือ “บุรุษไปรษณีย์” เราจะไปสร้างเขาที่ LINE Developers
- ไปที่ LINE Developers Console แล้วล็อกอิน
- สร้าง Provider: ตั้งชื่อ (เช่น “My School”)
- สร้าง Channel:
- เลือก Messaging API
- กรอกรายละเอียด Channel (เช่น “Bot แจ้งเกรด ป.5/1”)
- ยอมรับข้อตกลง
- เอา “กุญแจ” สำคัญ: เมื่อเข้ามาใน Channel ของคุณ ให้ไปที่แท็บ Messaging API
- เลื่อนลงมาที่ Channel access token
- คลิก Issue (หรือ Re-issue) เพื่อสร้าง Token แบบ Long-lived (อยู่ได้ถาวร)
- คัดลอก Token นี้เก็บไว้ (หน้าตาจะประมาณ
XyZ...AbC...==) นี่คือ “กุญแจลับ” ที่สคริปต์ของเราใช้ส่งข้อความ
ภาคที่ 2: การตั้งค่า “Google Sheet” (ศูนย์บัญชาการ)
นี่คือ “สมอง” ของเรา สร้าง Google Sheet ใหม่ และออกแบบตารางให้มีคอลัมน์สำคัญดังนี้:
| A | B | C | D | E |
| StudentID | StudentName | LINE_UserID | Assignment_1 | Midterm |
| 65001 | ด.ช. ใจดี | (เว้นว่างไว้) | ||
| 65002 | ด.ญ. ใฝ่เรียน | (เว้นว่างไว้) | ||
| 65003 | ด.ช. มานะ | (เว้นว่างไว้) |
คอลัมน์ที่สำคัญที่สุด:
- StudentID (A): ต้องเป็นรหัส “ที่ไม่ซ้ำกัน” (Unique ID) เพื่อให้สคริปต์ใช้ค้นหา
- LINE_UserID (C): นี่คือหัวใจของการส่งข้อความส่วนตัว เราจะ “เว้นว่าง” ไว้ก่อน แล้วให้สคริปต์ของเรา (ในภาค 3) มาเติมให้เองอัตโนมัติ
- คอลัมน์คะแนน (D, E, …): คอลัมน์ที่คุณจะใช้กรอกคะแนน
ภาคที่ 3: การเขียน “Apps Script” (เครื่องยนต์)
นี่คือส่วนที่สนุกที่สุด! ไปที่ Google Sheet ของคุณ แล้วคลิก Extensions (ส่วนขยาย) > Apps Script
ลบโค้ดเก่าทิ้งให้หมด แล้ววางโค้ดทั้ง 3 ส่วนนี้ลงไป:
ส่วนที่ 1: ตั้งค่ากุญแจลับ และ “เครื่องมือส่ง”
โค้ดส่วนนี้คือการ “บอก” สคริปต์ว่า Bot ของเราคือใคร และสร้างฟังก์ชันสำหรับ “ส่งข้อความ”
JavaScript
// -----------------------------------------------------------------
// ส่วนที่ 1: ตั้งค่าหลัก และ ฟังก์ชันส่งข้อความ
// -----------------------------------------------------------------
// ‼️ ‼️ ให้วาง Channel Access Token ที่คัดลอกมาจาก LINE Developers ตรงนี้ ‼️ ‼️
var CHANNEL_ACCESS_TOKEN = 'YOUR_CHANNEL_ACCESS_TOKEN';
var LINE_API_URL = 'https://api.line.me/v2/bot/message/push';
/**
* ฟังก์ชันหลักในการส่งข้อความ Push Message ไปยัง LINE
* @param {string} userId - LINE UserID ของผู้รับ
* @param {string} messageText - ข้อความที่ต้องการส่ง
*/
function sendPushMessage(userId, messageText) {
if (!userId) {
Logger.log("ไม่พบ UserID, ข้ามการส่ง...");
return; // ถ้าช่อง UserID ว่างเปล่า ก็ไม่ต้องทำอะไร
}
var headers = {
'Content-Type': 'application/json',
'Authorization': 'Bearer ' + CHANNEL_ACCESS_TOKEN
};
var payload = {
'to': userId,
'messages': [{
'type': 'text',
'text': messageText
}]
};
var options = {
'method': 'post',
'headers': headers,
'payload': JSON.stringify(payload),
'muteHttpExceptions': true // ช่วยให้เราดีบั๊กง่ายขึ้นถ้าส่งไม่สำเร็จ
};
try {
var response = UrlFetchApp.fetch(LINE_API_URL, options);
Logger.log(response.getContentText());
} catch (e) {
Logger.log('Error sending message: ' + e);
}
}
ส่วนที่ 2: ระบบ “ลงทะเบียนอัตโนมัติ” (Webhook)
โค้ดส่วนนี้จะ “ดักฟัง” ข้อความที่นักเรียนส่งมาหา Bot เพื่อลงทะเบียน LINE_UserID ของพวกเขา
JavaScript
// -----------------------------------------------------------------
// ส่วนที่ 2: Webhook สำหรับ "ลงทะเบียน" รับ UserID
// -----------------------------------------------------------------
// นี่คือชื่อชีตที่เราใช้เก็บข้อมูลนักเรียน
var SHEET_NAME = "Sheet1"; // ‼️ แก้ไขชื่อชีตของคุณตรงนี้
var STUDENT_ID_COLUMN = 1; // คอลัมน์ A (รหัสนักเรียน)
var USER_ID_COLUMN = 3; // คอลัมน์ C (LINE_UserID)
/**
* doPost คือฟังก์ชันมาตรฐานที่ Apps Script ใช้รับ Webhook
* มันจะทำงาน "ทุกครั้ง" ที่มีคนส่งข้อความหา Bot ของเรา
*/
function doPost(e) {
var data;
try {
data = JSON.parse(e.postData.contents);
} catch (ex) {
Logger.log("Error parsing JSON: " + ex);
return;
}
// ดึงข้อมูลหลักจาก Webhook
var events = data.events;
var event = events[0]; // เอาเฉพาะเหตุการณ์แรก
var replyToken = event.replyToken;
var userId = event.source.userId;
// ตรวจสอบว่าเป็นข้อความ (ไม่ใช่สติกเกอร์ หรือการเพิ่มเพื่อน)
if (event.type !== "message" || event.message.type !== "text") {
return; // ถ้าไม่ใช่ข้อความ text ก็ไม่ต้องทำอะไร
}
var userMessage = event.message.text.trim(); // ข้อความที่นักเรียนพิมพ์มา (เช่น "65001")
// --- ส่วนที่ 1: การลงทะเบียน ---
// เปิดชีตและค้นหา StudentID ที่นักเรียนพิมพ์มา
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(SHEET_NAME);
var dataRange = sheet.getDataRange();
var values = dataRange.getValues();
var studentFound = false;
var studentName = "";
// วนลูปค้นหาทีละแถว (เริ่มจากแถวที่ 2 เพราะแถวแรกเป็นหัวตาราง)
for (var i = 1; i < values.length; i++) {
var studentIdInSheet = String(values[i][STUDENT_ID_COLUMN - 1]).trim();
if (studentIdInSheet === userMessage) {
// ---- เจอรหัสนักเรียน! ----
studentFound = true;
studentName = values[i][1]; // ดึงชื่อนักเรียน (คอลัมน์ B)
// บันทึก UserID ลงในคอลัมน์ C (USER_ID_COLUMN)
sheet.getRange(i + 1, USER_ID_COLUMN).setValue(userId);
// ตอบกลับนักเรียนว่าลงทะเบียนสำเร็จ
var replyMessage = "สวัสดีครับ คุณ " + studentName + " (รหัส: " + userMessage + ")\n\n" +
"ระบบได้ลงทะเบียน LINE ของคุณเรียบร้อยแล้ว\n" +
"ต่อไปนี้ เมื่อครูแจ้งคะแนน คุณจะได้รับแจ้งเตือนที่นี่ครับ";
sendReplyMessage(replyToken, replyMessage); // ส่งข้อความตอบกลับ
break; // หยุดลูปเมื่อเจอ
}
}
// --- ถ้าไม่เจอรหัส ---
if (!studentFound) {
var replyMessage = "ไม่พบรหัสนักเรียน '" + userMessage + "' ในระบบ\n" +
"กรุณาตรวจสอบรหัสและลองพิมพ์ใหม่ให้ถูกต้อง (เช่น 65001)";
sendReplyMessage(replyToken, replyMessage);
}
}
/**
* ฟังก์ชัน "ตอบกลับ" (Reply) ต้องใช้ replyToken และส่งได้แค่ครั้งเดียว
*/
function sendReplyMessage(replyToken, messageText) {
var url = 'https://api.line.me/v2/bot/message/reply';
var headers = {
'Content-Type': 'application/json',
'Authorization': 'Bearer ' ' + CHANNEL_ACCESS_TOKEN
};
var payload = {
'replyToken': replyToken,
'messages': [{'type': 'text', 'text': messageText}]
};
var options = {
'method': 'post',
'headers': headers,
'payload': JSON.stringify(payload)
};
UrlFetchApp.fetch(url, options);
}
ส่วนที่ 3: ระบบ “ส่งคะแนน” (ปุ่มเมนูพิเศษ)
โค้ดส่วนนี้จะสร้าง “ปุ่ม” บนเมนูของ Google Sheet เพื่อให้ครูกด “ส่งคะแนน”
JavaScript
// -----------------------------------------------------------------
// ส่วนที่ 3: สร้างเมนูสำหรับครู เพื่อกดส่งคะแนน
// -----------------------------------------------------------------
/**
* onOpen จะทำงานอัตโนมัติเมื่อ "เปิด" Google Sheet
* เพื่อสร้างเมนู "แจ้งเตือนนักเรียน"
*/
function onOpen() {
var ui = SpreadsheetApp.getUi();
ui.createMenu('📮 แจ้งเตือนนักเรียน')
.addItem('ส่งคะแนน (คอลัมน์ D: Assignment_1)', 'sendScoreAssignment1')
.addItem('ส่งคะแนน (คอลัมน์ E: Midterm)', 'sendScoreMidterm')
.addToUi();
}
/**
* ฟังก์ชันที่จะทำงานเมื่อครูกดเมนู "ส่งคะแนน (คอลัมน์ D: Assignment_1)"
*/
function sendScoreAssignment1() {
// เราจะส่งคอลัมน์ D (Assignment_1)
// 1 คือ รหัส, 2 คือ ชื่อ, 3 คือ UserID, 4 คือ คะแนน
sendScoresForSelectedRows(4, "Assignment_1");
}
/**
* ฟังก์ชันที่จะทำงานเมื่อครูกดเมนู "ส่งคะแนน (คอลัมน์ E: Midterm)"
*/
function sendScoreMidterm() {
// เราจะส่งคอลัมน์ E (Midterm)
sendScoresForSelectedRows(5, "Midterm");
}
/**
* ฟังก์ชันหลักที่ทำงาน "เมื่อครูกดปุ่ม"
* @param {number} scoreColumn - หมายเลขคอลัมน์ของคะแนนที่จะส่ง
* @param {string} assignmentName - ชื่อหัวข้องาน (เช่น "Assignment_1")
*/
function sendScoresForSelectedRows(scoreColumn, assignmentName) {
var sheet = SpreadsheetApp.getActiveSheet();
var selection = sheet.getActiveRange(); // ดึง "แถวที่ครูเลือก"
var values = selection.getValues(); // ดึงข้อมูลในแถวที่เลือก
var ui = SpreadsheetApp.getUi();
var failedSends = [];
for (var i = 0; i < values.length; i++) {
var row = values[i];
var studentName = row[1]; // คอลัมน์ B (ชื่อ)
var lineUserId = row[2]; // คอลัมน์ C (UserID)
var score = row[scoreColumn - 1]; // คะแนน (index เริ่มที่ 0)
if (lineUserId) { // ตรวจสอบว่ามี UserID (ลงทะเบียนแล้ว)
var message = "สวัสดีครับ คุณ " + studentName + "\n\n" +
"ครูแจ้งคะแนน " + assignmentName + " ครับ\n\n" +
"🎉 คุณได้คะแนน: " + score + "\n\n" +
"(นี่คือข้อความอัตโนมัติจาก Bot แจ้งเกรดครับ)";
sendPushMessage(lineUserId, message);
} else {
failedSends.push(studentName + " (ยังไม่ลงทะเบียน Bot)");
}
}
// แจ้งเตือนครูว่าทำงานเสร็จแล้ว
if (failedSends.length > 0) {
ui.alert("ส่งคะแนนไม่สำเร็จสำหรับ:\n" + failedSends.join("\n"));
} else {
ui.alert("ส่งคะแนนให้แถวที่เลือกเรียบร้อยแล้ว!");
}
}
ภาคที่ 4: การติดตั้ง (Deploy) – สำคัญมาก!
เราเขียนโค้ดเสร็จแล้ว แต่ต้อง “เปิดสวิตช์” ให้มันทำงานกับโลกภายนอก
- Deploy สคริปต์ (เพื่อให้ LINE รู้จัก):
- ในหน้า Apps Script คลิก Deploy (การทำให้ใช้งานได้) > New deployment (การทำให้ใช้งานได้รายการใหม่)
- เลือกประเภท (รูปเฟือง) > Web app
- Description: พิมพ์อะไรก็ได้ (เช่น “LINE Webhook”)
- Who has access: เลือก Anyone (สำคัญมาก! เพื่อให้ LINE ส่งข้อมูลมาได้)
- คลิก Deploy
- Apps Script จะให้ Web app URL มา ให้ “คัดลอก” URL นั้น
- (หากมีการแก้ไขโค้ดในอนาคต ให้ Deploy > Manage deployments > เลือกอันเดิม > Edit > New version)
- เชื่อมต่อ LINE กับ Apps Script:
- กลับไปที่ LINE Developers Console
- ไปที่ Channel ของคุณ > แท็บ Messaging API
- หาช่อง Webhook URL แล้วกด Edit
- “วาง” Web app URL ที่คัดลอกมาจาก Apps Script ลงไป
- เปิดสวิตช์ Use webhook
ภาคที่ 5: เริ่มใช้งานจริง (The Flow)
- (ครู) รีเฟรช Google Sheet: คุณจะเห็นเมนูใหม่ชื่อ “📮 แจ้งเตือนนักเรียน” โผล่ขึ้นมา
- (ครู) แชร์ QR Code ของ Bot: ไปที่ LINE Developers Console แท็บ “Messaging API” จะมี QR Code ของ Bot ให้… ส่งให้นักเรียน
- (นักเรียน) ลงทะเบียน:
- นักเรียนเพิ่ม Bot เป็นเพื่อน
- นักเรียนพิมพ์ “รหัสนักเรียน” ของตนเองส่งมา (เช่น
65001) - Bot (สคริปต์
doPost) จะตอบกลับว่า “สวัสดีครับ คุณ ด.ช. ใจดี … ลงทะเบียนสำเร็จ” - …กลับไปดูที่ Google Sheet… คอลัมน์
LINE_UserIDของ ด.ช. ใจดี จะถูกเติมโดยอัตโนมัติ!
- (ครู) แจ้งคะแนน:
- ครูไปที่คอลัมน์
Assignment_1(คอลัมน์ D) แล้วกรอกคะแนน10 - ครู “คลิกเลือก” แถวของ ด.ช. ใจดี (หรือเลือกทีละหลายๆ แถวก็ได้)
- ครูไปที่เมนู 📮 แจ้งเตือนนักเรียน > ส่งคะแนน (คอลัมน์ D: Assignment_1)
- …ติ๊ง!… LINE ของ ด.ช. ใจดี จะเด้งข้อความ: “สวัสดีครับ คุณ ด.ช. ใจดี… คุณได้คะแนน: 10…”
- ครูไปที่คอลัมน์
คุณทำสำเร็จแล้ว! คุณได้สร้างระบบแจ้งเตือนคะแนนอัตโนมัติที่ปลอดภัย (นักเรียนเห็นแค่คะแนนตัวเอง) รวดเร็ว (คลิกเดียวส่ง) และเป็นอัตโนมัติ (ลงทะเบียนเองได้)



