ทดสอบ

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));
}

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *