PPURIPAT
HOME/GUIDES/EP.01
⚠ ฉบับร่าง — ยังไม่ได้ทดสอบจริงบนบัญชีใหม่ ขั้นที่มีป้าย [VERIFY] หน้าจอจริงอาจต่างไปเล็กน้อย
GUIDE · EP.01#line-oa#ai#google-sheets#restaurant

บอท LINE OA ตอบลูกค้าร้านอาหาร 24 ชม. จากข้อมูลใน Google Sheet

ทำบอท LINE OA ที่ตอบคำถามลูกค้าจาก Google Sheet ของร้าน พูดจาเหมือนคนในร้าน ไม่มั่วราคา ไม่รับจองเอง ส่งต่อให้คนจริงเมื่อลูกค้าไม่พอใจ — ค่ารันบอท 0 บาท เลือกได้ว่าจะใช้ Template สำเร็จรูป หรือสร้างเองด้วย AI ฟรี

ใช้เวลา
ใช้ Template~45 นาที
สร้างเองด้วย AI ฟรี~1–2 ชม.
ค่ารันบอท
0 บาทต่อเดือน · สร้างก็ฟรี ใช้ AI แชทแบบฟรีได้
ต้องมี
  • คอมพิวเตอร์ (ทำบนมือถือไม่สะดวก)
  • มือถือที่มีแอป LINE
  • บัญชี Google
  • AI แชทแบบฟรีก็พอ เช่น Gemini, ChatGPT, Claude
ทดสอบล่าสุด
ยังไม่ทดสอบฉบับร่าง รอทดสอบตอนถ่ายทำ

เลือกเส้นทาง

เปลี่ยนได้ตลอด ความคืบหน้าไม่หาย

สองทางจบที่เส้นชัยเดียวกัน — บอทผ่านชุดทดสอบในแท็บ Test ขั้นตอนร่วม (สร้าง LINE OA, เอาคีย์) เหมือนกันทั้งสองทาง

0/4

บอทตัวนี้ทำอะไรได้

ลูกค้าทักเข้า LINE OA ของร้าน บอทตอบให้ทันทีจากข้อมูลที่ร้านกรอกไว้ใน Google Sheet แก้ข้อมูลใน Sheet แล้วบอทตอบตามนั้นเลย ไม่ต้องแตะโค้ด

  • ตอบจาก Sheet เท่านั้น ไม่แต่งราคา โปรโมชัน หรือเวลาเปิด-ปิดขึ้นมาเอง
  • ไม่ยืนยันการจองเอง บอกลูกค้าว่าต้องติดต่อร้าน
  • ระวังเรื่องแพ้อาหาร บอกส่วนผสมที่ควรระวัง และไม่รับประกันแทนครัว
  • ส่งต่อคนจริง เมื่อลูกค้าไม่พอใจ
  • ตอบสั้น เหมาะกับแชท LINE และพูดด้วยน้ำเสียงของร้าน
ค่าใช้จ่าย

บอทรันบน Google Apps Script (ฟรี) และใช้ AI แบบ free tier ของ Google AI Studio ค่ารันบอทจึงเป็น 0 บาท ส่วนตอน สร้างและปรับแต่ง ใช้ AI แชทแบบฟรีได้ทั้งหมด (Gemini, ChatGPT, Claude ฯลฯ) ทั้งสร้างและรันจึง ไม่มีค่าใช้จ่าย

ร้านตัวอย่าง: ครัวมะลิ

ทั้งคู่มือใช้ ร้านสมมติ ชื่อ "ครัวมะลิ" ทำตามด้วยข้อมูลร้านตัวอย่างไปก่อนได้ พอบอทผ่านชุดทดสอบแล้ว ค่อยเปลี่ยนเป็นข้อมูลร้านจริง

Google Sheet มี 4 แท็บหลัก (ชื่อแท็บเหมือนกันทั้งสองเส้นทาง):

แท็บเก็บอะไร
Personaบอทพูดยังไง: ชื่อร้าน, บอทเรียกตัวเองว่าอะไร, ค่ะ/ครับ, สไตล์, อีโมจิ, ข้อความตอนไม่รู้คำตอบ, ช่องทางติดต่อคนจริง, เรื่องที่ห้ามคุย
FAQtopic / answer
Menuชื่อเมนู, ราคา, ความเผ็ด, ส่วนผสมที่ควรระวังเรื่องแพ้อาหาร
Testคำถามลูกค้า, บอทควรทำอะไร, คำตอบของบอท, ผ่าน/ไม่ผ่าน

เส้นทาง Template มีแท็บ Settings เพิ่มอีกแท็บ สำหรับวางคีย์

Persona ของร้านตัวอย่าง

ช่องตัวอย่าง
ชื่อร้านครัวมะลิ
บอทเรียกตัวเองว่าน้องมะลิ
ลงท้ายค่ะ
สไตล์เป็นกันเอง สุภาพ ตอบสั้น
อีโมจิใช้นิดหน่อย ไม่เกิน 1 ตัวต่อข้อความ
ข้อความตอนไม่รู้คำตอบขอโทษค่ะ เรื่องนี้น้องมะลิยังไม่มีข้อมูล เดี๋ยวให้พี่ที่ร้านตอบนะคะ 🙏
ติดต่อคนจริงโทร 0X-XXX-XXXX (เบอร์สมมติ)
ห้ามคุยการเมือง, ศาสนา, วิจารณ์ร้านอื่น

ชุดทดสอบ (แท็บ Test)

นี่คือ เส้นชัย ของทั้งสองเส้นทาง บอทต้องทำได้ตามคอลัมน์ขวาทุกข้อ

#ลูกค้าถามบอทควรทำ
1ร้านเปิดกี่โมงคะตอบเวลาตาม FAQ
2ข้าวผัดกุ้งราคาเท่าไหร่ตอบราคาตาม Menu
3วันพุธเปิดไหมตอบตาม FAQ (ร้านหยุดวันพุธ)
4มีโปรโมชันอะไรไหมไม่มีข้อมูลใน Sheet → ใช้ข้อความตอนไม่รู้คำตอบ ห้ามแต่งโปรขึ้นมาเอง
5มีเมนูมังสวิรัติไหมตอบจาก Menu เท่านั้น ถ้าไม่แน่ใจให้ถามร้าน ห้ามเดา
6จองโต๊ะ 4 คน พรุ่งนี้ทุ่มนึงได้ไหมไม่ยืนยันการจองเอง ให้ติดต่อร้านตามช่องทางใน Persona
7แพ้กุ้ง กินต้มยำได้ไหมบอกว่าเมนูนี้มีกุ้ง แนะนำให้แจ้งร้านโดยตรง ห้ามรับประกันว่าปลอดภัย
8อาหารวันนี้เค็มมาก ไม่ประทับใจเลยขอโทษ + ส่งต่อคนจริงพร้อมช่องทางติดต่อ
9คิดยังไงกับการเมืองตอนนี้ปฏิเสธอย่างสุภาพ (อยู่ในเรื่องที่ห้ามคุย)
10สั่งกลับบ้านได้ไหมตอบช่องทางตาม FAQ แบบสั้นๆ

ขั้นตอนร่วม (ทำทั้งสองเส้นทาง)

ภาพหน้าจอเป็นเมนูภาษาอังกฤษ

ทุกภาพและชื่อปุ่มในคู่มือนี้ใช้เมนูภาษาอังกฤษ (ยกเว้นฟอร์มสร้างบัญชี LINE OA ซึ่งขึ้นเป็นภาษาไทยเสมอ) ถ้าหน้าจอของคุณเป็นภาษาไทย เปลี่ยนเป็น English จะทำตามง่ายที่สุด: หน้า LINE มีปุ่มเลือกภาษาด้านบนหรือล่างสุดของหน้า ส่วน Google เปลี่ยนได้ที่ myaccount.google.com → Personal info → Language [VERIFY: ตำแหน่งปุ่มเลือกภาษาของ LINE]

STEP 01ทุกเส้นทาง▶ —:—

สร้าง LINE Official Account

เป้าหมาย — มีบัญชี LINE OA สำหรับร้าน ใช้ชื่อร้านตัวอย่างไปก่อนก็ได้

  1. เปิด LINE Official Account Manager ↗ แล้วล็อกอินด้วยบัญชี LINE ส่วนตัว
  2. หน้า Accounts เมนูซ้าย กด Create new — ฟอร์มจะเปิดในแท็บใหม่ และ เป็นภาษาไทย (ปกติ ไม่ต้องเปลี่ยนภาษา)
  3. กรอกข้อมูล:
    • ชื่อบัญชี: ครัวมะลิ
    • อีเมล: อีเมลของคุณ
    • ประเภทธุรกิจ: ร้านอาหารและเครื่องดื่ม → อาหารไทย
  4. กด ตกลง → ตรวจสอบข้อมูล แล้วกดยืนยันจนจบ [VERIFY: ชื่อปุ่มในหน้าตรวจสอบข้อมูล]
ฟอร์มสร้าง LINE ออฟฟิเชียลแอคเคาท์ (ภาษาไทย) ช่องชื่อบัญชีและอีเมล
ฟอร์มสร้าง LINE ออฟฟิเชียลแอคเคาท์ (ภาษาไทย) ช่องชื่อบัญชีและอีเมล — กรอบดำคือจุดที่ต้องกด
✅ คุณควรเห็น

เข้ามาที่หน้า Home ของบัญชี มุมซ้ายบนมีชื่อ ครัวมะลิ

❌ เจอปัญหา? กดดูวิธีแก้
ระบบให้ยืนยันเบอร์โทร แต่ SMS ไม่มา

รอ 1–2 นาทีแล้วกดส่งใหม่ เช็คว่าเลือกรหัสประเทศเป็น +66 และตัด 0 ตัวหน้าออก

สร้างเสร็จแล้วแต่หาบัญชีไม่เจอ

เปิด LINE Official Account Manager ใหม่ จะเห็นรายการบัญชีทั้งหมดที่คุณมี กดชื่อร้านเพื่อเข้าไป

STEP 02ทุกเส้นทาง▶ —:—

เปิดใช้ Messaging API

เป้าหมาย — ให้บัญชี LINE OA ส่งข้อความเข้าระบบภายนอกได้ บอทจะรับข้อความผ่านช่องทางนี้

  1. ในหน้า LINE OA Manager กด Settings มุมขวาบน
  2. เมนูซ้าย เลือก Messaging API
  3. กด Enable Messaging API
  4. ระบบให้เลือก Provider: เลือก Create a new provider แล้วตั้งชื่อเป็นชื่อคุณหรือชื่อธุรกิจ [VERIFY: ลำดับหน้าจอเลือก provider]
  5. ช่อง Privacy policy และ Terms of use เว้นว่างได้ → กด OK
หน้า Messaging API หลังเปิดใช้ Status Enabled มี Channel ID, Channel secret และช่อง Webhook URL
หลังกด Enable — Status เป็น Enabled
✅ คุณควรเห็น

Status เปลี่ยนเป็น Enabled และมี Channel ID, Channel secret กับช่อง Webhook URL โผล่ขึ้นมา (ช่อง Webhook URL ยังไม่ต้องกรอก เราจะตั้งค่าใน LINE Developers Console ทีหลัง)

❌ เจอปัญหา? กดดูวิธีแก้
ไม่แน่ใจว่าจะตั้งชื่อ Provider ว่าอะไร

ตั้งเป็นชื่อตัวเองหรือชื่อธุรกิจได้เลย ชื่อนี้ไม่แสดงให้ลูกค้าเห็น แต่เปลี่ยนทีหลังยาก

ไม่เห็นเมนู Messaging API ในหน้า Settings

เช็คว่าบัญชี LINE ที่ล็อกอินเป็น Admin ของ OA นี้ (คนสร้างบัญชีเป็น Admin อยู่แล้ว)

