บอทตัวนี้ทำอะไรได้
ลูกค้าทักเข้า 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 | บอทพูดยังไง: ชื่อร้าน, บอทเรียกตัวเองว่าอะไร, ค่ะ/ครับ, สไตล์, อีโมจิ, ข้อความตอนไม่รู้คำตอบ, ช่องทางติดต่อคนจริง, เรื่องที่ห้ามคุย |
| FAQ | topic / 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]
สร้าง LINE Official Account
เป้าหมาย — มีบัญชี LINE OA สำหรับร้าน ใช้ชื่อร้านตัวอย่างไปก่อนก็ได้
- เปิด LINE Official Account Manager ↗ แล้วล็อกอินด้วยบัญชี LINE ส่วนตัว
- หน้า Accounts เมนูซ้าย กด Create new — ฟอร์มจะเปิดในแท็บใหม่ และ เป็นภาษาไทย (ปกติ ไม่ต้องเปลี่ยนภาษา)
- กรอกข้อมูล:
- ชื่อบัญชี:
ครัวมะลิ - อีเมล: อีเมลของคุณ
- ประเภทธุรกิจ: ร้านอาหารและเครื่องดื่ม → อาหารไทย
- ชื่อบัญชี:
- กด ตกลง → ตรวจสอบข้อมูล แล้วกดยืนยันจนจบ [VERIFY: ชื่อปุ่มในหน้าตรวจสอบข้อมูล]

เข้ามาที่หน้า Home ของบัญชี มุมซ้ายบนมีชื่อ ครัวมะลิ
ระบบให้ยืนยันเบอร์โทร แต่ SMS ไม่มา
รอ 1–2 นาทีแล้วกดส่งใหม่ เช็คว่าเลือกรหัสประเทศเป็น +66 และตัด 0 ตัวหน้าออก
สร้างเสร็จแล้วแต่หาบัญชีไม่เจอ
เปิด LINE Official Account Manager ใหม่ จะเห็นรายการบัญชีทั้งหมดที่คุณมี กดชื่อร้านเพื่อเข้าไป
เปิดใช้ Messaging API
เป้าหมาย — ให้บัญชี LINE OA ส่งข้อความเข้าระบบภายนอกได้ บอทจะรับข้อความผ่านช่องทางนี้
- ในหน้า LINE OA Manager กด Settings มุมขวาบน
- เมนูซ้าย เลือก Messaging API
- กด Enable Messaging API
- ระบบให้เลือก Provider: เลือก Create a new provider แล้วตั้งชื่อเป็นชื่อคุณหรือชื่อธุรกิจ [VERIFY: ลำดับหน้าจอเลือก provider]
- ช่อง Privacy policy และ Terms of use เว้นว่างได้ → กด OK

Status เปลี่ยนเป็น Enabled และมี Channel ID, Channel secret กับช่อง Webhook URL โผล่ขึ้นมา (ช่อง Webhook URL ยังไม่ต้องกรอก เราจะตั้งค่าใน LINE Developers Console ทีหลัง)
ไม่แน่ใจว่าจะตั้งชื่อ Provider ว่าอะไร
ตั้งเป็นชื่อตัวเองหรือชื่อธุรกิจได้เลย ชื่อนี้ไม่แสดงให้ลูกค้าเห็น แต่เปลี่ยนทีหลังยาก
ไม่เห็นเมนู Messaging API ในหน้า Settings
เช็คว่าบัญชี LINE ที่ล็อกอินเป็น Admin ของ OA นี้ (คนสร้างบัญชีเป็น Admin อยู่แล้ว)
เอา Channel access token
เป้าหมาย — ได้กุญแจที่ให้บอทส่งข้อความตอบกลับในนามร้าน
- เปิด LINE Developers Console ↗ แล้วล็อกอินด้วยบัญชี LINE เดิม
- กดชื่อ Provider ที่สร้างในขั้นที่แล้ว → กด channel ชื่อ ครัวมะลิ
- เปิดแท็บ Messaging API แล้วเลื่อนลงล่างสุด
- หัวข้อ Channel access token (long-lived) → กด Issue
- กดไอคอน copy แล้ววางเก็บไว้ในโน้ตชั่วคราว (ต้องใช้ในขั้นถัดๆ ไป)

