const LINE_TOKEN = 'omYpX07k2MYWHlMKD7L/2NYysJgzk3VkivJUM/LimYKF33SpG+6mZWUK74Pjud+6oYaLR1UqlpqM8D6GDbjrRKOj4FxZoJuyzlE2Fva4Wi8txMX+UL3+31rgiG58K+eeLK0tH45L77Vnm5MfgHsrcQdB04t89/1O/w1cDnyilFU=';
function doPost(e) {
const data = JSON.parse(e.postData.contents);
const event = data.events[0];
if (event.type === 'message' && event.message.type === 'text') {
const userText = event.message.text.trim().toLowerCase();
const replyToken = event.replyToken;
if(userText == "สวัสดี"){
sendMessage(replyToken, { type: 'text', text: 'สสัสดีดด' });
}else{
sendMessage(replyToken, { type: 'text', text: 'ขออภัย ไม่เข้าใจคำสั่งนี้' });
}
}
}
function sendMessage(replyToken, message) {
const url = 'https://api.line.me/v2/bot/message/reply';
UrlFetchApp.fetch(url, {
method: 'post',
contentType: 'application/json',
headers: { Authorization: `Bearer ${LINE_TOKEN}` },
payload: JSON.stringify({ replyToken, messages: [message] })
});
}
เชื่อมต่อฐานข้อมูลใน sheet แบบข้อความเท่านั้น
const LINE_TOKEN = 'omYpX07k2MYWHlMKD7L/2NYysJgzk3VkivJUM/LimYKF33SpG+6mZWUK74Pjud+6oYaLR1UqlpqM8D6GDbjrRKOj4FxZoJuyzlE2Fva4Wi8txMX+UL3+31rgiG58K+eeLK0tH45L77Vnm5MfgHsrcQdB04t89/1O/w1cDnyilFU=';
function doPost(e) {
const data = JSON.parse(e.postData.contents);
const event = data.events[0];
if (event.type === 'message' && event.message.type === 'text') {
const userText = event.message.text.trim().toLowerCase();
const replyToken = event.replyToken;
if (userText === 'สวัสดี') {
sendMessage(replyToken, { type: 'text', text: 'สวัสดีครับ! 😊' });
} else {
sendMessage(replyToken, { type: 'text', text: findAnswer(userText) });
}
}
}
function sendMessage(replyToken, message) {
const url = 'https://api.line.me/v2/bot/message/reply';
UrlFetchApp.fetch(url, {
method: 'post',
contentType: 'application/json',
headers: { Authorization: `Bearer ${LINE_TOKEN}` },
payload: JSON.stringify({ replyToken, messages: [message] })
});
}
function findAnswer(userQuestion) {
const sheet = SpreadsheetApp.openByUrl("https://docs.google.com/spreadsheets/d/1zxl-4z7gqOO92IqM_IYdpKs0FYhN68r3sHMfjoX_fd8/edit?usp=sharing").getSheetByName("คำถาม-คำตอบ");
if (!sheet) return "ขออภัย ไม่พบข้อมูล";
const data = sheet.getDataRange().getValues();
if (data.length <= 1) return "ขออภัย ไม่พบข้อมูล";
data.shift(); // Skip headers
for (let row of data) {
const question = String(row[0]).trim().toLowerCase();
const answer = String(row[1]).trim();
const keywords = row[2] ? String(row[2]).split(',').map(k => k.trim().toLowerCase()) : [];
if (question === userQuestion || keywords.some(k => userQuestion.includes(k))) {
return answer;
}
}
return "ขออภัย ไม่เข้าใจคำถาม";
}
เชื่อมต่อฐานข้อมูลใน sheet แบบ Json ใน sheet
const LINE_TOKEN = 'omYpX07k2MYWHlMKD7L/2NYysJgzk3VkivJUM/LimYKF33SpG+6mZWUK74Pjud+6oYaLR1UqlpqM8D6GDbjrRKOj4FxZoJuyzlE2Fva4Wi8txMX+UL3+31rgiG58K+eeLK0tH45L77Vnm5MfgHsrcQdB04t89/1O/w1cDnyilFU=';
function doPost(e) {
const data = JSON.parse(e.postData.contents);
const event = data.events[0];
if (event.type === 'message' && event.message.type === 'text') {
const userText = event.message.text.trim().toLowerCase();
const replyToken = event.replyToken;
if (userText === 'สวัสดี') {
sendMessage(replyToken, { type: 'text', text: 'สวัสดีครับ! 😊' });
} else {
sendMessage(replyToken, findAnswer(userText));
}
}
}
function sendMessage(replyToken, message) {
const url = 'https://api.line.me/v2/bot/message/reply';
UrlFetchApp.fetch(url, {
method: 'post',
contentType: 'application/json',
headers: { Authorization: `Bearer ${LINE_TOKEN}` },
payload: JSON.stringify({ replyToken, messages: [message] })
});
}
function findAnswer(userQuestion) {
const sheet = SpreadsheetApp.openByUrl("https://docs.google.com/spreadsheets/d/1zxl-4z7gqOO92IqM_IYdpKs0FYhN68r3sHMfjoX_fd8/edit?usp=sharing")
.getSheetByName("คำถาม-คำตอบ");
if (!sheet) return { type: 'text', text: "ขออภัย ไม่พบข้อมูล" };
const data = sheet.getDataRange().getValues();
if (data.length <= 1) return { type: 'text', text: "ขออภัย ไม่พบข้อมูล" };
data.shift(); // Skip headers
for (let row of data) {
const question = String(row[0]).trim().toLowerCase();
let answer;
try {
answer = JSON.parse(String(row[1]).trim());
} catch (e) {
answer = { type: 'text', text: String(row[1]).trim() }; // Fallback to plain text
}
const keywords = row[2] ? String(row[2]).split(',').map(k => k.trim().toLowerCase()) : [];
if (question === userQuestion || keywords.some(k => userQuestion.includes(k))) {
return answer;
}
}
return { type: 'text', text: "ขออภัย ไม่เข้าใจคำถาม" };
}
ตอบเบื้องต้น message แบบต่่างๆ
const LINE_TOKEN = 'omYpX07k2MYWHlMKD7L/2NYysJgzk3VkivJUM/LimYKF33SpG+6mZWUK74Pjud+6oYaLR1UqlpqM8D6GDbjrRKOj4FxZoJuyzlE2Fva4Wi8txMX+UL3+31rgiG58K+eeLK0tH45L77Vnm5MfgHsrcQdB04t89/1O/w1cDnyilFU=';
function doPost(e) {
const data = JSON.parse(e.postData.contents);
const event = data.events[0];
if (event.type === 'message' && event.message.type === 'text') {
const userText = event.message.text.trim().toLowerCase();
const replyToken = event.replyToken;
let message;
if (userText === 'สวัสดี' || userText === 'hello') {
message = { type: 'text', text: 'สวัสดีนักเรียน! 😊' };
} else if (userText === 'ภาพ') {
message = {
type: 'image',
originalContentUrl: 'https://www.sarakadee.com/wp-content/uploads/third-elephant01.jpg',
previewImageUrl: 'https://www.sarakadee.com/wp-content/uploads/third-elephant01.jpg'
};
} else if (userText === 'สติกเกอร์') {
message = {
type: 'sticker',
packageId: '11537',
stickerId: '52002752'
};
} else if (userText === 'แผนที่') {
message = {
type: 'location',
title: 'บ้านของหงส์',
address: '91 หมู่ 2 ต.ลำปำ อ.เมือง จ.พัทลุง 93000',
latitude: 35.65910807942215,
longitude: 139.70372892916203
};
} else if (userText === 'หัวข้อ') {
message = {
type: 'text',
text: 'เลือกหัวข้อที่ต้องการเรียน',
quickReply: {
items: [
{
type: 'action',
action: {
type: 'message',
label: 'คณิตศาสตร์',
text: 'คณิตศาสตร์'
}
},
{
type: 'action',
action: {
type: 'message',
label: 'วิทยาศาสตร์',
text: 'วิทยาศาสตร์'
}
}
]
}
};
} else {
message = { type: 'text', text: 'ขออภัย ไม่เข้าใจคำสั่งนี้' };
}
sendMessage(replyToken, message);
}
}
function sendMessage(replyToken, message) {
const url = 'https://api.line.me/v2/bot/message/reply';
UrlFetchApp.fetch(url, {
method: 'post',
contentType: 'application/json',
headers: { Authorization: 'Bearer ' + LINE_TOKEN },
payload: JSON.stringify({ replyToken, messages: [message] })
});
}
const LINE_TOKEN = 'omYpX07k2MYWHlMKD7L/2NYysJgzk3VkivJUM/LimYKF33SpG+6mZWUK74Pjud+6oYaLR1UqlpqM8D6GDbjrRKOj4FxZoJuyzlE2Fva4Wi8txMX+UL3+31rgiG58K+eeLK0tH45L77Vnm5MfgHsrcQdB04t89/1O/w1cDnyilFU=';
const GEMINI_API_KEY = 'AIzaSyAvSRdiij02exZHV6_iBMDFn5FBaoC6BqI';
const GEMINI_API_URL = 'https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash:generateContent';
function doPost(e) {
const data = JSON.parse(e.postData.contents);
const event = data.events[0];
if (event.type === 'message' && event.message.type === 'text') {
const userText = event.message.text;
const replyToken = event.replyToken;
// Call Gemini API
const payload = {
contents: [{
role: 'user',
parts: [{ text: userText }]
}]
};
const response = UrlFetchApp.fetch(GEMINI_API_URL + '?key=' + GEMINI_API_KEY, {
method: 'post',
contentType: 'application/json',
payload: JSON.stringify(payload)
});
const responseData = JSON.parse(response.getContentText());
let messageText = 'ขอโทษครับ ไม่สามารถตอบได้ตอนนี้';
if (responseData.candidates && responseData.candidates.length > 0) {
messageText = responseData.candidates[0].content.parts[0].text;
}
// Send reply
sendMessage(replyToken, { type: 'text', text: messageText.substring(0, 2000) });
}
}
function sendMessage(replyToken, message) {
const url = 'https://api.line.me/v2/bot/message/reply';
UrlFetchApp.fetch(url, {
method: 'post',
contentType: 'application/json',
headers: { Authorization: 'Bearer ' + LINE_TOKEN },
payload: JSON.stringify({ replyToken, messages: [message] })
});
}
// Global variables
var LINE_CHANNEL_TOKEN = 'omYpX07k2MYWHlMKD7L/2NYysJgzk3VkivJUM/LimYKF33SpG+6mZWUK74Pjud+6oYaLR1UqlpqM8D6GDbjrRKOj4FxZoJuyzlE2Fva4Wi8txMX+UL3+31rgiG58K+eeLK0tH45L77Vnm5MfgHsrcQdB04t89/1O/w1cDnyilFU='; // Replace with your LINE Channel Access Token
var GEMINI_API_KEY = 'AIzaSyAvSRdiij02exZHV6_iBMDFn5FBaoC6BqI'; // Replace with your Gemini API Key
var GEMINI_API_URL = 'https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent';
var SCRIPT_PROPERTIES = PropertiesService.getScriptProperties();
// Handle incoming LINE messages
function doPost(e) {
try {
var data = JSON.parse(e.postData.contents);
var events = data.events;
for (var i = 0; i < events.length; i++) {
if (events[i].type === 'message') {
var userId = events[i].source.userId;
var replyToken = events[i].replyToken;
var history = getConversationHistory(userId);
// Handle text message
if (events[i].message.type === 'text') {
var userMessage = events[i].message.text;
history.push({ role: 'user', content: userMessage });
var responseText = callGeminiAPI(history);
history.push({ role: 'model', content: responseText });
storeConversationHistory(userId, history);
sendLineReply(replyToken, responseText);
}
// Handle image message
else if (events[i].message.type === 'image') {
try {
var imageUrl = getLineImageContent(events[i].message.id);
var base64Image = imageUrlToBase64(imageUrl);
history.push({
role: 'user',
content: [
{ text: "วิเคราะห์รูปภาพนี้:" },
{
inlineData: {
mimeType: "image/jpeg",
data: base64Image
}
}
]
});
var responseText = callGeminiAPI(history);
history.push({ role: 'model', content: responseText });
storeConversationHistory(userId, history);
sendLineReply(replyToken, responseText);
} catch (error) {
Logger.log('Image processing error: ' + error);
sendLineReply(replyToken, 'ขอโทษครับ เกิดข้อผิดพลาดในการประมวลผลรูปภาพ');
}
}
}
}
return ContentService.createTextOutput(JSON.stringify({status: 'success'}));
} catch (error) {
Logger.log('Error: ' + error);
return ContentService.createTextOutput(JSON.stringify({status: 'error', message: error.toString()}));
}
}
// Call Gemini API with conversation history (supports text and images)
function callGeminiAPI(history) {
var payload = {
contents: history.map(item => ({
role: item.role,
parts: Array.isArray(item.content) ?
item.content.map(part => {
if (part.text) {
return { text: part.text };
} else if (part.inlineData) {
return { inlineData: part.inlineData };
}
return { text: JSON.stringify(part) };
}) :
[{ text: item.content }]
})),
generationConfig: {
maxOutputTokens: 2000
}
};
var options = {
method: 'post',
contentType: 'application/json',
payload: JSON.stringify(payload),
muteHttpExceptions: true
};
try {
var response = UrlFetchApp.fetch(GEMINI_API_URL + '?key=' + GEMINI_API_KEY, options);
var responseData = JSON.parse(response.getContentText());
if (responseData.candidates && responseData.candidates.length > 0) {
return responseData.candidates[0].content.parts.map(part => part.text).join('');
}
return 'ขอโทษครับ ไม่สามารถตอบได้ตอนนี้';
} catch (error) {
Logger.log('Gemini API Error: ' + error);
return 'เกิดข้อผิดพลาดในการติดต่อ AI';
}
}
// Send reply to LINE
function sendLineReply(replyToken, message) {
var url = 'https://api.line.me/v2/bot/message/reply';
var payload = {
replyToken: replyToken,
messages: [{ type: 'text', text: message.substring(0, 2000) }]
};
var options = {
method: 'post',
contentType: 'application/json',
headers: { 'Authorization': 'Bearer ' + LINE_CHANNEL_TOKEN },
payload: JSON.stringify(payload),
muteHttpExceptions: true
};
UrlFetchApp.fetch(url, options);
}
// Get LINE image content as temporary URL
function getLineImageContent(messageId) {
var url = 'https://api-data.line.me/v2/bot/message/' + messageId + '/content';
var options = {
headers: {
'Authorization': 'Bearer ' + LINE_CHANNEL_TOKEN,
'Content-Type': 'application/octet-stream'
},
muteHttpExceptions: true
};
var response = UrlFetchApp.fetch(url, options);
if (response.getResponseCode() !== 200) {
throw new Error('Failed to get image content: ' + response.getContentText());
}
return response.getBlob().getBytes();
}
// Convert image data to base64
function imageUrlToBase64(imageData) {
return Utilities.base64Encode(imageData);
}
// Retrieve conversation history
function getConversationHistory(userId) {
var history = SCRIPT_PROPERTIES.getProperty(userId);
return history ? JSON.parse(history) : [];
}
// Store conversation history (limit to 10 messages)
function storeConversationHistory(userId, history) {
if (history.length > 10) {
history = history.slice(-10);
}
SCRIPT_PROPERTIES.setProperty(userId, JSON.stringify(history));
}
// Global variables
var LINE_CHANNEL_TOKEN = 'omYpX07k2MYWHlMKD7L/2NYysJgzk3VkivJUM/LimYKF33SpG+6mZWUK74Pjud+6oYaLR1UqlpqM8D6GDbjrRKOj4FxZoJuyzlE2Fva4Wi8txMX+UL3+31rgiG58K+eeLK0tH45L77Vnm5MfgHsrcQdB04t89/1O/w1cDnyilFU='; // Replace with your LINE Channel Access Token
var GEMINI_API_KEY = 'AIzaSyAvSRdiij02exZHV6_iBMDFn5FBaoC6BqI'; // Replace with your Gemini API Key
var GEMINI_API_URL = 'https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent';
var SCRIPT_PROPERTIES = PropertiesService.getScriptProperties();
// Handle incoming LINE messages
function doPost(e) {
try {
var data = JSON.parse(e.postData.contents);
var events = data.events;
for (var i = 0; i < events.length; i++) {
if (events[i].type === 'message' && events[i].message.type === 'text') {
var userId = events[i].source.userId;
var userMessage = events[i].message.text;
var replyToken = events[i].replyToken;
// Get and update conversation history
var history = getConversationHistory(userId);
history.push({ role: 'user', content: userMessage });
// Call Gemini API
var responseText = callGeminiAPI(history);
// Append response to history and store
history.push({ role: 'model', content: responseText });
storeConversationHistory(userId, history);
// Reply to LINE
sendLineReply(replyToken, responseText);
}
}
return ContentService.createTextOutput('OK');
} catch (error) {
Logger.log('Error: ' + error);
return ContentService.createTextOutput('Error occurred');
}
}
// Call Gemini API with conversation history
function callGeminiAPI(history) {
var payload = {
contents: history.map(item => ({
role: item.role,
parts: [{ text: item.content }]
}))
};
var options = {
method: 'post',
contentType: 'application/json',
payload: JSON.stringify(payload),
muteHttpExceptions: true
};
try {
var response = UrlFetchApp.fetch(GEMINI_API_URL + '?key=' + GEMINI_API_KEY, options);
var data = JSON.parse(response.getContentText());
if (data.candidates && data.candidates.length > 0) {
return data.candidates[0].content.parts[0].text;
}
return 'ขอโทษครับ ไม่สามารถตอบได้ตอนนี้';
} catch (error) {
Logger.log('Gemini API Error: ' + error);
return 'เกิดข้อผิดพลาดในการติดต่อ AI';
}
}
// Send reply to LINE
function sendLineReply(replyToken, message) {
var url = 'https://api.line.me/v2/bot/message/reply';
var payload = {
replyToken: replyToken,
messages: [{ type: 'text', text: message.substring(0, 2000) }]
};
var options = {
method: 'post',
contentType: 'application/json',
headers: { 'Authorization': 'Bearer ' + LINE_CHANNEL_TOKEN },
payload: JSON.stringify(payload),
muteHttpExceptions: true
};
UrlFetchApp.fetch(url, options);
}
// Retrieve conversation history with initial context
function getConversationHistory(userId) {
var history = SCRIPT_PROPERTIES.getProperty(userId);
// If no history exists, initialize with research context
return [
{
role: "user",
content: "คุณเป็นบอทร้านอาหารชื่อ 'ครัวคุณป้า' เมนูมี: ก๋วยเตี๋ยวต้มยำ(80บาท), ข้าวผัด(60บาท)"
},
{
role: "model",
content: "เข้าใจแล้วครับ ฉันจะเป็นผู้เชี่ยวชาญร้านอาหาร"
}
];
return JSON.parse(history);
}
// Store conversation history (limit to 10 messages)
function storeConversationHistory(userId, history) {
if (history.length > 10) history = history.slice(-10);
SCRIPT_PROPERTIES.setProperty(userId, JSON.stringify(history));
}
// Global variables
var LINE_CHANNEL_TOKEN = 'omYpX07k2MYWHlMKD7L/2NYysJgzk3VkivJUM/LimYKF33SpG+6mZWUK74Pjud+6oYaLR1UqlpqM8D6GDbjrRKOj4FxZoJuyzlE2Fva4Wi8txMX+UL3+31rgiG58K+eeLK0tH45L77Vnm5MfgHsrcQdB04t89/1O/w1cDnyilFU='; // Replace with your LINE Channel Access Token
var GEMINI_API_KEY = 'AIzaSyAvSRdiij02exZHV6_iBMDFn5FBaoC6BqI'; // Replace with your Gemini API Key
var GEMINI_API_URL = 'https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent';
var SCRIPT_PROPERTIES = PropertiesService.getScriptProperties();
// User states
var USER_STATES = {
INITIAL: 0,
ASK_NAME: 1,
ASK_PHONE: 2,
CONFIRM: 3
};
// Handle incoming LINE messages
function doPost(e) {
try {
var data = JSON.parse(e.postData.contents);
var events = data.events;
for (var i = 0; i < events.length; i++) {
if (events[i].type === 'message' && events[i].message.type === 'text') {
var userId = events[i].source.userId;
var userMessage = events[i].message.text;
var replyToken = events[i].replyToken;
handleUserStep(userId, userMessage, replyToken);
// Get and update conversation history
var history = getConversationHistory(userId);
history.push({ role: 'user', content: userMessage });
// Call Gemini API
var responseText = callGeminiAPI(history);
// Append response to history and store
history.push({ role: 'model', content: responseText });
storeConversationHistory(userId, history);
// Reply to LINE
sendLineReply(replyToken, responseText);
}
}
return ContentService.createTextOutput('OK');
} catch (error) {
Logger.log('Error: ' + error);
return ContentService.createTextOutput('Error occurred');
}
}
// Call Gemini API with conversation history
function callGeminiAPI(history) {
var payload = {
contents: history.map(item => ({
role: item.role,
parts: [{ text: item.content }]
}))
};
var options = {
method: 'post',
contentType: 'application/json',
payload: JSON.stringify(payload),
muteHttpExceptions: true
};
try {
var response = UrlFetchApp.fetch(GEMINI_API_URL + '?key=' + GEMINI_API_KEY, options);
var data = JSON.parse(response.getContentText());
if (data.candidates && data.candidates.length > 0) {
return data.candidates[0].content.parts[0].text;
}
return 'ขอโทษครับ ไม่สามารถตอบได้ตอนนี้';
} catch (error) {
Logger.log('Gemini API Error: ' + error);
return 'เกิดข้อผิดพลาดในการติดต่อ AI';
}
}
// Send reply to LINE
function sendLineReply(replyToken, message) {
var url = 'https://api.line.me/v2/bot/message/reply';
var payload = {
replyToken: replyToken,
messages: [{ type: 'text', text: message.substring(0, 2000) }]
};
var options = {
method: 'post',
contentType: 'application/json',
headers: { 'Authorization': 'Bearer ' + LINE_CHANNEL_TOKEN },
payload: JSON.stringify(payload),
muteHttpExceptions: true
};
UrlFetchApp.fetch(url, options);
}
// Retrieve conversation history with initial context
function getConversationHistory(userId) {
var history = SCRIPT_PROPERTIES.getProperty(userId);
// If no history exists, initializze with research context
return [
{
role: "user",
content: "คุณเป็นบอทร้านอาหารชื่อ 'ครัวคุณป้า' เมนูมี: ก๋วยเตี๋ยวต้มยำ(80บาท), ข้าวผัด(60บาท)"
},
{
role: "model",
content: "เข้าใจแล้วครับ ฉันจะเป็นผู้เชี่ยวชาญร้านอาหาร"
}
];
return JSON.parse(history);
}
// ฟังก์ชันจัดการขั้นตอนผู้ใช้
function handleUserStep(userId, userMessage, replyToken) {
// ดึงสถานะปัจจุบันของผู้ใช้
var userState = getUserState(userId);
var userData = getUserData(userId) || {};
// ตรวจสอบคำสั่งเริ่มต้นใหม่
if (userMessage.toLowerCase() === 'เริ่มต้นใหม่') {
resetUserState(userId);
sendLineReply(replyToken, 'เริ่มต้นใหม่เรียบร้อยค่ะ กรุณากรอกข้อมูลอีกครั้ง');
return;
}
// จัดการตามสถานะปัจจุบัน
switch(userState) {
case USER_STATES.INITIAL:
// ขั้นตอนเริ่มต้น - ถามชื่อ
sendLineReply(replyToken, 'กรุณากรอกชื่อของคุณ:');
setUserState(userId, USER_STATES.ASK_NAME);
break;
case USER_STATES.ASK_NAME:
// บันทึกชื่อและถามเบอร์โทร
userData.name = userMessage;
setUserData(userId, userData);
sendLineReply(replyToken, 'กรุณากรอกเบอร์โทรศัพท์:');
setUserState(userId, USER_STATES.CONFIRM);
break;
case USER_STATES.CONFIRM:
// ยืนยันข้อมูล
if (userMessage.toLowerCase() === 'ใช่') {
sendLineReply(replyToken, 'บันทึกข้อมูลเรียบร้อยแล้ว ขอบคุณค่ะ');
resetUserState(userId);
} else if (userMessage.toLowerCase() === 'ไม่ใช่') {
// เริ่มต้นใหม่
resetUserState(userId);
sendLineReply(replyToken, 'เริ่มต้นใหม่ กรุณากรอกชื่อของคุณ:');
setUserState(userId, USER_STATES.ASK_NAME);
} else {
sendLineReply(replyToken, 'กรุณาตอบว่า "ใช่" หรือ "ไม่ใช่" เท่านั้น');
}
break;
default:
sendLineReply(replyToken, 'เกิดข้อผิดพลาด กรุณาเริ่มต้นใหม่');
resetUserState(userId);
}
}
// Store conversation history (limit to 10 messages)
function storeConversationHistory(userId, history) {
if (history.length > 10) history = history.slice(-10);
SCRIPT_PROPERTIES.setProperty(userId, JSON.stringify(history));
}
// ฟังก์ชันช่วยเหลือเกี่ยวกับสถานะผู้ใช้
function getUserState(userId) {
var state = SCRIPT_PROPERTIES.getProperty(userId + '_state');
return state ? parseInt(state) : USER_STATES.INITIAL;
}
function setUserState(userId, state) {
SCRIPT_PROPERTIES.setProperty(userId + '_state', state.toString());
}
function resetUserState(userId) {
SCRIPT_PROPERTIES.deleteProperty(userId + '_state');
SCRIPT_PROPERTIES.deleteProperty(userId + '_data');
}
function getUserData(userId) {
var data = SCRIPT_PROPERTIES.getProperty(userId + '_data');
return data ? JSON.parse(data) : null;
}
function setUserData(userId, data) {
SCRIPT_PROPERTIES.setProperty(userId + '_data', JSON.stringify(data));
}