STEP 03ทุกเส้นทาง▶ —:—

เอา Channel access token

เป้าหมาย — ได้กุญแจที่ให้บอทส่งข้อความตอบกลับในนามร้าน

  1. เปิด LINE Developers Console ↗ แล้วล็อกอินด้วยบัญชี LINE เดิม
  2. กดชื่อ Provider ที่สร้างในขั้นที่แล้ว → กด channel ชื่อ ครัวมะลิ
  3. เปิดแท็บ Messaging API แล้วเลื่อนลงล่างสุด
  4. หัวข้อ Channel access token (long-lived) → กด Issue
  5. กดไอคอน copy แล้ววางเก็บไว้ในโน้ตชั่วคราว (ต้องใช้ในขั้นถัดๆ ไป)
LINE Developers Console แท็บ Messaging API ส่วน Channel access token (long-lived) ที่ด้านล่างสุด
LINE Developers Console แท็บ Messaging API ส่วน Channel access token (long-lived) ที่ด้านล่างสุด — กรอบดำคือจุดที่ต้องกด
สำคัญ

token นี้เหมือนกุญแจร้าน ใครได้ไปก็ส่งข้อความในนามร้านได้ ห้ามโพสต์หรือส่งให้ใคร รวมถึงห้ามแคปหน้าจอที่เห็น token ไปถามคนอื่น

✅ คุณควรเห็น

ได้ข้อความยาวมาก (ราวๆ 170 ตัวอักษร) ขึ้นต้นด้วยตัวอักษรผสมตัวเลข ลงท้ายมักเป็น =

❌ เจอปัญหา? กดดูวิธีแก้
copy ได้ข้อความสั้นๆ แค่ 32 ตัว

นั่นคือ Channel secret ไม่ใช่ token กลับไปเลื่อนลงล่างสุดของแท็บ Messaging API แล้ว copy จากช่อง Channel access token

เผลอแชร์ token ไปแล้ว

กด Reissue ที่ช่องเดิม token เก่าจะใช้ไม่ได้ทันที แล้วเอาตัวใหม่ไปใช้แทน

STEP 04ทุกเส้นทาง▶ —:—

เอา AI API key (ฟรี)

เป้าหมาย — ได้คีย์ AI ที่บอทใช้คิดคำตอบ ใช้ free tier จึงไม่มีค่าใช้จ่าย

  1. เปิด Google AI Studio ↗ แล้วล็อกอินด้วยบัญชี Google
  2. ถ้าเป็นครั้งแรก กดยอมรับข้อตกลงการใช้งาน
  3. กด Create API key — ระบบเลือก project ให้อัตโนมัติ (Default) กดสร้างได้เลย
  4. หน้าต่าง API key details เปิดขึ้นมา → กด Copy key แล้ววางเก็บไว้ในโน้ตเดียวกับ token
Google AI Studio หน้าต่าง API key details ปุ่ม Copy key
Google AI Studio หน้าต่าง API key details ปุ่ม Copy key — กรอบดำคือจุดที่ต้องกด
free tier

AI แบบฟรีมีโควต้าต่อนาทีและต่อวัน ร้านเล็กใช้ได้สบาย และแบบฟรี Google อาจนำข้อความไปใช้ปรับปรุงบริการ จึงไม่ควรให้บอทรับข้อมูลส่วนตัวสำคัญของลูกค้า เช่น เลขบัตร

✅ คุณควรเห็น

ได้คีย์ยาวๆ ขึ้นต้นด้วย AQ. (คีย์แบบเก่าขึ้นต้นด้วย AIza ใช้ได้เหมือนกัน) ตอนนี้ในโน้ตของคุณมี 2 อย่าง: LINE token กับ AI key

❌ เจอปัญหา? กดดูวิธีแก้
กดแล้วขึ้นว่าต้องสร้าง Google Cloud project ก่อน

เลือก Create API key in new project ได้เลย ระบบสร้าง project ให้อัตโนมัติ ไม่ต้องผูกบัตร

บัญชี Google ของที่ทำงาน/โรงเรียนเข้าไม่ได้

บางองค์กรปิด AI Studio ไว้ ให้ใช้บัญชี Gmail ส่วนตัวแทน

ขั้นตอนร่วมจบแล้ว — ต่อจากนี้แยกตามเส้นทางที่เลือก

↑ เลือกเส้นทางก่อน

เส้นทาง: ใช้ Template

ได้บอทที่ผ่านการทดสอบแล้วจาก Sheet สำเร็จรูป แล้วใช้ AI ช่วยกรอกข้อมูลร้าน

STEP 05ใช้ Template▶ —:—

ทำสำเนา Template

เป้าหมาย — ได้ Google Sheet ของตัวเองที่มีโค้ดบอทติดมาครบ

  1. กดปุ่มนี้ (ล็อกอิน Google ไว้ก่อน)

    ทำสำเนา Template (ลิงก์เร็วๆ นี้)
  2. หน้า Copy document → กด Make a copy

  3. ไฟล์ใหม่เปิดขึ้นมา ตั้งชื่อเป็น บอท ครัวมะลิ (กดชื่อไฟล์มุมซ้ายบนเพื่อแก้)

SCREENSHOT SLOTหน้า Copy document? ของ Google Sheets ปุ่ม Make a copyไฮไลต์ “กดตรงนี้” ที่ x 42% · y 55% · 16×8%public/images/guides/line-oa-bot/05-make-a-copy.png
หน้า Copy document? ของ Google Sheets ปุ่ม Make a copy — กรอบดำคือจุดที่ต้องกด
✅ คุณควรเห็น

ด้านล่างมีแท็บ Persona, FAQ, Menu, Test, Settings และแถบเมนูด้านบนมีเมนู 🤖 บอทร้าน (อาจขึ้นช้าประมาณ 10 วินาที) [VERIFY: ชื่อเมนูใน template]

❌ เจอปัญหา? กดดูวิธีแก้
ไม่เห็นปุ่ม Make a copy

ยังไม่ได้ล็อกอิน Google หรือใช้บัญชีองค์กรที่บล็อกการทำสำเนา ลองล็อกอินด้วย Gmail ส่วนตัว

ไม่เห็นเมนู 🤖 บอทร้าน

รอสักครู่แล้วกด refresh หน้า Sheet เมนูจะโผล่หลังโค้ดโหลดเสร็จ

STEP 06ใช้ Template▶ —:—

วางคีย์ในแท็บ Settings

เป้าหมาย — บอกบอทว่าใช้ LINE OA บัญชีไหน และใช้ AI key ไหน

  1. เปิดแท็บ Settings
  2. ช่องข้างๆ LINE_CHANNEL_ACCESS_TOKEN → วาง LINE token (ขั้นที่ 3)
  3. ช่องข้างๆ AI_API_KEY → วาง AI key (ขั้นที่ 4)

วางด้วย Ctrl+Shift+V (Mac: Cmd+Shift+V) เพื่อไม่ให้ติดฟอร์แมตหรือช่องว่างแปลกๆ มาด้วย

SCREENSHOT SLOTแท็บ Settings ช่องวาง LINE token และ AI keyไฮไลต์ “วางคีย์ตรงนี้” ที่ x 30% · y 18% · 50×12%public/images/guides/line-oa-bot/06-settings-tab.png
แท็บ Settings ช่องวาง LINE token และ AI key — กรอบดำคือจุดที่ต้องกด
ห้ามแชร์ Sheet นี้

ตอนนี้ Sheet มีคีย์ของร้านอยู่ อย่ากด Share ให้ใคร ถ้าอยากให้คนอื่นช่วยดู ให้ทำสำเนาอีกไฟล์ แล้วลบคีย์ในแท็บ Settings ของไฟล์สำเนาออกก่อน

✅ คุณควรเห็น

ทั้งสองช่องมีค่า ไม่มีช่องว่างหน้าหรือท้าย (ดับเบิลคลิกที่ช่องเพื่อเช็ค)

❌ เจอปัญหา? กดดูวิธีแก้
วางแล้วข้อความตกไปช่องอื่น หรือแตกเป็นหลายบรรทัด

ลบแล้ววางใหม่ โดยคลิกเลือกช่องให้ถูกก่อน แล้วใช้ Ctrl+Shift+V

STEP 07ใช้ Template▶ —:—

กรอก Persona

เป้าหมาย — กำหนดว่าบอทพูดยังไง เรียกตัวเองว่าอะไร และส่งต่อคนจริงทางไหน

  1. เปิดแท็บ Persona
  2. Template มีค่าของร้านตัวอย่างใส่ไว้แล้ว (ตรงกับตาราง Persona ด้านบน) ใช้ค่านี้ไปก่อน จนบอทผ่านชุดทดสอบ
  3. แก้แค่ช่อง ติดต่อคนจริง เป็นเบอร์หรือ LINE ของคุณ จะได้ลองว่าบอทส่งต่อถูก
✅ คุณควรเห็น

ทุกแถวในคอลัมน์ค่ามีข้อมูล ไม่มีช่องว่าง

❌ เจอปัญหา? กดดูวิธีแก้
ไม่รู้ว่าสไตล์ควรเขียนยังไง

เขียนเหมือนบอกพนักงานใหม่ เช่น "เป็นกันเอง สุภาพ ตอบสั้น ไม่ใช้ศัพท์วัยรุ่น" สั้นๆ แบบนี้พอ

STEP 08ใช้ Template▶ —:—

กรอก FAQ ด้วย AI

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

  1. เปิด AI แชทที่คุณใช้ แบบฟรีก็ได้ (เช่น Gemini, ChatGPT, Claude) → เริ่มแชทใหม่
  2. copy prompt ด้านล่าง แก้ส่วนที่ไฮไลต์ แล้วส่ง
PROMPT → AI · เขียน FAQ
ช่วยเขียน FAQ สำหรับบอท LINE ของร้านอาหาร เพื่อนำไปวางใน Google Sheet

ข้อมูลร้าน:
- ชื่อร้าน: [[ครัวมะลิ]]
- เวลาเปิด-ปิด: [[ทุกวัน 10:00–20:00 หยุดวันพุธ]]
- ที่ตั้ง / การเดินทาง: [[ใส่ที่อยู่ร้าน]]
- ที่จอดรถ: [[จอดหน้าร้านได้ 3 คัน]]
- สั่งกลับบ้าน / เดลิเวอรี: [[มีใน LINE MAN และ Grab]]
- การจองโต๊ะ: [[รับจองทางโทรศัพท์ ร้านเป็นคนยืนยัน]]
- การชำระเงิน: [[เงินสด และพร้อมเพย์]]
- อื่นๆ ที่ลูกค้าถามบ่อย: [[ใส่เพิ่มได้ หรือลบบรรทัดนี้]]

กติกา:
- ใช้เฉพาะข้อมูลข้างบน ห้ามเติมข้อมูลที่ไม่ได้ให้ไว้ เช่น ราคา โปรโมชัน หรือเวลาเปิด-ปิด
- หัวข้อไหนไม่มีข้อมูล ให้ข้ามไป ห้ามเดา
- คำตอบสั้น 1–2 ประโยค เหมาะกับแชท LINE
- ส่งกลับเป็น code block แบบ TSV (คั่นด้วย tab) 2 คอลัมน์: topic และ answer ไม่ต้องมีแถวหัวตาราง
✎ แก้ 8 จุดที่ไฮไลต์ [[ … ]] ให้เป็นข้อมูลของคุณก่อนส่ง
  1. กด copy ที่มุม code block ในคำตอบของ AI
  2. กลับไปที่แท็บ FAQ → คลิกช่อง A2 → วาง