token นี้เหมือนกุญแจร้าน ใครได้ไปก็ส่งข้อความในนามร้านได้ ห้ามโพสต์หรือส่งให้ใคร รวมถึงห้ามแคปหน้าจอที่เห็น token ไปถามคนอื่น
ได้ข้อความยาวมาก (ราวๆ 170 ตัวอักษร) ขึ้นต้นด้วยตัวอักษรผสมตัวเลข ลงท้ายมักเป็น =
copy ได้ข้อความสั้นๆ แค่ 32 ตัว
นั่นคือ Channel secret ไม่ใช่ token กลับไปเลื่อนลงล่างสุดของแท็บ Messaging API แล้ว copy จากช่อง Channel access token
เผลอแชร์ token ไปแล้ว
กด Reissue ที่ช่องเดิม token เก่าจะใช้ไม่ได้ทันที แล้วเอาตัวใหม่ไปใช้แทน
เอา AI API key (ฟรี)
เป้าหมาย — ได้คีย์ AI ที่บอทใช้คิดคำตอบ ใช้ free tier จึงไม่มีค่าใช้จ่าย
- เปิด Google AI Studio ↗ แล้วล็อกอินด้วยบัญชี Google
- ถ้าเป็นครั้งแรก กดยอมรับข้อตกลงการใช้งาน
- กด Create API key — ระบบเลือก project ให้อัตโนมัติ (Default) กดสร้างได้เลย
- หน้าต่าง API key details เปิดขึ้นมา → กด Copy key แล้ววางเก็บไว้ในโน้ตเดียวกับ token

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 ช่วยกรอกข้อมูลร้าน
ทำสำเนา Template
เป้าหมาย — ได้ Google Sheet ของตัวเองที่มีโค้ดบอทติดมาครบ
-
กดปุ่มนี้ (ล็อกอิน Google ไว้ก่อน)
ทำสำเนา Template (ลิงก์เร็วๆ นี้) -
หน้า Copy document → กด Make a copy
-
ไฟล์ใหม่เปิดขึ้นมา ตั้งชื่อเป็น
บอท ครัวมะลิ(กดชื่อไฟล์มุมซ้ายบนเพื่อแก้)
ด้านล่างมีแท็บ Persona, FAQ, Menu, Test, Settings และแถบเมนูด้านบนมีเมนู 🤖 บอทร้าน (อาจขึ้นช้าประมาณ 10 วินาที) [VERIFY: ชื่อเมนูใน template]
ไม่เห็นปุ่ม Make a copy
ยังไม่ได้ล็อกอิน Google หรือใช้บัญชีองค์กรที่บล็อกการทำสำเนา ลองล็อกอินด้วย Gmail ส่วนตัว
ไม่เห็นเมนู 🤖 บอทร้าน
รอสักครู่แล้วกด refresh หน้า Sheet เมนูจะโผล่หลังโค้ดโหลดเสร็จ
วางคีย์ในแท็บ Settings
เป้าหมาย — บอกบอทว่าใช้ LINE OA บัญชีไหน และใช้ AI key ไหน
- เปิดแท็บ Settings
- ช่องข้างๆ
LINE_CHANNEL_ACCESS_TOKEN→ วาง LINE token (ขั้นที่ 3) - ช่องข้างๆ
AI_API_KEY→ วาง AI key (ขั้นที่ 4)
วางด้วย Ctrl+Shift+V (Mac: Cmd+Shift+V) เพื่อไม่ให้ติดฟอร์แมตหรือช่องว่างแปลกๆ มาด้วย
ตอนนี้ Sheet มีคีย์ของร้านอยู่ อย่ากด Share ให้ใคร ถ้าอยากให้คนอื่นช่วยดู ให้ทำสำเนาอีกไฟล์ แล้วลบคีย์ในแท็บ Settings ของไฟล์สำเนาออกก่อน
ทั้งสองช่องมีค่า ไม่มีช่องว่างหน้าหรือท้าย (ดับเบิลคลิกที่ช่องเพื่อเช็ค)
วางแล้วข้อความตกไปช่องอื่น หรือแตกเป็นหลายบรรทัด
ลบแล้ววางใหม่ โดยคลิกเลือกช่องให้ถูกก่อน แล้วใช้ Ctrl+Shift+V
กรอก Persona
เป้าหมาย — กำหนดว่าบอทพูดยังไง เรียกตัวเองว่าอะไร และส่งต่อคนจริงทางไหน
- เปิดแท็บ Persona
- Template มีค่าของร้านตัวอย่างใส่ไว้แล้ว (ตรงกับตาราง Persona ด้านบน) ใช้ค่านี้ไปก่อน จนบอทผ่านชุดทดสอบ
- แก้แค่ช่อง ติดต่อคนจริง เป็นเบอร์หรือ LINE ของคุณ จะได้ลองว่าบอทส่งต่อถูก
ทุกแถวในคอลัมน์ค่ามีข้อมูล ไม่มีช่องว่าง
ไม่รู้ว่าสไตล์ควรเขียนยังไง
เขียนเหมือนบอกพนักงานใหม่ เช่น "เป็นกันเอง สุภาพ ตอบสั้น ไม่ใช้ศัพท์วัยรุ่น" สั้นๆ แบบนี้พอ
กรอก FAQ ด้วย AI
เป้าหมาย — ได้ตารางคำถามที่ลูกค้าถามบ่อยพร้อมคำตอบ ใช้ข้อมูลร้านจริงเท่านั้น
- เปิด AI แชทที่คุณใช้ แบบฟรีก็ได้ (เช่น Gemini, ChatGPT, Claude) → เริ่มแชทใหม่
- copy prompt ด้านล่าง แก้ส่วนที่ไฮไลต์ แล้วส่ง
ช่วยเขียน FAQ สำหรับบอท LINE ของร้านอาหาร เพื่อนำไปวางใน Google Sheet ข้อมูลร้าน: - ชื่อร้าน: [[ครัวมะลิ]] - เวลาเปิด-ปิด: [[ทุกวัน 10:00–20:00 หยุดวันพุธ]] - ที่ตั้ง / การเดินทาง: [[ใส่ที่อยู่ร้าน]] - ที่จอดรถ: [[จอดหน้าร้านได้ 3 คัน]] - สั่งกลับบ้าน / เดลิเวอรี: [[มีใน LINE MAN และ Grab]] - การจองโต๊ะ: [[รับจองทางโทรศัพท์ ร้านเป็นคนยืนยัน]] - การชำระเงิน: [[เงินสด และพร้อมเพย์]] - อื่นๆ ที่ลูกค้าถามบ่อย: [[ใส่เพิ่มได้ หรือลบบรรทัดนี้]] กติกา: - ใช้เฉพาะข้อมูลข้างบน ห้ามเติมข้อมูลที่ไม่ได้ให้ไว้ เช่น ราคา โปรโมชัน หรือเวลาเปิด-ปิด - หัวข้อไหนไม่มีข้อมูล ให้ข้ามไป ห้ามเดา - คำตอบสั้น 1–2 ประโยค เหมาะกับแชท LINE - ส่งกลับเป็น code block แบบ TSV (คั่นด้วย tab) 2 คอลัมน์: topic และ answer ไม่ต้องมีแถวหัวตาราง
- กด copy ที่มุม code block ในคำตอบของ AI
- กลับไปที่แท็บ FAQ → คลิกช่อง A2 → วาง
แต่ละแถวมี topic อยู่คอลัมน์ A และ answer อยู่คอลัมน์ B อ่านทุกแถวอีกรอบ ข้อมูลต้องตรงกับร้านจริง
วางแล้วทุกอย่างไปกองอยู่คอลัมน์ A
เลือกคอลัมน์ A → เมนู Data → Split text to columns → Separator เลือก Tab หรือบอก AI ว่า "ส่งใหม่เป็น TSV คั่นด้วย tab จริงๆ"
AI ใส่ข้อมูลที่ไม่ได้ให้ไว้
ลบแถวนั้นออกจาก Sheet ได้เลย บอทจะตอบจากสิ่งที่อยู่ใน Sheet เท่านั้น ข้อมูลผิดใน Sheet = บอทตอบผิด
รันชุดทดสอบใน Sheet
เป้าหมาย — เช็คว่าบอทตอบถูกทุกข้อ ก่อนเชื่อมกับ LINE จริง
- เปิดแท็บ Test มีคำถามชุดทดสอบใส่ไว้แล้ว (ตรงกับตารางด้านบน)
- เมนู 🤖 บอทร้าน → รันชุดทดสอบ [VERIFY: ชื่อเมนู]
- ครั้งแรก Google จะขอสิทธิ์: Continue → เลือกบัญชี → Advanced → Go to … (unsafe) → Allow
- เมนูนี้จะทำงานต่อเอง (ถ้าไม่ทำงาน ให้กดซ้ำอีกครั้ง) รอประมาณ 1 นาที คำตอบของบอทจะโผล่ในคอลัมน์ คำตอบบอท
- อ่านทีละข้อ เทียบกับคอลัมน์ บอทควรทำ แล้วติ๊ก ผ่าน [VERIFY: template ตัดสินผ่าน/ไม่ผ่านเอง หรือให้คนติ๊ก]
ผ่านครบ 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 ผิด แก้แล้วรันชุดทดสอบใหม่
Deploy เป็น Web app
เป้าหมาย — ได้ URL ที่ LINE ใช้ส่งข้อความลูกค้ามาให้บอท
- เมนู Extensions → Apps Script
- มุมขวาบน กด Deploy → New deployment
- กดรูปเฟือง ⚙ ข้าง Select type → เลือก Web app
- ตั้งค่า:
- Execute as: Me
- Who has access: Anyone
- กด Deploy → ถ้าขอสิทธิ์ ให้ทำแบบขั้นที่แล้ว
- copy Web app URL
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
ตั้ง Webhook ใน LINE
เป้าหมาย — บอก LINE ว่าเมื่อมีลูกค้าทัก ให้ส่งข้อความไปที่บอทของเรา
- เปิด LINE Developers Console ↗ → channel ของร้าน → แท็บ Messaging API
- หัวข้อ Webhook settings → ช่อง Webhook URL → กด Edit
- วาง URL ที่ลงท้ายด้วย /exec → กด Update
- กด Verify
- เปิดสวิตช์ Use webhook
กด Verify แล้วขึ้น Success และสวิตช์ Use webhook เป็นสีเขียว
Verify ขึ้น error เรื่อง redirect หรือ 302
เป็นนิสัยของปุ่ม Verify กับ Apps Script [VERIFY: ยังเกิดอยู่ไหม] ถ้าตั้งค่าอื่นถูกหมด ให้ข้ามไปทดสอบจากมือถือ (ขั้นสุดท้าย) ก่อนสรุปว่าพัง
ลืมเปิด Use webhook
บอทจะไม่ได้รับข้อความเลย กลับมาเปิดสวิตช์นี้
ปิดข้อความตอบกลับอัตโนมัติของ LINE
เป้าหมาย — ไม่ให้ข้อความอัตโนมัติของ LINE ตอบซ้อนกับบอท
- กลับไปที่ LINE OA Manager ↗ → Settings
- เมนูซ้าย Response settings [VERIFY: LINE เปลี่ยนชื่อและตำแหน่งเมนูนี้บ่อย]
- ตั้งค่า:
- Auto-response messages: ปิด
- Webhooks: เปิด
- Greeting message: เปิดไว้ได้ (ข้อความต้อนรับตอนแอดเพื่อน)
Auto-response ปิด และ Webhooks เปิด — เช็คซ้ำได้ใน LINE Developers Console → แท็บ Messaging API: บรรทัด Auto-reply messages ต้องเป็น Disabled
ลูกค้าได้ข้อความ ขอบคุณที่ส่งข้อความถึงเรา ซ้อนกับคำตอบบอท
Auto-response ยังเปิดอยู่ กลับมาปิดในหน้านี้
ทดสอบจากมือถือ
เป้าหมาย — คุยกับบอทจริงๆ แบบที่ลูกค้าจะเห็น
- LINE Developers Console → แท็บ Messaging API → สแกน QR code ด้วยมือถือ → แอดเพื่อน
- ส่งข้อความเหล่านี้ทีละข้อความ:
ร้านเปิดกี่โมงคะมีโปรอะไรไหมแพ้กุ้ง กินต้มยำได้ไหม
บอทตอบภายในไม่กี่วินาที ลงท้าย "ค่ะ" เรียกตัวเองว่าน้องมะลิ ไม่แต่งโปรโมชัน และเตือนเรื่องกุ้งในต้มยำ
บอทเงียบ ไม่ตอบอะไรเลย
ไล่เช็คตามลำดับ: (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 แบบฟรีจำกัดจำนวนข้อความต่อวัน และจำแชทยาวๆ ได้ไม่ค่อยดี เส้นทางนี้เลยออกแบบมาแบบนี้:
- คุยต่อในแชทเดิมได้เลย — M1 เริ่มด้วย prompt ฉบับเต็ม จากนั้น M2–M4 ส่งแค่ prompt สั้นๆ ต่อในแชทเดิม ถ้าแชทยาวจน AI เริ่มลืม หรือโควต้าหมด ทุก milestone มี prompt ฉบับเต็ม ไว้เปิดแชทใหม่ ความคืบหน้าอยู่ในไฟล์
Code.gsย้ายแชทหรือเปลี่ยน AI ได้ตลอด - ขอโค้ด "ทั้งไฟล์" เสมอ — วางทับ
Code.gsทั้งไฟล์ทุกครั้ง ไม่ต้องหาว่าจะแทรกตรงไหน - ทดสอบใน Apps Script ก่อน — ฟังก์ชัน
testBotแสดงคำตอบของบอททันที ไม่ต้อง deploy ไม่ต้องหยิบมือถือ ประหยัดข้อความกับ AI
ไม่ต้องเริ่มใหม่ พรุ่งนี้มาต่อ หรือเปิด AI ตัวอื่นแล้วใช้ prompt ฉบับเต็ม ของ milestone ที่ทำอยู่ได้เลย และถ้าติดจนไปต่อไม่ได้ ทุก milestone มี โค้ดสำรอง ให้วางแล้วไปต่อ ยังนับว่าถึงเส้นชัย
ทำสำเนา Sheet ข้อมูล (ไม่มีโค้ด)
เป้าหมาย — ได้ Sheet ที่มีแท็บและข้อมูลร้านตัวอย่างครบ พร้อมให้บอทที่คุณสร้างมาอ่าน
-
กดปุ่มนี้ (ล็อกอิน Google ไว้ก่อน)
ทำสำเนา Sheet ข้อมูล ↗ -
หน้า Copy document → กด Make a copy
-
ตั้งชื่อไฟล์
บอท ครัวมะลิ (build)


มีแท็บ Persona, FAQ, Menu, Test พร้อมข้อมูลร้านตัวอย่าง แถวที่ 1 ของแต่ละแท็บเป็นชื่อคอลัมน์ภาษาอังกฤษ เช่น topic, answer — ห้ามแก้ชื่อพวกนี้ โค้ดอ่านข้อมูลจากชื่อคอลัมน์
ไม่เห็นปุ่ม Make a copy
ล็อกอิน Google ก่อน หรือใช้บัญชี Gmail ส่วนตัวแทนบัญชีองค์กร
เปิด Apps Script และเก็บคีย์ไว้ในสคริปต์
เป้าหมาย — เตรียมที่วางโค้ด และเก็บคีย์ไว้ในที่ปลอดภัย — คีย์ไม่ต้องผ่านแชท AI เลย
- ใน Sheet เมนู Extensions → Apps Script
- กดชื่อโปรเจกต์มุมซ้ายบน (Untitled project) → ตั้งชื่อ
บอท ครัวมะลิ→ Rename - เมนูซ้าย กด ⚙ Project Settings → เลื่อนลงล่างสุด → Add script property [VERIFY: ชื่อปุ่ม]
- เพิ่ม 2 แถว ชื่อ property ใช้ปุ่ม copy ด้านล่าง กันพิมพ์ผิด:
LINE_CHANNEL_ACCESS_TOKEN→ Value: LINE token (ขั้นที่ 3)AI_API_KEY→ Value: AI key (ขั้นที่ 4)
- กด Save script properties
LINE_CHANNEL_ACCESS_TOKENAI_API_KEY
เดี๋ยวเราจะ copy โค้ดไปให้ AI อ่านหลายรอบ ถ้าคีย์อยู่ในโค้ด คีย์ก็จะหลุดไปอยู่ในแชทด้วย เก็บใน Script Properties แล้วโค้ดจะอ่านเองตอนทำงาน
Script Properties มี 2 แถว ชื่อสะกดตรงตามด้านบนทุกตัวอักษร
หาเมนู Project Settings ไม่เจอ
เป็นไอคอนเฟือง ⚙ แถบซ้ายสุดของหน้า Apps Script (ใต้ไอคอนนาฬิกา Triggers)
ขอโค้ดชุดแรกจาก AI
เป้าหมาย — ได้โค้ดที่รับข้อความจาก LINE แล้วตอบกลับ — ตอนนี้แค่ทวนข้อความ ยังไม่ฉลาด
- เปิด AI แชทที่คุณใช้ → แชทใหม่
- copy prompt นี้ไปส่งได้เลย (รอบแรกไม่มีส่วนต้องแก้)
ช่วยเขียนโค้ด 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 ว่าง)- ในคำตอบของ AI กด copy ที่ code block
- กลับไป 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 ทั้งไฟล์ในก้อนเดียว ไม่ตัดส่วนไหนออก"
Deploy และต่อเข้า LINE
เป้าหมาย — ส่งข้อความจากมือถือ แล้วบอททวนข้อความกลับมาได้จริง
- Apps Script มุมขวาบน Deploy → New deployment → กด ⚙ ข้าง Select type → Web app
- ตั้งค่า Execute as: Me · Who has access: Anyone → กด Deploy
- Google ขอสิทธิ์: Authorize access → เลือกบัญชี → Advanced → Go to … (unsafe) → Allow
- copy Web app URL (ลงท้ายด้วย /exec)
- เปิด LINE Developers Console ↗ → channel ของร้าน → แท็บ Messaging API → Webhook URL → Edit → วาง → Update → เปิด Use webhook
- เปิด LINE OA Manager ↗ → Settings → Response settings → Auto-response: ปิด · Webhooks: เปิด [VERIFY: ชื่อเมนู] (เช็คได้ใน LINE Developers Console แท็บ Messaging API: Auto-reply messages ต้องเป็น Disabled)
- มือถือ: สแกน QR code ในแท็บ Messaging API → แอดเพื่อน → พิมพ์
สวัสดี
Anyoneบอทตอบกลับว่า ได้รับข้อความ: สวัสดี (หรือทวนข้อความคล้ายๆ กัน) ผ่าน M1 แล้ว
บอทเงียบ ไม่ตอบอะไรเลย
Apps Script → เมนูซ้าย Executions ดูรายการล่าสุด
ถ้า ไม่มีรายการเลย แปลว่า LINE ยังส่งมาไม่ถึง: เช็ค Webhook URL, Use webhook และ Who has access ต้องเป็น Anyone (ไม่ใช่ Anyone with Google account)
ถ้า มีรายการสีแดง กดเข้าไป copy ข้อความ error แล้วส่งให้ AI ในแชทเดิมด้วย prompt นี้
เจอ error นี้ใน Apps Script: [[วางข้อความ error]] ช่วยแก้ แล้วส่ง Code.gs กลับมาทั้งไฟล์ในก้อนเดียว ห้ามเปลี่ยนชื่อฟังก์ชัน URL และชื่อ model
เปิดแชทใหม่แทน? ใช้ prompt ฉบับเต็ม
ใช้เมื่อ แชทเดิมยาวจน AI เริ่มลืมหรือตอบมั่ว · โควต้าหมดแล้วย้ายไป AI ตัวอื่น · เพิ่งวางโค้ดสำรอง
copy โค้ดทั้งไฟล์จาก Code.gs (Ctrl+A → Ctrl+C) แล้ววางแทนส่วนที่ไฮไลต์ ในแชทใหม่
โค้ด 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 ตรงนี้]]
ลูกค้าได้ข้อความอัตโนมัติของ LINE ซ้อนมาด้วย
Auto-response ยังเปิดอยู่ กลับไปปิดในข้อ 6
ปุ่ม Verify ใน LINE ขึ้น error เรื่อง redirect / 302
ลองส่งข้อความจริงจากมือถือก่อน ปุ่ม Verify เข้มงวดกว่าการใช้งานจริง [VERIFY: ยังเกิดอยู่ไหม]
ตอบจาก FAQ ด้วย AI
เป้าหมาย — บอทใช้ AI ตอบจากแท็บ FAQ และทดสอบได้ใน Apps Script โดยไม่ต้องใช้มือถือ
- กลับไปที่แชทเดิมกับ AI → copy prompt นี้ไปส่งต่อได้เลย
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) แล้ววางแทนส่วนที่ไฮไลต์ ในแชทใหม่
ช่วยเขียนโค้ด 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 ตรงนี้]]- copy โค้ดที่ได้ → วางทับ
Code.gsทั้งไฟล์ → Save - แถบเครื่องมือด้านบน เลือกฟังก์ชัน
testBot→ กด Run (ครั้งแรกจะขอสิทธิ์เพิ่ม เพราะเริ่มอ่าน Sheet และเรียก AI) - ดูผลใน Execution log ด้านล่าง