SCREENSHOT SLOTแท็บ FAQ หลังวางข้อมูลจาก AI คอลัมน์ topic และ answerpublic/images/guides/line-oa-bot/07-faq-pasted.png
✅ คุณควรเห็น

แต่ละแถวมี topic อยู่คอลัมน์ A และ answer อยู่คอลัมน์ B อ่านทุกแถวอีกรอบ ข้อมูลต้องตรงกับร้านจริง

❌ เจอปัญหา? กดดูวิธีแก้
วางแล้วทุกอย่างไปกองอยู่คอลัมน์ A

เลือกคอลัมน์ A → เมนู Data → Split text to columns → Separator เลือก Tab หรือบอก AI ว่า "ส่งใหม่เป็น TSV คั่นด้วย tab จริงๆ"

AI ใส่ข้อมูลที่ไม่ได้ให้ไว้

ลบแถวนั้นออกจาก Sheet ได้เลย บอทจะตอบจากสิ่งที่อยู่ใน Sheet เท่านั้น ข้อมูลผิดใน Sheet = บอทตอบผิด

STEP 09ใช้ Template▶ —:—

กรอก Menu จากรูปเมนูด้วย AI

เป้าหมาย — แปลงรูปเมนูเป็นตาราง เมนู / ราคา / ความเผ็ด / ส่วนผสมที่ควรระวัง

  1. ถ่ายรูปเมนูร้านให้ชัด เห็นราคาครบ (หรือใช้ รูปเมนูร้านตัวอย่าง (ลิงก์เร็วๆ นี้))
  2. ใน AI แชท เริ่มแชทใหม่ → แนบรูป → copy prompt นี้ไปส่ง
PROMPT → AI · แปลงรูปเมนู
นี่คือรูปเมนูร้านอาหาร ช่วยแปลงเป็นตารางสำหรับวางลง Google Sheet

คอลัมน์ (เรียงตามนี้):
ชื่อเมนู | ราคา (ตัวเลขอย่างเดียว) | ความเผ็ด (ไม่เผ็ด / เผ็ดน้อย / เผ็ดกลาง / เผ็ดมาก) | ส่วนผสมที่ควรระวังเรื่องแพ้อาหาร

กติกา:
- ชื่อเมนูและราคา อ่านจากรูปเท่านั้น ตัวไหนอ่านไม่ชัดให้ใส่ ??? ห้ามเดา
- ความเผ็ดและส่วนผสม ถ้าไม่มีในรูป ให้ใส่ตามสูตรทั่วไปของเมนูนั้น แล้วต่อท้ายว่า (ตรวจสอบ)
- ส่วนผสมที่ควรระวัง เช่น กุ้ง/อาหารทะเล, ถั่วลิสง, นม, ไข่, ถั่วเหลือง, แป้งสาลี, ซอสหอยนางรม
- ส่งกลับเป็น code block แบบ TSV (คั่นด้วย tab) ไม่ต้องมีแถวหัวตาราง
  1. copy ผลลัพธ์ → แท็บ Menu → คลิกช่อง A2 → วาง
  2. ไล่เช็คทุกแถวที่มี ??? หรือ (ตรวจสอบ) แก้ให้ตรงกับของจริงในครัว แล้วลบคำว่า (ตรวจสอบ) ออก
เรื่องแพ้อาหาร

ส่วนผสมที่ AI เติมให้เป็นแค่ สูตรทั่วไป ไม่ใช่สูตรร้านคุณ ต้องให้คนในครัวเช็คก่อนเปิดบอทจริงทุกครั้ง บอทจะบอกลูกค้าตามข้อมูลนี้

✅ คุณควรเห็น

ทุกแถวมีราคาเป็นตัวเลข ไม่มี ??? หรือ (ตรวจสอบ) เหลืออยู่

❌ เจอปัญหา? กดดูวิธีแก้
AI อ่านชื่อเมนูหรือราคาผิด

ถ่ายรูปใหม่ให้ตรงและสว่างขึ้น ถ้าเมนูหลายหน้า ส่งทีละหน้า หรือพิมพ์แก้ใน Sheet เองเลย

ราคามีคำว่า บาท หรือ ฿ ติดมา

ใช้ Edit → Find and replace แทนที่ "บาท" และ "฿" ด้วยค่าว่าง

STEP 10ใช้ Template▶ —:—

รันชุดทดสอบใน Sheet

เป้าหมาย — เช็คว่าบอทตอบถูกทุกข้อ ก่อนเชื่อมกับ LINE จริง

  1. เปิดแท็บ Test มีคำถามชุดทดสอบใส่ไว้แล้ว (ตรงกับตารางด้านบน)
  2. เมนู 🤖 บอทร้าน → รันชุดทดสอบ [VERIFY: ชื่อเมนู]
  3. ครั้งแรก Google จะขอสิทธิ์: Continue → เลือกบัญชี → Advanced → Go to … (unsafe) → Allow
  4. เมนูนี้จะทำงานต่อเอง (ถ้าไม่ทำงาน ให้กดซ้ำอีกครั้ง) รอประมาณ 1 นาที คำตอบของบอทจะโผล่ในคอลัมน์ คำตอบบอท
  5. อ่านทีละข้อ เทียบกับคอลัมน์ บอทควรทำ แล้วติ๊ก ผ่าน [VERIFY: template ตัดสินผ่าน/ไม่ผ่านเอง หรือให้คนติ๊ก]
SCREENSHOT SLOTแท็บ Test หลังรันชุดทดสอบ มีคำตอบบอทและช่องผ่าน/ไม่ผ่านpublic/images/guides/line-oa-bot/08-test-results.png
✅ คุณควรเห็น

ผ่านครบ 10 ข้อ โดยเฉพาะข้อ 4 (ไม่แต่งโปร), 6 (ไม่ยืนยันการจอง) และ 7 (แพ้อาหาร)

❌ เจอปัญหา? กดดูวิธีแก้
ขึ้นว่า Google hasn't verified this app

ปกติ เพราะเป็นสคริปต์ในไฟล์ของคุณเอง กด Advanced → Go to … (unsafe) ได้เลย

คำตอบขึ้นว่า API key not valid

กลับไปแท็บ Settings วาง AI key ใหม่ เช็คว่าขึ้นต้นด้วย AQ. (หรือ AIza) และไม่มีช่องว่าง

ขึ้น 429 / quota exceeded

ชนโควต้าฟรีต่อนาที รอ 1 นาทีแล้วรันใหม่

บางข้อไม่ผ่าน เช่น บอทตอบข้อมูลผิด

แก้ที่ ข้อมูล ก่อน (FAQ / Menu / Persona) ไม่ต้องแตะโค้ด เช่น บอทตอบเวลาผิด = แถวเวลาเปิด-ปิดใน FAQ ผิด แก้แล้วรันชุดทดสอบใหม่

STEP 11ใช้ Template▶ —:—

Deploy เป็น Web app

เป้าหมาย — ได้ URL ที่ LINE ใช้ส่งข้อความลูกค้ามาให้บอท

  1. เมนู Extensions → Apps Script
  2. มุมขวาบน กด Deploy → New deployment
  3. กดรูปเฟือง ⚙ ข้าง Select type → เลือก Web app
  4. ตั้งค่า:
    • Execute as: Me
    • Who has access: Anyone
  5. กด Deploy → ถ้าขอสิทธิ์ ให้ทำแบบขั้นที่แล้ว
  6. copy Web app URL
Who has access — ต้องเลือกอันนี้
Anyone
SCREENSHOT SLOTหน้าต่าง New deployment ตั้งค่า Web app, Execute as Me, Who has access Anyoneไฮไลต์ “เลือก Anyone” ที่ x 52% · y 62% · 30×8%public/images/guides/line-oa-bot/09-deploy-web-app.png
หน้าต่าง New deployment ตั้งค่า Web app, Execute as Me, Who has access Anyone — กรอบดำคือจุดที่ต้องกด
✅ คุณควรเห็น

ได้ URL หน้าตาแบบ https://script.google.com/macros/s/…/exec (ลงท้ายด้วย /exec)

❌ เจอปัญหา? กดดูวิธีแก้
เลือก Anyone with Google account ไป

สองตัวเลือกนี้หน้าตาคล้ายกันมาก แต่ถ้าเลือกตัวนี้ บอทจะเงียบ ไปที่ Deploy → Manage deployments → ✎ แก้เป็น Anyone → Deploy

copy ได้ Deployment ID (ตัวอักษรยาวๆ ไม่มี https)

ต้องใช้ช่อง Web app URL ที่ขึ้นต้นด้วย https และลงท้ายด้วย /exec

STEP 12ใช้ Template▶ —:—

ตั้ง Webhook ใน LINE

เป้าหมาย — บอก LINE ว่าเมื่อมีลูกค้าทัก ให้ส่งข้อความไปที่บอทของเรา

  1. เปิด LINE Developers Console ↗ → channel ของร้าน → แท็บ Messaging API
  2. หัวข้อ Webhook settings → ช่อง Webhook URL → กด Edit
  3. วาง URL ที่ลงท้ายด้วย /exec → กด Update
  4. กด Verify
  5. เปิดสวิตช์ Use webhook
SCREENSHOT SLOTLINE Developers Console ช่อง Webhook URL ปุ่ม Verify และสวิตช์ Use webhookไฮไลต์ “กดตรงนี้” ที่ x 20% · y 40% · 60×10%public/images/guides/line-oa-bot/10-webhook.png
LINE Developers Console ช่อง Webhook URL ปุ่ม Verify และสวิตช์ Use webhook — กรอบดำคือจุดที่ต้องกด
✅ คุณควรเห็น

กด Verify แล้วขึ้น Success และสวิตช์ Use webhook เป็นสีเขียว

❌ เจอปัญหา? กดดูวิธีแก้
Verify ขึ้น error เรื่อง redirect หรือ 302

เป็นนิสัยของปุ่ม Verify กับ Apps Script [VERIFY: ยังเกิดอยู่ไหม] ถ้าตั้งค่าอื่นถูกหมด ให้ข้ามไปทดสอบจากมือถือ (ขั้นสุดท้าย) ก่อนสรุปว่าพัง

ลืมเปิด Use webhook

บอทจะไม่ได้รับข้อความเลย กลับมาเปิดสวิตช์นี้

STEP 13ใช้ Template▶ —:—

ปิดข้อความตอบกลับอัตโนมัติของ LINE

เป้าหมาย — ไม่ให้ข้อความอัตโนมัติของ LINE ตอบซ้อนกับบอท

  1. กลับไปที่ LINE OA Manager ↗ → Settings
  2. เมนูซ้าย Response settings [VERIFY: LINE เปลี่ยนชื่อและตำแหน่งเมนูนี้บ่อย]
  3. ตั้งค่า:
    • Auto-response messages: ปิด
    • Webhooks: เปิด
    • Greeting message: เปิดไว้ได้ (ข้อความต้อนรับตอนแอดเพื่อน)
SCREENSHOT SLOTLINE OA Manager หน้า Response settings ปิด Auto-response เปิด Webhookspublic/images/guides/line-oa-bot/11-response-settings.png
✅ คุณควรเห็น

Auto-response ปิด และ Webhooks เปิด — เช็คซ้ำได้ใน LINE Developers Console → แท็บ Messaging API: บรรทัด Auto-reply messages ต้องเป็น Disabled

❌ เจอปัญหา? กดดูวิธีแก้
ลูกค้าได้ข้อความ ขอบคุณที่ส่งข้อความถึงเรา ซ้อนกับคำตอบบอท

Auto-response ยังเปิดอยู่ กลับมาปิดในหน้านี้

STEP 14ใช้ Template▶ —:—

ทดสอบจากมือถือ

เป้าหมาย — คุยกับบอทจริงๆ แบบที่ลูกค้าจะเห็น

  1. LINE Developers Console → แท็บ Messaging API → สแกน QR code ด้วยมือถือ → แอดเพื่อน
  2. ส่งข้อความเหล่านี้ทีละข้อความ:
    • ร้านเปิดกี่โมงคะ
    • มีโปรอะไรไหม
    • แพ้กุ้ง กินต้มยำได้ไหม
SCREENSHOT SLOTแชท LINE บนมือถือ บอทน้องมะลิตอบคำถามลูกค้าpublic/images/guides/line-oa-bot/12-phone-chat.png
✅ คุณควรเห็น

บอทตอบภายในไม่กี่วินาที ลงท้าย "ค่ะ" เรียกตัวเองว่าน้องมะลิ ไม่แต่งโปรโมชัน และเตือนเรื่องกุ้งในต้มยำ

❌ เจอปัญหา? กดดูวิธีแก้
บอทเงียบ ไม่ตอบอะไรเลย

ไล่เช็คตามลำดับ: (1) Who has access เป็น Anyone (2) Use webhook เปิด (3) Auto-response ปิด (4) token ในแท็บ Settings ถูกตัว ดู error ได้ที่ Apps Script → เมนูซ้าย Executions

ข้อความแรกตอบช้า

ปกติ ครั้งแรกสคริปต์ต้องตื่นก่อน 3–5 วินาที ข้อความต่อไปจะเร็วขึ้น

บอทตอบว่าระบบขัดข้อง

ส่วนใหญ่เป็น AI key ผิดหรือชนโควต้า รันชุดทดสอบใน Sheet ดูอีกครั้ง จะเห็น error ชัดกว่า

เส้นทาง: สร้างเองด้วย AI ฟรี

ให้ AI แชทแบบฟรีเขียนโค้ดบอททั้งตัว ทีละ milestone ใช้ตัวไหนก็ได้ เช่น Gemini, ChatGPT, Claude (ในวิดีโอใช้ Gemini) โค้ดที่ได้อาจไม่เหมือนของ Template ไม่เป็นไร เพราะเราเช็คแต่ละ milestone จาก พฤติกรรมของบอท ไม่ใช่หน้าตาโค้ด

กติกา 3 ข้อ สำหรับ AI ฟรี

AI แบบฟรีจำกัดจำนวนข้อความต่อวัน และจำแชทยาวๆ ได้ไม่ค่อยดี เส้นทางนี้เลยออกแบบมาแบบนี้:

  1. คุยต่อในแชทเดิมได้เลย — M1 เริ่มด้วย prompt ฉบับเต็ม จากนั้น M2–M4 ส่งแค่ prompt สั้นๆ ต่อในแชทเดิม ถ้าแชทยาวจน AI เริ่มลืม หรือโควต้าหมด ทุก milestone มี prompt ฉบับเต็ม ไว้เปิดแชทใหม่ ความคืบหน้าอยู่ในไฟล์ Code.gs ย้ายแชทหรือเปลี่ยน AI ได้ตลอด
  2. ขอโค้ด "ทั้งไฟล์" เสมอ — วางทับ Code.gs ทั้งไฟล์ทุกครั้ง ไม่ต้องหาว่าจะแทรกตรงไหน
  3. ทดสอบใน Apps Script ก่อน — ฟังก์ชัน testBot แสดงคำตอบของบอททันที ไม่ต้อง deploy ไม่ต้องหยิบมือถือ ประหยัดข้อความกับ AI
โควต้าหมดกลางทาง?

ไม่ต้องเริ่มใหม่ พรุ่งนี้มาต่อ หรือเปิด AI ตัวอื่นแล้วใช้ prompt ฉบับเต็ม ของ milestone ที่ทำอยู่ได้เลย และถ้าติดจนไปต่อไม่ได้ ทุก milestone มี โค้ดสำรอง ให้วางแล้วไปต่อ ยังนับว่าถึงเส้นชัย

STEP 05สร้างเองด้วย AI ฟรี▶ —:—

ทำสำเนา Sheet ข้อมูล (ไม่มีโค้ด)

เป้าหมาย — ได้ Sheet ที่มีแท็บและข้อมูลร้านตัวอย่างครบ พร้อมให้บอทที่คุณสร้างมาอ่าน

  1. กดปุ่มนี้ (ล็อกอิน Google ไว้ก่อน)

    ทำสำเนา Sheet ข้อมูล ↗
  2. หน้า Copy document → กด Make a copy

  3. ตั้งชื่อไฟล์ บอท ครัวมะลิ (build)

หน้า Copy document ของ Google Sheets ถามว่าจะทำสำเนา Baan Mali ไหม พร้อมปุ่ม Make a copy
หน้า Copy document ของ Google Sheets ถามว่าจะทำสำเนา Baan Mali ไหม พร้อมปุ่ม Make a copy — กรอบดำคือจุดที่ต้องกด
Google Sheet ข้อมูลร้านครัวมะลิ แท็บ FAQ คอลัมน์ topic และ answer และแท็บ Persona, FAQ, Menu, Test ด้านล่าง
Google Sheet ข้อมูลร้านครัวมะลิ แท็บ FAQ คอลัมน์ topic และ answer และแท็บ Persona, FAQ, Menu, Test ด้านล่าง — กรอบดำคือจุดที่ต้องกด
✅ คุณควรเห็น

มีแท็บ Persona, FAQ, Menu, Test พร้อมข้อมูลร้านตัวอย่าง แถวที่ 1 ของแต่ละแท็บเป็นชื่อคอลัมน์ภาษาอังกฤษ เช่น topic, answer — ห้ามแก้ชื่อพวกนี้ โค้ดอ่านข้อมูลจากชื่อคอลัมน์

❌ เจอปัญหา? กดดูวิธีแก้
ไม่เห็นปุ่ม Make a copy

ล็อกอิน Google ก่อน หรือใช้บัญชี Gmail ส่วนตัวแทนบัญชีองค์กร

STEP 06สร้างเองด้วย AI ฟรี▶ —:—

เปิด Apps Script และเก็บคีย์ไว้ในสคริปต์

เป้าหมาย — เตรียมที่วางโค้ด และเก็บคีย์ไว้ในที่ปลอดภัย — คีย์ไม่ต้องผ่านแชท AI เลย

  1. ใน Sheet เมนู Extensions → Apps Script
  2. กดชื่อโปรเจกต์มุมซ้ายบน (Untitled project) → ตั้งชื่อ บอท ครัวมะลิ → Rename
  3. เมนูซ้าย กด ⚙ Project Settings → เลื่อนลงล่างสุด → Add script property [VERIFY: ชื่อปุ่ม]
  4. เพิ่ม 2 แถว ชื่อ property ใช้ปุ่ม copy ด้านล่าง กันพิมพ์ผิด:
    • LINE_CHANNEL_ACCESS_TOKEN → Value: LINE token (ขั้นที่ 3)
    • AI_API_KEY → Value: AI key (ขั้นที่ 4)
  5. กด Save script properties
Property 1
LINE_CHANNEL_ACCESS_TOKEN
Property 2
AI_API_KEY
Apps Script หน้า Project Settings ส่วน Script Properties มี 2 แถว AI_API_KEY และ LINE_CHANNEL_ACCESS_TOKEN
Apps Script หน้า Project Settings ส่วน Script Properties มี 2 แถว AI_API_KEY และ LINE_CHANNEL_ACCESS_TOKEN — กรอบดำคือจุดที่ต้องกด
ทำไมไม่ใส่คีย์ในโค้ด

เดี๋ยวเราจะ copy โค้ดไปให้ AI อ่านหลายรอบ ถ้าคีย์อยู่ในโค้ด คีย์ก็จะหลุดไปอยู่ในแชทด้วย เก็บใน Script Properties แล้วโค้ดจะอ่านเองตอนทำงาน

✅ คุณควรเห็น

Script Properties มี 2 แถว ชื่อสะกดตรงตามด้านบนทุกตัวอักษร

❌ เจอปัญหา? กดดูวิธีแก้
หาเมนู Project Settings ไม่เจอ

เป็นไอคอนเฟือง ⚙ แถบซ้ายสุดของหน้า Apps Script (ใต้ไอคอนนาฬิกา Triggers)

STEP 07สร้างเองด้วย AI ฟรีM1▶ —:—

ขอโค้ดชุดแรกจาก AI

เป้าหมาย — ได้โค้ดที่รับข้อความจาก LINE แล้วตอบกลับ — ตอนนี้แค่ทวนข้อความ ยังไม่ฉลาด

  1. เปิด AI แชทที่คุณใช้ → แชทใหม่
  2. copy prompt นี้ไปส่งได้เลย (รอบแรกไม่มีส่วนต้องแก้)
PROMPT → AI · M1 — LINE ต่อติด
ช่วยเขียนโค้ด Google Apps Script สำหรับบอท LINE OA ของร้านอาหาร คนที่ขอยังเขียนโค้ดไม่เป็น และจะวางโค้ดที่ได้ทับไฟล์ Code.gs ทั้งไฟล์

กติกาการตอบ:
- ส่ง Code.gs กลับมาทั้งไฟล์ ใน code block เดียว ห้ามส่งแค่บางส่วน ห้ามเขียนว่า "โค้ดเดิม..."
- ใช้ชื่อฟังก์ชันตามโครงด้านล่างเท่านั้น
- ห้ามขอค่า token หรือ key ให้อ่านจาก Script Properties
- หลังโค้ด อธิบายสั้นๆ ไม่เกิน 5 บรรทัด ว่าต้องกดอะไรต่อใน Apps Script

โครงโค้ด (ชื่อฟังก์ชันตายตัว เขียนเฉพาะที่งานรอบนี้ต้องใช้):
- doPost(e): รับ event จาก LINE เรียก answer() แล้ว replyToLine() และต้อง return ContentService.createTextOutput('OK') เสมอ แม้เกิด error
- replyToLine(replyToken, text): ตอบกลับผ่าน LINE reply API
- readSheet(name): อ่านแท็บเป็น array ของ object ใช้แถวแรกเป็นชื่อคอลัมน์
- buildPrompt(question): รวมข้อมูลจาก Sheet และกติกาของบอท เป็นข้อความสั่ง AI
- callAI(prompt): เรียก Gemini API คืนข้อความคำตอบ (รวม text จากทุก part) ถ้าได้ HTTP 503 หรือ 429 ให้ลองใหม่ 1 ครั้งด้วย model สำรอง
- answer(question): คืนคำตอบของบอท ใช้ทั้งใน doPost และตอนทดสอบ
- testBot(): ทดสอบใน editor ด้วยคำถามตัวอย่าง แล้ว Logger.log คำตอบ

ข้อมูลเทคนิคล่าสุด (ใช้ตามนี้ ห้ามเปลี่ยน):
- LINE reply API: POST https://api.line.me/v2/bot/message/reply ใส่ header Authorization: Bearer ตามด้วย token
- reply token ใช้ได้ครั้งเดียวและหมดอายุเร็ว ให้ตอบทันที
- รับเฉพาะ event ที่เป็นข้อความตัวอักษร event อื่นให้ข้าม
- Gemini API: POST https://generativelanguage.googleapis.com/v1beta/models/ชื่อmodel:generateContent ส่ง key ใน header x-goog-api-key
- model หลัก: gemini-3.1-flash-lite · model สำรอง (ใช้เมื่อได้ 503 หรือ 429): gemini-3.5-flash ห้ามใช้ model อื่น
- Script Properties: LINE_CHANNEL_ACCESS_TOKEN และ AI_API_KEY
- สคริปต์ผูกกับ Sheet อยู่แล้ว ใช้ SpreadsheetApp.getActive()
- แท็บและชื่อคอลัมน์ (แถวที่ 1):
- Persona: field, value
- FAQ: topic, answer
- Menu: name, price, spice, allergens
- Test: question, expected, bot_answer, pass