ใน log: "ร้านเปิดกี่โมงคะ" ได้เวลาตาม FAQ และ "มีโปรอะไรไหม" บอทตอบว่ายังไม่มีข้อมูล ไม่แต่งโปรขึ้นมาเอง
- ผ่านแล้ว เอาโค้ดใหม่ขึ้นใช้งานจริง:
- 1. Apps Script มุมขวาบน Deploy → Manage deployments
- 2. กด ✎ (Edit) → Version: New version → Deploy
- 3. URL เดิมใช้ต่อได้ ไม่ต้องแก้อะไรใน LINE
- ถามจากมือถือ
ร้านเปิดกี่โมงคะต้องได้คำตอบแบบเดียวกับใน 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 นี้
เจอ error นี้ใน Apps Script: [[วางข้อความ error]] ช่วยแก้ แล้วส่ง Code.gs กลับมาทั้งไฟล์ในก้อนเดียว ห้ามเปลี่ยนชื่อฟังก์ชัน URL และชื่อ model
เปิดแชทใหม่แทน? ใช้ prompt ฉบับเต็ม
ใช้เมื่อ แชทเดิมยาวจน AI เริ่มลืมหรือตอบมั่ว · โควต้าหมดแล้วย้ายไป AI ตัวอื่น · เพิ่งวางโค้ดสำรอง
copy โค้ดทั้งไฟล์จาก Code.gs (Ctrl+A → Ctrl+C) แล้ววางแทนส่วนที่ไฮไลต์ ในแชทใหม่
โค้ด 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 ตรงนี้]]
ใส่บุคลิกของร้าน: Persona + Menu
เป้าหมาย — บอทพูดเหมือนคนในร้าน รู้เมนู และทำตามกติกาความปลอดภัยครบ
- ในแชทเดิม ส่ง prompt นี้ต่อ
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) แล้ววางแทนส่วนที่ไฮไลต์ ในแชทใหม่
ช่วยเขียนโค้ด 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 ตรงนี้]]- วางทับ
Code.gs→ Save → เลือกtestBot→ Run
ใน log บอทเรียกตัวเองว่า น้องมะลิ ลงท้าย ค่ะ และ:
- ข้าวผัดกุ้ง → บอกราคาตาม Menu
- แพ้กุ้ง → บอกว่าต้มยำมีกุ้ง ให้แจ้งร้าน ไม่รับประกันว่าปลอดภัย
- จองโต๊ะ → ไม่ยืนยันเอง บอกช่องทางติดต่อร้าน
- อาหารเค็ม → ขอโทษ และส่งต่อคนจริง
- ผ่านแล้ว:
- 1. Apps Script มุมขวาบน Deploy → Manage deployments
- 2. กด ✎ (Edit) → Version: New version → Deploy
- 3. URL เดิมใช้ต่อได้ ไม่ต้องแก้อะไรใน LINE
บอทตอบยาวเกินไป
ในแชทเดิมพิมพ์ว่า "คำตอบยาวเกิน ให้จำกัดไม่เกิน 3 ประโยค ส่ง Code.gs ทั้งไฟล์" ถ้าแชทเดิมโควต้าหมด ใช้ prompt ฉบับเต็มของ M3 ในแชทใหม่ แล้วเติมประโยคนี้ต่อท้าย
บอทยังไม่ใช้ชื่อหรือคำลงท้ายจาก Persona
เช็คแท็บ Persona ว่าแถวที่ 1 เป็น field และ value และไม่ได้ลบแถวไหนออก
error อื่นๆ
เจอ error นี้ใน Apps Script: [[วางข้อความ error]] ช่วยแก้ แล้วส่ง Code.gs กลับมาทั้งไฟล์ในก้อนเดียว ห้ามเปลี่ยนชื่อฟังก์ชัน URL และชื่อ model
เปิดแชทใหม่แทน? ใช้ prompt ฉบับเต็ม
ใช้เมื่อ แชทเดิมยาวจน AI เริ่มลืมหรือตอบมั่ว · โควต้าหมดแล้วย้ายไป AI ตัวอื่น · เพิ่งวางโค้ดสำรอง
copy โค้ดทั้งไฟล์จาก Code.gs (Ctrl+A → Ctrl+C) แล้ววางแทนส่วนที่ไฮไลต์ ในแชทใหม่
โค้ด 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 ตรงนี้]]
ผ่านชุดทดสอบ
เป้าหมาย — บอทผ่านทุกข้อในแท็บ Test — เส้นชัยเดียวกับเส้นทาง Template
- ในแชทเดิม ส่ง prompt นี้ต่อ
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) แล้ววางแทนส่วนที่ไฮไลต์ ในแชทใหม่
ช่วยเขียนโค้ด 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 ตรงนี้]]- วางทับ
Code.gs→ Save - กลับไปที่ Sheet → refresh หน้า → เมนูใหม่ บอท → รันชุดทดสอบ (ครั้งแรกขอสิทธิ์ ให้กดซ้ำอีกครั้งหลัง Allow)
- รอประมาณ 1–2 นาที คำตอบจะขึ้นในคอลัมน์
bot_answer - อ่านทีละข้อ เทียบกับคอลัมน์
expectedแล้วติ๊กpassเอง
ผ่านครบ 10 ข้อ แล้วลองถาม 3 ข้อจากมือถือ (อย่าลืม Deploy เวอร์ชันใหม่ก่อน) ได้ผลแบบเดียวกับในชุดทดสอบ
- 1. Apps Script มุมขวาบน Deploy → Manage deployments
- 2. กด ✎ (Edit) → Version: New version → Deploy
- 3. URL เดิมใช้ต่อได้ ไม่ต้องแก้อะไรใน LINE
ไม่เห็นเมนู บอท ใน Sheet
refresh หน้า Sheet อีกครั้ง หรือรัน runTests จาก Apps Script โดยตรงก็ได้
แก้ข้อหนึ่งผ่าน แต่อีกข้อพัง
รันชุดทดสอบใหม่ ทั้งชุด ทุกครั้งที่แก้ แล้วส่งทุกข้อที่ไม่ผ่านไปในข้อความเดียว
Exceeded maximum execution time
ชุดทดสอบใช้เวลานานเกินที่ Apps Script ยอม ลบแถวที่ผ่านแล้วออกชั่วคราว รันเฉพาะข้อที่เหลือ
เส้นชัย: บอทผ่านชุดทดสอบ
บอทผ่านชุดทดสอบใน Sheet และตอบจากมือถือได้จริง ทั้งสองเส้นทางมาถึงจุดเดียวกันตรงนี้
ก่อนเปิดให้ลูกค้าจริงใช้: เปลี่ยนข้อมูลร้านตัวอย่างเป็นข้อมูลร้านคุณ แล้ว รันชุดทดสอบอีกรอบ
ปรับแต่งด้วย AI
Template เป็นจุดเริ่มต้น อยากให้บอททำอะไรเพิ่ม ให้ AI ช่วยได้ ขอแค่ให้ AI รู้จัก template ก่อน และทำตาม กิจวัตรความปลอดภัย ทุกครั้ง
1. ให้ AI รู้จัก template
- เปิด Apps Script (Extensions → Apps Script) → copy โค้ดทุกไฟล์
- ใน AI แชท สร้าง project ใหม่แล้วใส่โค้ดเป็นไฟล์ของ project (ถ้าไม่มีฟีเจอร์ project ให้แนบไฟล์โค้ดไปกับข้อความแรก)
- เริ่มแชทใน project ด้วย prompt นี้
บอท LINE ร้านอาหารนี้สร้างจาก template โค้ดแนบมาด้วย - รันบน Google Apps Script ที่ผูกกับ Google Sheet - แท็บ Persona = วิธีพูดของบอท, FAQ = topic และ answer, Menu = เมนู ราคา ความเผ็ด ส่วนผสมที่ควรระวัง, Test = ชุดทดสอบ, Settings = คีย์ (ห้ามขอค่าคีย์) กติกาเวลาช่วยแก้: - ถ้าแก้ได้ด้วยการแก้ข้อมูลใน Sheet ให้แนะนำวิธีนั้นก่อนแก้โค้ด - ถ้าต้องแก้โค้ด บอกชัดๆ ว่าไฟล์ไหน ฟังก์ชันไหน แล้วส่งฟังก์ชันที่แก้มาทั้งก้อน - ห้ามทำให้บอทแต่งราคา โปรโมชัน เวลาเปิด-ปิด หรือยืนยันการจองเอง - เตือนให้ deploy เวอร์ชันใหม่และรันชุดทดสอบหลังแก้ทุกครั้ง สิ่งที่อยากให้บอททำเพิ่ม: [[อธิบายสิ่งที่อยากได้]]
2. ตัวอย่างสิ่งที่ขอได้
- "ถ้าลูกค้าพิมพ์ภาษาอังกฤษมา ให้ตอบเป็นภาษาอังกฤษ"
- "เพิ่มแท็บ Promotion ให้บอทตอบโปรได้ เฉพาะโปรที่อยู่ในแท็บและยังไม่หมดอายุ"
- "ส่งรูปเมนูเมื่อลูกค้าถามว่ามีเมนูอะไรบ้าง"
- "เมื่อลูกค้าไม่พอใจ ให้แจ้งเตือนเข้ากลุ่ม LINE ของพนักงานด้วย"
ทุกครั้งที่เพิ่มความสามารถ เพิ่มแถวในแท็บ Test ที่ทดสอบสิ่งนั้นด้วย
3. กิจวัตรความปลอดภัย (ทำทุกครั้ง)
- ทำสำเนาก่อนแก้ — File → Make a copy ตั้งชื่อ
สำรอง วันที่เก็บไว้ - แก้ทีละอย่าง — อย่าขอให้ AI แก้หลายเรื่องในครั้งเดียว
- Deploy เวอร์ชันใหม่ — Deploy → Manage deployments → ✎ → Version: New version → Deploy
- รันชุดทดสอบทั้งชุด — ต้องผ่านครบเหมือนเดิม + ข้อใหม่ที่เพิ่ม
- ถ้าพัง ย้อนกลับ — Manage deployments → ✎ → เลือกเวอร์ชันก่อนหน้า → Deploy (URL เดิม ไม่ต้องแก้ใน LINE) หรือ copy โค้ดจากไฟล์สำรองกลับมา