งานรอบนี้ (M1 — LINE ต่อติด):
- เขียน doPost และ replyToLine ให้บอททวนข้อความที่ลูกค้าพิมพ์ เช่น ลูกค้าพิมพ์ "สวัสดี" บอทตอบ "ได้รับข้อความ: สวัสดี"
- ยังไม่ต้องอ่าน Sheet และยังไม่ต้องเรียก AI

โค้ดปัจจุบัน: ยังไม่มี (ไฟล์ Code.gs ว่าง)
  1. ในคำตอบของ AI กด copy ที่ code block
  2. กลับไป Apps Script → ไฟล์ Code.gs → Ctrl+A (Mac: Cmd+A) → วางทับ → กด 💾 Save (Ctrl+S)
✅ คุณควรเห็น

Save ได้ ไม่มีแถบ error สีแดง และในไฟล์มี function doPost กับ function replyToLine

❌ เจอปัญหา? กดดูวิธีแก้
Save แล้วขึ้น Syntax error

ส่วนใหญ่เพราะ copy มาไม่ครบ กด copy จากปุ่มของ code block อีกครั้ง แล้ววางทับทั้งไฟล์ใหม่

AI ส่งโค้ดมาหลายก้อน หรือเขียนว่า โค้ดเดิม...

พิมพ์ต่อในแชทเดิมว่า "ส่ง Code.gs ทั้งไฟล์ในก้อนเดียว ไม่ตัดส่วนไหนออก"

ไปต่อไม่ได้?
ใช้ โค้ดสำรองของ M1 ↗ ได้เลย — copy ทั้งไฟล์ไปวางทับ Code.gs แล้ว Save จากนั้นทำขั้นต่อไปตามปกติ ยังนับว่าผ่าน M1 เส้นชัยวัดจากพฤติกรรมของบอท ไม่ใช่ว่าใครเขียนโค้ด (ขั้นต่อไปให้ใช้ prompt ฉบับเต็มในแชทใหม่ เพราะแชทเดิมไม่รู้จักโค้ดนี้)
STEP 08สร้างเองด้วย AI ฟรีM1▶ —:—

Deploy และต่อเข้า LINE

เป้าหมาย — ส่งข้อความจากมือถือ แล้วบอททวนข้อความกลับมาได้จริง

  1. Apps Script มุมขวาบน Deploy → New deployment → กด ⚙ ข้าง Select type → Web app
  2. ตั้งค่า Execute as: Me · Who has access: Anyone → กด Deploy
  3. Google ขอสิทธิ์: Authorize access → เลือกบัญชี → Advanced → Go to … (unsafe) → Allow
  4. copy Web app URL (ลงท้ายด้วย /exec)
  5. เปิด LINE Developers Console ↗ → channel ของร้าน → แท็บ Messaging API → Webhook URL → Edit → วาง → Update → เปิด Use webhook
  6. เปิด LINE OA Manager ↗ → Settings → Response settings → Auto-response: ปิด · Webhooks: เปิด [VERIFY: ชื่อเมนู] (เช็คได้ใน LINE Developers Console แท็บ Messaging API: Auto-reply messages ต้องเป็น Disabled)
  7. มือถือ: สแกน QR code ในแท็บ Messaging API → แอดเพื่อน → พิมพ์ สวัสดี
Who has access — ต้องเลือกอันนี้
Anyone
✅ คุณควรเห็น

บอทตอบกลับว่า ได้รับข้อความ: สวัสดี (หรือทวนข้อความคล้ายๆ กัน) ผ่าน M1 แล้ว

❌ เจอปัญหา? กดดูวิธีแก้
บอทเงียบ ไม่ตอบอะไรเลย

Apps Script → เมนูซ้าย Executions ดูรายการล่าสุด

ถ้า ไม่มีรายการเลย แปลว่า LINE ยังส่งมาไม่ถึง: เช็ค Webhook URL, Use webhook และ Who has access ต้องเป็น Anyone (ไม่ใช่ Anyone with Google account)

ถ้า มีรายการสีแดง กดเข้าไป copy ข้อความ error แล้วส่งให้ AI ในแชทเดิมด้วย prompt นี้

PROMPT → AI · แก้ error · แชทเดิม
เจอ error นี้ใน Apps Script:
[[วางข้อความ error]]

ช่วยแก้ แล้วส่ง Code.gs กลับมาทั้งไฟล์ในก้อนเดียว ห้ามเปลี่ยนชื่อฟังก์ชัน URL และชื่อ model
✎ แก้ 1 จุดที่ไฮไลต์ [[ … ]] ให้เป็นข้อมูลของคุณก่อนส่ง
เปิดแชทใหม่แทน? ใช้ prompt ฉบับเต็ม

ใช้เมื่อ แชทเดิมยาวจน AI เริ่มลืมหรือตอบมั่ว · โควต้าหมดแล้วย้ายไป AI ตัวอื่น · เพิ่งวางโค้ดสำรอง

copy โค้ดทั้งไฟล์จาก Code.gs (Ctrl+A → Ctrl+C) แล้ววางแทนส่วนที่ไฮไลต์ ในแชทใหม่

PROMPT → AI · แก้ error · แชทใหม่
โค้ด Google Apps Script ของบอท LINE ด้านล่าง เกิด error นี้ (จาก Executions หรือ Execution log):
[[วางข้อความ error]]

ช่วยแก้ แล้วส่ง Code.gs กลับมาทั้งไฟล์ใน code block เดียว ห้ามเปลี่ยนชื่อฟังก์ชัน ห้ามเปลี่ยน URL ของ API
ถ้า error เกี่ยวกับ Gemini ให้ใช้ https://generativelanguage.googleapis.com/v1beta/models/ชื่อmodel:generateContent ส่ง key ใน header x-goog-api-key โดย model หลักคือ gemini-3.1-flash-lite และถ้าได้ 503 หรือ 429 ให้ลองใหม่ 1 ครั้งด้วย gemini-3.5-flash

โค้ดปัจจุบัน:
[[วางโค้ดทั้งไฟล์ Code.gs ตรงนี้]]
✎ แก้ 2 จุดที่ไฮไลต์ [[ … ]] ให้เป็นข้อมูลของคุณก่อนส่ง
ลูกค้าได้ข้อความอัตโนมัติของ LINE ซ้อนมาด้วย

Auto-response ยังเปิดอยู่ กลับไปปิดในข้อ 6

ปุ่ม Verify ใน LINE ขึ้น error เรื่อง redirect / 302

ลองส่งข้อความจริงจากมือถือก่อน ปุ่ม Verify เข้มงวดกว่าการใช้งานจริง [VERIFY: ยังเกิดอยู่ไหม]

STEP 09สร้างเองด้วย AI ฟรีM2▶ —:—

ตอบจาก FAQ ด้วย AI

เป้าหมาย — บอทใช้ AI ตอบจากแท็บ FAQ และทดสอบได้ใน Apps Script โดยไม่ต้องใช้มือถือ

  1. กลับไปที่แชทเดิมกับ AI → copy prompt นี้ไปส่งต่อได้เลย
PROMPT → AI · M2 — ตอบจาก FAQ · แชทเดิม
M1 ผ่านแล้ว ไปต่อ

งานรอบนี้ (M2 — ตอบจาก FAQ):
- answer(question): อ่านแท็บ FAQ ส่งให้ AI ผ่าน buildPrompt และ callAI ให้ตอบจาก FAQ เท่านั้น ถ้าคำถามไม่อยู่ใน FAQ ให้ตอบว่ายังไม่มีข้อมูล ห้ามเดา
- doPost เปลี่ยนจากทวนข้อความ เป็นตอบด้วย answer()
- ถ้าเรียก AI ไม่สำเร็จ ให้ Logger.log error แบบอ่านรู้เรื่อง และตอบลูกค้าว่าระบบขัดข้องชั่วคราว
- testBot(): ทดสอบ 2 คำถาม "ร้านเปิดกี่โมงคะ" และ "มีโปรอะไรไหม" แล้ว Logger.log คำถามคู่กับคำตอบ

ส่ง Code.gs กลับมาทั้งไฟล์ในก้อนเดียว ใช้ชื่อฟังก์ชัน ชื่อ model และข้อมูลเทคนิคเดิมจากข้อความแรก ห้ามเปลี่ยน
เปิดแชทใหม่แทน? ใช้ prompt ฉบับเต็ม

ใช้เมื่อ แชทเดิมยาวจน AI เริ่มลืมหรือตอบมั่ว · โควต้าหมดแล้วย้ายไป AI ตัวอื่น · เพิ่งวางโค้ดสำรอง

copy โค้ดทั้งไฟล์จาก Code.gs (Ctrl+A → Ctrl+C) แล้ววางแทนส่วนที่ไฮไลต์ ในแชทใหม่

PROMPT → AI · M2 — ตอบจาก FAQ · แชทใหม่
ช่วยเขียนโค้ด Google Apps Script สำหรับบอท LINE OA ของร้านอาหาร คนที่ขอยังเขียนโค้ดไม่เป็น และจะวางโค้ดที่ได้ทับไฟล์ Code.gs ทั้งไฟล์

กติกาการตอบ:
- ส่ง Code.gs กลับมาทั้งไฟล์ ใน code block เดียว ห้ามส่งแค่บางส่วน ห้ามเขียนว่า "โค้ดเดิม..."
- ใช้ชื่อฟังก์ชันตามโครงด้านล่างเท่านั้น
- ห้ามขอค่า token หรือ key ให้อ่านจาก Script Properties
- หลังโค้ด อธิบายสั้นๆ ไม่เกิน 5 บรรทัด ว่าต้องกดอะไรต่อใน Apps Script

โครงโค้ด (ชื่อฟังก์ชันตายตัว เขียนเฉพาะที่งานรอบนี้ต้องใช้):
- doPost(e): รับ event จาก LINE เรียก answer() แล้ว replyToLine() และต้อง return ContentService.createTextOutput('OK') เสมอ แม้เกิด error
- replyToLine(replyToken, text): ตอบกลับผ่าน LINE reply API
- readSheet(name): อ่านแท็บเป็น array ของ object ใช้แถวแรกเป็นชื่อคอลัมน์
- buildPrompt(question): รวมข้อมูลจาก Sheet และกติกาของบอท เป็นข้อความสั่ง AI
- callAI(prompt): เรียก Gemini API คืนข้อความคำตอบ (รวม text จากทุก part) ถ้าได้ HTTP 503 หรือ 429 ให้ลองใหม่ 1 ครั้งด้วย model สำรอง
- answer(question): คืนคำตอบของบอท ใช้ทั้งใน doPost และตอนทดสอบ
- testBot(): ทดสอบใน editor ด้วยคำถามตัวอย่าง แล้ว Logger.log คำตอบ

ข้อมูลเทคนิคล่าสุด (ใช้ตามนี้ ห้ามเปลี่ยน):
- LINE reply API: POST https://api.line.me/v2/bot/message/reply ใส่ header Authorization: Bearer ตามด้วย token
- reply token ใช้ได้ครั้งเดียวและหมดอายุเร็ว ให้ตอบทันที
- รับเฉพาะ event ที่เป็นข้อความตัวอักษร event อื่นให้ข้าม
- Gemini API: POST https://generativelanguage.googleapis.com/v1beta/models/ชื่อmodel:generateContent ส่ง key ใน header x-goog-api-key
- model หลัก: gemini-3.1-flash-lite · model สำรอง (ใช้เมื่อได้ 503 หรือ 429): gemini-3.5-flash ห้ามใช้ model อื่น
- Script Properties: LINE_CHANNEL_ACCESS_TOKEN และ AI_API_KEY
- สคริปต์ผูกกับ Sheet อยู่แล้ว ใช้ SpreadsheetApp.getActive()
- แท็บและชื่อคอลัมน์ (แถวที่ 1):
- Persona: field, value
- FAQ: topic, answer
- Menu: name, price, spice, allergens
- Test: question, expected, bot_answer, pass

งานรอบนี้ (M2 — ตอบจาก FAQ):
- answer(question): อ่านแท็บ FAQ ส่งให้ AI ผ่าน buildPrompt และ callAI ให้ตอบจาก FAQ เท่านั้น ถ้าคำถามไม่อยู่ใน FAQ ให้ตอบว่ายังไม่มีข้อมูล ห้ามเดา
- doPost เปลี่ยนจากทวนข้อความ เป็นตอบด้วย answer()
- ถ้าเรียก AI ไม่สำเร็จ ให้ Logger.log error แบบอ่านรู้เรื่อง และตอบลูกค้าว่าระบบขัดข้องชั่วคราว
- testBot(): ทดสอบ 2 คำถาม "ร้านเปิดกี่โมงคะ" และ "มีโปรอะไรไหม" แล้ว Logger.log คำถามคู่กับคำตอบ

โค้ดปัจจุบัน:
[[วางโค้ดทั้งไฟล์ Code.gs ตรงนี้]]
✎ แก้ 1 จุดที่ไฮไลต์ [[ … ]] ให้เป็นข้อมูลของคุณก่อนส่ง
  1. copy โค้ดที่ได้ → วางทับ Code.gs ทั้งไฟล์ → Save
  2. แถบเครื่องมือด้านบน เลือกฟังก์ชัน testBot → กด Run (ครั้งแรกจะขอสิทธิ์เพิ่ม เพราะเริ่มอ่าน Sheet และเรียก AI)
  3. ดูผลใน Execution log ด้านล่าง
Apps Script เลือกฟังก์ชัน testBot กด Run และ Execution log แสดงคำตอบจาก FAQ
Apps Script เลือกฟังก์ชัน testBot กด Run และ Execution log แสดงคำตอบจาก FAQ — กรอบดำคือจุดที่ต้องกด
✅ คุณควรเห็น

ใน log: "ร้านเปิดกี่โมงคะ" ได้เวลาตาม FAQ และ "มีโปรอะไรไหม" บอทตอบว่ายังไม่มีข้อมูล ไม่แต่งโปรขึ้นมาเอง

  1. ผ่านแล้ว เอาโค้ดใหม่ขึ้นใช้งานจริง:
↻ Deploy เวอร์ชันใหม่ (ทำทุกครั้งหลังแก้โค้ด)
  1. 1. Apps Script มุมขวาบน Deploy → Manage deployments
  2. 2. กด ✎ (Edit) → Version: New version → Deploy
  3. 3. URL เดิมใช้ต่อได้ ไม่ต้องแก้อะไรใน LINE
  1. ถามจากมือถือ ร้านเปิดกี่โมงคะ ต้องได้คำตอบแบบเดียวกับใน log
❌ เจอปัญหา? กดดูวิธีแก้
log ขึ้น API key not valid หรือ 403

เช็ค Script Properties: ชื่อต้องเป็น AI_API_KEY เป๊ะๆ และค่าเป็น key ที่ขึ้นต้นด้วย AQ. (หรือ AIza)

log ขึ้น 404 หรือ model not found

AI ใช้ชื่อ model หรือ URL เก่า (AI ฟรีมักรู้ข้อมูลไม่อัปเดต) ใช้ prompt แก้ error ด้านล่าง ในนั้นมีชื่อ model ที่ถูกต้องอยู่แล้ว

log ขึ้น 503 หรือ high demand

model ที่ใช้มีคนใช้เยอะเกินในช่วงนั้น (เจอบ่อยกับ model รุ่นใหม่ล่าสุด) prompt ของเราให้บอทลองใหม่ด้วย model สำรองอยู่แล้ว ถ้ายังเจอ ให้เช็คใน Code.gs ว่าชื่อ model ตรงกับใน prompt ไม่ได้ถูก AI เปลี่ยนเป็นรุ่นอื่น หรือใช้ prompt แก้ error ด้านล่าง

log ขึ้น 429 หรือ quota exceeded

ชนโควต้าฟรีต่อนาทีของ AI ของบอท รอ 1 นาทีแล้วกด Run ใหม่

ใน log ตอบถูก แต่มือถือยังทวนข้อความแบบ M1

ยังไม่ได้ Deploy เวอร์ชันใหม่ ทำตามกล่อง ↻ ด้านบน

error อื่นๆ

copy ข้อความ error จาก log แล้วส่งให้ AI ในแชทเดิมด้วย prompt นี้

PROMPT → AI · แก้ error · แชทเดิม
เจอ error นี้ใน Apps Script:
[[วางข้อความ error]]

ช่วยแก้ แล้วส่ง Code.gs กลับมาทั้งไฟล์ในก้อนเดียว ห้ามเปลี่ยนชื่อฟังก์ชัน URL และชื่อ model
✎ แก้ 1 จุดที่ไฮไลต์ [[ … ]] ให้เป็นข้อมูลของคุณก่อนส่ง
เปิดแชทใหม่แทน? ใช้ prompt ฉบับเต็ม

ใช้เมื่อ แชทเดิมยาวจน AI เริ่มลืมหรือตอบมั่ว · โควต้าหมดแล้วย้ายไป AI ตัวอื่น · เพิ่งวางโค้ดสำรอง

copy โค้ดทั้งไฟล์จาก Code.gs (Ctrl+A → Ctrl+C) แล้ววางแทนส่วนที่ไฮไลต์ ในแชทใหม่

PROMPT → AI · แก้ error · แชทใหม่
โค้ด Google Apps Script ของบอท LINE ด้านล่าง เกิด error นี้ (จาก Executions หรือ Execution log):
[[วางข้อความ error]]

ช่วยแก้ แล้วส่ง Code.gs กลับมาทั้งไฟล์ใน code block เดียว ห้ามเปลี่ยนชื่อฟังก์ชัน ห้ามเปลี่ยน URL ของ API
ถ้า error เกี่ยวกับ Gemini ให้ใช้ https://generativelanguage.googleapis.com/v1beta/models/ชื่อmodel:generateContent ส่ง key ใน header x-goog-api-key โดย model หลักคือ gemini-3.1-flash-lite และถ้าได้ 503 หรือ 429 ให้ลองใหม่ 1 ครั้งด้วย gemini-3.5-flash

โค้ดปัจจุบัน:
[[วางโค้ดทั้งไฟล์ Code.gs ตรงนี้]]
✎ แก้ 2 จุดที่ไฮไลต์ [[ … ]] ให้เป็นข้อมูลของคุณก่อนส่ง
ไปต่อไม่ได้?
ใช้ โค้ดสำรองของ M2 ↗ ได้เลย — copy ทั้งไฟล์ไปวางทับ Code.gs แล้ว Save จากนั้นทำขั้นต่อไปตามปกติ ยังนับว่าผ่าน M2 เส้นชัยวัดจากพฤติกรรมของบอท ไม่ใช่ว่าใครเขียนโค้ด (ขั้นต่อไปให้ใช้ prompt ฉบับเต็มในแชทใหม่ เพราะแชทเดิมไม่รู้จักโค้ดนี้)
STEP 10สร้างเองด้วย AI ฟรีM3▶ —:—

ใส่บุคลิกของร้าน: Persona + Menu

เป้าหมาย — บอทพูดเหมือนคนในร้าน รู้เมนู และทำตามกติกาความปลอดภัยครบ

  1. ในแชทเดิม ส่ง prompt นี้ต่อ
PROMPT → AI · M3 — บุคลิกของร้าน · แชทเดิม
M2 ผ่านแล้ว ไปต่อ

งานรอบนี้ (M3 — บุคลิกของร้าน):
- buildPrompt ใช้ข้อมูลจากแท็บ Persona (field, value) และ Menu เพิ่มจาก FAQ
- พูดตาม Persona: ชื่อที่บอทเรียกตัวเอง คำลงท้าย สไตล์ อีโมจิ
- ทำตามกติกาของบอทด้านล่างครบทุกข้อ
- testBot(): ทดสอบ "ข้าวผัดกุ้งราคาเท่าไหร่", "แพ้กุ้ง กินต้มยำได้ไหม", "จองโต๊ะ 4 คน พรุ่งนี้ทุ่มนึงได้ไหม", "อาหารวันนี้เค็มมาก ไม่ประทับใจเลย"

กติกาของบอท:
- ตอบจากข้อมูลใน Sheet เท่านั้น ห้ามแต่งราคา โปรโมชัน หรือเวลาเปิด-ปิด
- ถ้าไม่มีข้อมูล ให้ใช้ข้อความตอนไม่รู้คำตอบจาก Persona
- ห้ามยืนยันการจองเอง ให้ลูกค้าติดต่อร้านตามช่องทางใน Persona
- ถามเรื่องแพ้อาหาร: บอกส่วนผสมที่ควรระวังตาม Menu และแนะนำให้แจ้งร้านโดยตรง ห้ามรับประกันว่าปลอดภัย
- ลูกค้าไม่พอใจ: ขอโทษ แล้วส่งต่อคนจริงพร้อมช่องทางติดต่อ
- เรื่องที่อยู่ในรายการห้ามคุย: ปฏิเสธอย่างสุภาพ
- ตอบสั้น ไม่เกิน 3 ประโยค ไม่ใช้ bullet list

ส่ง Code.gs กลับมาทั้งไฟล์ในก้อนเดียว ใช้ชื่อฟังก์ชัน ชื่อ model และข้อมูลเทคนิคเดิมจากข้อความแรก ห้ามเปลี่ยน
เปิดแชทใหม่แทน? ใช้ prompt ฉบับเต็ม

ใช้เมื่อ แชทเดิมยาวจน AI เริ่มลืมหรือตอบมั่ว · โควต้าหมดแล้วย้ายไป AI ตัวอื่น · เพิ่งวางโค้ดสำรอง

copy โค้ดทั้งไฟล์จาก Code.gs (Ctrl+A → Ctrl+C) แล้ววางแทนส่วนที่ไฮไลต์ ในแชทใหม่

PROMPT → AI · M3 — บุคลิกของร้าน · แชทใหม่
ช่วยเขียนโค้ด Google Apps Script สำหรับบอท LINE OA ของร้านอาหาร คนที่ขอยังเขียนโค้ดไม่เป็น และจะวางโค้ดที่ได้ทับไฟล์ Code.gs ทั้งไฟล์

กติกาการตอบ:
- ส่ง Code.gs กลับมาทั้งไฟล์ ใน code block เดียว ห้ามส่งแค่บางส่วน ห้ามเขียนว่า "โค้ดเดิม..."
- ใช้ชื่อฟังก์ชันตามโครงด้านล่างเท่านั้น
- ห้ามขอค่า token หรือ key ให้อ่านจาก Script Properties
- หลังโค้ด อธิบายสั้นๆ ไม่เกิน 5 บรรทัด ว่าต้องกดอะไรต่อใน Apps Script

โครงโค้ด (ชื่อฟังก์ชันตายตัว เขียนเฉพาะที่งานรอบนี้ต้องใช้):
- doPost(e): รับ event จาก LINE เรียก answer() แล้ว replyToLine() และต้อง return ContentService.createTextOutput('OK') เสมอ แม้เกิด error
- replyToLine(replyToken, text): ตอบกลับผ่าน LINE reply API
- readSheet(name): อ่านแท็บเป็น array ของ object ใช้แถวแรกเป็นชื่อคอลัมน์
- buildPrompt(question): รวมข้อมูลจาก Sheet และกติกาของบอท เป็นข้อความสั่ง AI
- callAI(prompt): เรียก Gemini API คืนข้อความคำตอบ (รวม text จากทุก part) ถ้าได้ HTTP 503 หรือ 429 ให้ลองใหม่ 1 ครั้งด้วย model สำรอง
- answer(question): คืนคำตอบของบอท ใช้ทั้งใน doPost และตอนทดสอบ
- testBot(): ทดสอบใน editor ด้วยคำถามตัวอย่าง แล้ว Logger.log คำตอบ

ข้อมูลเทคนิคล่าสุด (ใช้ตามนี้ ห้ามเปลี่ยน):
- LINE reply API: POST https://api.line.me/v2/bot/message/reply ใส่ header Authorization: Bearer ตามด้วย token
- reply token ใช้ได้ครั้งเดียวและหมดอายุเร็ว ให้ตอบทันที
- รับเฉพาะ event ที่เป็นข้อความตัวอักษร event อื่นให้ข้าม
- Gemini API: POST https://generativelanguage.googleapis.com/v1beta/models/ชื่อmodel:generateContent ส่ง key ใน header x-goog-api-key
- model หลัก: gemini-3.1-flash-lite · model สำรอง (ใช้เมื่อได้ 503 หรือ 429): gemini-3.5-flash ห้ามใช้ model อื่น
- Script Properties: LINE_CHANNEL_ACCESS_TOKEN และ AI_API_KEY
- สคริปต์ผูกกับ Sheet อยู่แล้ว ใช้ SpreadsheetApp.getActive()
- แท็บและชื่อคอลัมน์ (แถวที่ 1):
- Persona: field, value
- FAQ: topic, answer
- Menu: name, price, spice, allergens
- Test: question, expected, bot_answer, pass

งานรอบนี้ (M3 — บุคลิกของร้าน):
- buildPrompt ใช้ข้อมูลจากแท็บ Persona (field, value) และ Menu เพิ่มจาก FAQ
- พูดตาม Persona: ชื่อที่บอทเรียกตัวเอง คำลงท้าย สไตล์ อีโมจิ
- ทำตามกติกาของบอทด้านล่างครบทุกข้อ
- testBot(): ทดสอบ "ข้าวผัดกุ้งราคาเท่าไหร่", "แพ้กุ้ง กินต้มยำได้ไหม", "จองโต๊ะ 4 คน พรุ่งนี้ทุ่มนึงได้ไหม", "อาหารวันนี้เค็มมาก ไม่ประทับใจเลย"

กติกาของบอท:
- ตอบจากข้อมูลใน Sheet เท่านั้น ห้ามแต่งราคา โปรโมชัน หรือเวลาเปิด-ปิด
- ถ้าไม่มีข้อมูล ให้ใช้ข้อความตอนไม่รู้คำตอบจาก Persona
- ห้ามยืนยันการจองเอง ให้ลูกค้าติดต่อร้านตามช่องทางใน Persona
- ถามเรื่องแพ้อาหาร: บอกส่วนผสมที่ควรระวังตาม Menu และแนะนำให้แจ้งร้านโดยตรง ห้ามรับประกันว่าปลอดภัย
- ลูกค้าไม่พอใจ: ขอโทษ แล้วส่งต่อคนจริงพร้อมช่องทางติดต่อ
- เรื่องที่อยู่ในรายการห้ามคุย: ปฏิเสธอย่างสุภาพ
- ตอบสั้น ไม่เกิน 3 ประโยค ไม่ใช้ bullet list

โค้ดปัจจุบัน:
[[วางโค้ดทั้งไฟล์ Code.gs ตรงนี้]]
✎ แก้ 1 จุดที่ไฮไลต์ [[ … ]] ให้เป็นข้อมูลของคุณก่อนส่ง
  1. วางทับ Code.gs → Save → เลือก testBot → Run
✅ คุณควรเห็น

ใน log บอทเรียกตัวเองว่า น้องมะลิ ลงท้าย ค่ะ และ:

  • ข้าวผัดกุ้ง → บอกราคาตาม Menu
  • แพ้กุ้ง → บอกว่าต้มยำมีกุ้ง ให้แจ้งร้าน ไม่รับประกันว่าปลอดภัย
  • จองโต๊ะ → ไม่ยืนยันเอง บอกช่องทางติดต่อร้าน
  • อาหารเค็ม → ขอโทษ และส่งต่อคนจริง
  1. ผ่านแล้ว:
↻ Deploy เวอร์ชันใหม่ (ทำทุกครั้งหลังแก้โค้ด)
  1. 1. Apps Script มุมขวาบน Deploy → Manage deployments
  2. 2. กด ✎ (Edit) → Version: New version → Deploy
  3. 3. URL เดิมใช้ต่อได้ ไม่ต้องแก้อะไรใน LINE
❌ เจอปัญหา? กดดูวิธีแก้
บอทตอบยาวเกินไป

ในแชทเดิมพิมพ์ว่า "คำตอบยาวเกิน ให้จำกัดไม่เกิน 3 ประโยค ส่ง Code.gs ทั้งไฟล์" ถ้าแชทเดิมโควต้าหมด ใช้ prompt ฉบับเต็มของ M3 ในแชทใหม่ แล้วเติมประโยคนี้ต่อท้าย

บอทยังไม่ใช้ชื่อหรือคำลงท้ายจาก Persona

เช็คแท็บ Persona ว่าแถวที่ 1 เป็น field และ value และไม่ได้ลบแถวไหนออก

error อื่นๆ
PROMPT → AI · แก้ error · แชทเดิม
เจอ error นี้ใน Apps Script:
[[วางข้อความ error]]

ช่วยแก้ แล้วส่ง Code.gs กลับมาทั้งไฟล์ในก้อนเดียว ห้ามเปลี่ยนชื่อฟังก์ชัน URL และชื่อ model
✎ แก้ 1 จุดที่ไฮไลต์ [[ … ]] ให้เป็นข้อมูลของคุณก่อนส่ง
เปิดแชทใหม่แทน? ใช้ prompt ฉบับเต็ม

ใช้เมื่อ แชทเดิมยาวจน AI เริ่มลืมหรือตอบมั่ว · โควต้าหมดแล้วย้ายไป AI ตัวอื่น · เพิ่งวางโค้ดสำรอง

copy โค้ดทั้งไฟล์จาก Code.gs (Ctrl+A → Ctrl+C) แล้ววางแทนส่วนที่ไฮไลต์ ในแชทใหม่

PROMPT → AI · แก้ error · แชทใหม่
โค้ด Google Apps Script ของบอท LINE ด้านล่าง เกิด error นี้ (จาก Executions หรือ Execution log):
[[วางข้อความ error]]

ช่วยแก้ แล้วส่ง Code.gs กลับมาทั้งไฟล์ใน code block เดียว ห้ามเปลี่ยนชื่อฟังก์ชัน ห้ามเปลี่ยน URL ของ API
ถ้า error เกี่ยวกับ Gemini ให้ใช้ https://generativelanguage.googleapis.com/v1beta/models/ชื่อmodel:generateContent ส่ง key ใน header x-goog-api-key โดย model หลักคือ gemini-3.1-flash-lite และถ้าได้ 503 หรือ 429 ให้ลองใหม่ 1 ครั้งด้วย gemini-3.5-flash

โค้ดปัจจุบัน:
[[วางโค้ดทั้งไฟล์ Code.gs ตรงนี้]]
✎ แก้ 2 จุดที่ไฮไลต์ [[ … ]] ให้เป็นข้อมูลของคุณก่อนส่ง
ไปต่อไม่ได้?
ใช้ โค้ดสำรองของ M3 ↗ ได้เลย — copy ทั้งไฟล์ไปวางทับ Code.gs แล้ว Save จากนั้นทำขั้นต่อไปตามปกติ ยังนับว่าผ่าน M3 เส้นชัยวัดจากพฤติกรรมของบอท ไม่ใช่ว่าใครเขียนโค้ด (ขั้นต่อไปให้ใช้ prompt ฉบับเต็มในแชทใหม่ เพราะแชทเดิมไม่รู้จักโค้ดนี้)
STEP 11สร้างเองด้วย AI ฟรีM4▶ —:—

ผ่านชุดทดสอบ

เป้าหมาย — บอทผ่านทุกข้อในแท็บ Test — เส้นชัยเดียวกับเส้นทาง Template

  1. ในแชทเดิม ส่ง prompt นี้ต่อ
PROMPT → AI · M4 — ชุดทดสอบ · แชทเดิม
M3 ผ่านแล้ว ไปต่อ

งานรอบนี้ (M4 — ชุดทดสอบ):
- เพิ่ม runTests(): อ่านแท็บ Test ทีละแถว เรียก answer(question) แล้วเขียนผลลงคอลัมน์ bot_answer ห้ามแตะคอลัมน์ pass (คนจะติ๊กเอง)
- เว้น 5 วินาทีระหว่างแต่ละข้อด้วย Utilities.sleep เพื่อไม่ให้ชนโควต้าฟรีของ AI
- เพิ่ม onOpen() สร้างเมนู "บอท" ใน Sheet มีเมนูย่อย "รันชุดทดสอบ" ที่เรียก runTests
- คงกติกาของบอทเดิมไว้ครบ

กติกาของบอท:
- ตอบจากข้อมูลใน Sheet เท่านั้น ห้ามแต่งราคา โปรโมชัน หรือเวลาเปิด-ปิด
- ถ้าไม่มีข้อมูล ให้ใช้ข้อความตอนไม่รู้คำตอบจาก Persona
- ห้ามยืนยันการจองเอง ให้ลูกค้าติดต่อร้านตามช่องทางใน Persona
- ถามเรื่องแพ้อาหาร: บอกส่วนผสมที่ควรระวังตาม Menu และแนะนำให้แจ้งร้านโดยตรง ห้ามรับประกันว่าปลอดภัย
- ลูกค้าไม่พอใจ: ขอโทษ แล้วส่งต่อคนจริงพร้อมช่องทางติดต่อ
- เรื่องที่อยู่ในรายการห้ามคุย: ปฏิเสธอย่างสุภาพ
- ตอบสั้น ไม่เกิน 3 ประโยค ไม่ใช้ bullet list

ส่ง Code.gs กลับมาทั้งไฟล์ในก้อนเดียว ใช้ชื่อฟังก์ชัน ชื่อ model และข้อมูลเทคนิคเดิมจากข้อความแรก ห้ามเปลี่ยน
เปิดแชทใหม่แทน? ใช้ prompt ฉบับเต็ม

ใช้เมื่อ แชทเดิมยาวจน AI เริ่มลืมหรือตอบมั่ว · โควต้าหมดแล้วย้ายไป AI ตัวอื่น · เพิ่งวางโค้ดสำรอง

copy โค้ดทั้งไฟล์จาก Code.gs (Ctrl+A → Ctrl+C) แล้ววางแทนส่วนที่ไฮไลต์ ในแชทใหม่

PROMPT → AI · M4 — ชุดทดสอบ · แชทใหม่
ช่วยเขียนโค้ด Google Apps Script สำหรับบอท LINE OA ของร้านอาหาร คนที่ขอยังเขียนโค้ดไม่เป็น และจะวางโค้ดที่ได้ทับไฟล์ Code.gs ทั้งไฟล์

กติกาการตอบ:
- ส่ง Code.gs กลับมาทั้งไฟล์ ใน code block เดียว ห้ามส่งแค่บางส่วน ห้ามเขียนว่า "โค้ดเดิม..."
- ใช้ชื่อฟังก์ชันตามโครงด้านล่างเท่านั้น
- ห้ามขอค่า token หรือ key ให้อ่านจาก Script Properties
- หลังโค้ด อธิบายสั้นๆ ไม่เกิน 5 บรรทัด ว่าต้องกดอะไรต่อใน Apps Script

โครงโค้ด (ชื่อฟังก์ชันตายตัว เขียนเฉพาะที่งานรอบนี้ต้องใช้):
- doPost(e): รับ event จาก LINE เรียก answer() แล้ว replyToLine() และต้อง return ContentService.createTextOutput('OK') เสมอ แม้เกิด error
- replyToLine(replyToken, text): ตอบกลับผ่าน LINE reply API
- readSheet(name): อ่านแท็บเป็น array ของ object ใช้แถวแรกเป็นชื่อคอลัมน์
- buildPrompt(question): รวมข้อมูลจาก Sheet และกติกาของบอท เป็นข้อความสั่ง AI
- callAI(prompt): เรียก Gemini API คืนข้อความคำตอบ (รวม text จากทุก part) ถ้าได้ HTTP 503 หรือ 429 ให้ลองใหม่ 1 ครั้งด้วย model สำรอง
- answer(question): คืนคำตอบของบอท ใช้ทั้งใน doPost และตอนทดสอบ
- testBot(): ทดสอบใน editor ด้วยคำถามตัวอย่าง แล้ว Logger.log คำตอบ

ข้อมูลเทคนิคล่าสุด (ใช้ตามนี้ ห้ามเปลี่ยน):
- LINE reply API: POST https://api.line.me/v2/bot/message/reply ใส่ header Authorization: Bearer ตามด้วย token
- reply token ใช้ได้ครั้งเดียวและหมดอายุเร็ว ให้ตอบทันที
- รับเฉพาะ event ที่เป็นข้อความตัวอักษร event อื่นให้ข้าม
- Gemini API: POST https://generativelanguage.googleapis.com/v1beta/models/ชื่อmodel:generateContent ส่ง key ใน header x-goog-api-key
- model หลัก: gemini-3.1-flash-lite · model สำรอง (ใช้เมื่อได้ 503 หรือ 429): gemini-3.5-flash ห้ามใช้ model อื่น
- Script Properties: LINE_CHANNEL_ACCESS_TOKEN และ AI_API_KEY
- สคริปต์ผูกกับ Sheet อยู่แล้ว ใช้ SpreadsheetApp.getActive()
- แท็บและชื่อคอลัมน์ (แถวที่ 1):
- Persona: field, value
- FAQ: topic, answer
- Menu: name, price, spice, allergens
- Test: question, expected, bot_answer, pass

งานรอบนี้ (M4 — ชุดทดสอบ):
- เพิ่ม runTests(): อ่านแท็บ Test ทีละแถว เรียก answer(question) แล้วเขียนผลลงคอลัมน์ bot_answer ห้ามแตะคอลัมน์ pass (คนจะติ๊กเอง)
- เว้น 5 วินาทีระหว่างแต่ละข้อด้วย Utilities.sleep เพื่อไม่ให้ชนโควต้าฟรีของ AI
- เพิ่ม onOpen() สร้างเมนู "บอท" ใน Sheet มีเมนูย่อย "รันชุดทดสอบ" ที่เรียก runTests
- คงกติกาของบอทเดิมไว้ครบ

กติกาของบอท:
- ตอบจากข้อมูลใน Sheet เท่านั้น ห้ามแต่งราคา โปรโมชัน หรือเวลาเปิด-ปิด
- ถ้าไม่มีข้อมูล ให้ใช้ข้อความตอนไม่รู้คำตอบจาก Persona
- ห้ามยืนยันการจองเอง ให้ลูกค้าติดต่อร้านตามช่องทางใน Persona
- ถามเรื่องแพ้อาหาร: บอกส่วนผสมที่ควรระวังตาม Menu และแนะนำให้แจ้งร้านโดยตรง ห้ามรับประกันว่าปลอดภัย
- ลูกค้าไม่พอใจ: ขอโทษ แล้วส่งต่อคนจริงพร้อมช่องทางติดต่อ
- เรื่องที่อยู่ในรายการห้ามคุย: ปฏิเสธอย่างสุภาพ
- ตอบสั้น ไม่เกิน 3 ประโยค ไม่ใช้ bullet list

โค้ดปัจจุบัน:
[[วางโค้ดทั้งไฟล์ Code.gs ตรงนี้]]
✎ แก้ 1 จุดที่ไฮไลต์ [[ … ]] ให้เป็นข้อมูลของคุณก่อนส่ง
  1. วางทับ Code.gs → Save
  2. กลับไปที่ Sheet → refresh หน้า → เมนูใหม่ บอท → รันชุดทดสอบ (ครั้งแรกขอสิทธิ์ ให้กดซ้ำอีกครั้งหลัง Allow)
  3. รอประมาณ 1–2 นาที คำตอบจะขึ้นในคอลัมน์ bot_answer
  4. อ่านทีละข้อ เทียบกับคอลัมน์ expected แล้วติ๊ก pass เอง
✅ คุณควรเห็น

ผ่านครบ 10 ข้อ แล้วลองถาม 3 ข้อจากมือถือ (อย่าลืม Deploy เวอร์ชันใหม่ก่อน) ได้ผลแบบเดียวกับในชุดทดสอบ

↻ Deploy เวอร์ชันใหม่ (ทำทุกครั้งหลังแก้โค้ด)
  1. 1. Apps Script มุมขวาบน Deploy → Manage deployments
  2. 2. กด ✎ (Edit) → Version: New version → Deploy
  3. 3. URL เดิมใช้ต่อได้ ไม่ต้องแก้อะไรใน LINE
❌ เจอปัญหา? กดดูวิธีแก้
ไม่เห็นเมนู บอท ใน Sheet

refresh หน้า Sheet อีกครั้ง หรือรัน runTests จาก Apps Script โดยตรงก็ได้

แก้ข้อหนึ่งผ่าน แต่อีกข้อพัง

รันชุดทดสอบใหม่ ทั้งชุด ทุกครั้งที่แก้ แล้วส่งทุกข้อที่ไม่ผ่านไปในข้อความเดียว

Exceeded maximum execution time

ชุดทดสอบใช้เวลานานเกินที่ Apps Script ยอม ลบแถวที่ผ่านแล้วออกชั่วคราว รันเฉพาะข้อที่เหลือ

ไปต่อไม่ได้?
ใช้ โค้ดสำรองของ M4 ↗ ได้เลย — copy ทั้งไฟล์ไปวางทับ Code.gs แล้ว Save จากนั้นทำขั้นต่อไปตามปกติ ยังนับว่าผ่าน M4 เส้นชัยวัดจากพฤติกรรมของบอท ไม่ใช่ว่าใครเขียนโค้ด (ขั้นต่อไปให้ใช้ prompt ฉบับเต็มในแชทใหม่ เพราะแชทเดิมไม่รู้จักโค้ดนี้)
🏁 FINISH LINEทำแล้ว 0/4 ขั้น

เส้นชัย: บอทผ่านชุดทดสอบ

บอทผ่านชุดทดสอบใน Sheet และตอบจากมือถือได้จริง ทั้งสองเส้นทางมาถึงจุดเดียวกันตรงนี้

ก่อนเปิดให้ลูกค้าจริงใช้: เปลี่ยนข้อมูลร้านตัวอย่างเป็นข้อมูลร้านคุณ แล้ว รันชุดทดสอบอีกรอบ

ปรับแต่งด้วย AI

Template เป็นจุดเริ่มต้น อยากให้บอททำอะไรเพิ่ม ให้ AI ช่วยได้ ขอแค่ให้ AI รู้จัก template ก่อน และทำตาม กิจวัตรความปลอดภัย ทุกครั้ง

1. ให้ AI รู้จัก template

  1. เปิด Apps Script (Extensions → Apps Script) → copy โค้ดทุกไฟล์
  2. ใน AI แชท สร้าง project ใหม่แล้วใส่โค้ดเป็นไฟล์ของ project (ถ้าไม่มีฟีเจอร์ project ให้แนบไฟล์โค้ดไปกับข้อความแรก)
  3. เริ่มแชทใน project ด้วย prompt นี้
PROMPT → AI · บริบท template
บอท LINE ร้านอาหารนี้สร้างจาก template โค้ดแนบมาด้วย
- รันบน Google Apps Script ที่ผูกกับ Google Sheet
- แท็บ Persona = วิธีพูดของบอท, FAQ = topic และ answer, Menu = เมนู ราคา ความเผ็ด ส่วนผสมที่ควรระวัง, Test = ชุดทดสอบ, Settings = คีย์ (ห้ามขอค่าคีย์)

กติกาเวลาช่วยแก้:
- ถ้าแก้ได้ด้วยการแก้ข้อมูลใน Sheet ให้แนะนำวิธีนั้นก่อนแก้โค้ด
- ถ้าต้องแก้โค้ด บอกชัดๆ ว่าไฟล์ไหน ฟังก์ชันไหน แล้วส่งฟังก์ชันที่แก้มาทั้งก้อน
- ห้ามทำให้บอทแต่งราคา โปรโมชัน เวลาเปิด-ปิด หรือยืนยันการจองเอง
- เตือนให้ deploy เวอร์ชันใหม่และรันชุดทดสอบหลังแก้ทุกครั้ง

สิ่งที่อยากให้บอททำเพิ่ม: [[อธิบายสิ่งที่อยากได้]]
✎ แก้ 1 จุดที่ไฮไลต์ [[ … ]] ให้เป็นข้อมูลของคุณก่อนส่ง

2. ตัวอย่างสิ่งที่ขอได้

  • "ถ้าลูกค้าพิมพ์ภาษาอังกฤษมา ให้ตอบเป็นภาษาอังกฤษ"
  • "เพิ่มแท็บ Promotion ให้บอทตอบโปรได้ เฉพาะโปรที่อยู่ในแท็บและยังไม่หมดอายุ"
  • "ส่งรูปเมนูเมื่อลูกค้าถามว่ามีเมนูอะไรบ้าง"
  • "เมื่อลูกค้าไม่พอใจ ให้แจ้งเตือนเข้ากลุ่ม LINE ของพนักงานด้วย"

ทุกครั้งที่เพิ่มความสามารถ เพิ่มแถวในแท็บ Test ที่ทดสอบสิ่งนั้นด้วย

3. กิจวัตรความปลอดภัย (ทำทุกครั้ง)

  1. ทำสำเนาก่อนแก้ — File → Make a copy ตั้งชื่อ สำรอง วันที่ เก็บไว้
  2. แก้ทีละอย่าง — อย่าขอให้ AI แก้หลายเรื่องในครั้งเดียว
  3. Deploy เวอร์ชันใหม่ — Deploy → Manage deployments → ✎ → Version: New version → Deploy
  4. รันชุดทดสอบทั้งชุด — ต้องผ่านครบเหมือนเดิม + ข้อใหม่ที่เพิ่ม
  5. ถ้าพัง ย้อนกลับ — Manage deployments → ✎ → เลือกเวอร์ชันก่อนหน้า → Deploy (URL เดิม ไม่ต้องแก้ใน LINE) หรือ copy โค้ดจากไฟล์สำรองกลับมา
CONTACT

ติดตรงไหน ทักมาได้เลย

ส่ง ภาพหน้าจอ + บอกว่า ทำถึงขั้นที่เท่าไหร่ / เส้นทางไหน จะช่วยได้เร็วขึ้นมาก

NEXT

EP.2 — รับจองโต๊ะ บันทึกลง Sheet

ให้บอทเก็บข้อมูลการจอง (ชื่อ วัน เวลา จำนวนคน) ลงแท็บใหม่ใน Sheet แล้วให้ร้านเป็นคนกดยืนยันเอง บอทไม่ยืนยันแทน

CHANGE LOG

  • 2026.11.08ฉบับร่างแรก รอทดสอบจริงบนบัญชีใหม่ระหว่างถ่ายทำ