SumoSunday

ซีรีส์ Apps Script ด้วย AI · ตอนที่ 3 จาก 3

สั่ง AI เขียน Apps Script: prompt สั้นๆ ได้โค้ดที่รันแล้ว error ส่วน prompt ที่บอกครบ 6 ส่วนได้ผลตรงทุกแถว

21 ต.ค. 2569 · อ่าน 9 นาที

เราสั่ง AI เขียนสคริปต์สรุปวันลาของทีมด้วยงานเดียวกัน 2 แบบ แบบสั้นได้โค้ดสำหรับชีตที่ AI เดาเอง รันจริงแล้ว error ส่วนแบบที่บอกโครงชีต กติกา และข้อบังคับของโค้ด ได้คำถามกลับจาก AI ก่อน 3 ข้อ แล้วได้ผลตรงกับที่คิดมือทุกแถว รวมถึงกับดัก 4 จุด ตอนที่ 3 ของซีรีส์ Apps Script ด้วย AI พร้อมโครง prompt 6 ส่วน และ 6 ข้อที่ต้องเช็กก่อนกด Run

ตอนที่ 3 ของซีรีส์ "Apps Script ด้วย AI" ต่อจากตอนที่แล้วที่เราจัดชีตให้สคริปต์อ่านออก

ตอนนี้เป็นตอนที่ใช้บ่อยที่สุดในซีรีส์ คือสั่ง AI เขียนสคริปต์ให้ เราลองงานเดียวกัน 2 แบบ แล้วรันโค้ดที่ได้ในชีตจริงทั้งคู่ โดยไม่แก้โค้ดเลยสักตัวอักษร

ข้อมูล ณ ตุลาคม 2569 ผลในบทความนี้มาจากการลองจริงของเรา เราสั่ง Claude (โมเดล Claude Opus 5.5) ผ่าน Claude Code แล้วรันโค้ดที่ได้ในชีตจริงโดยไม่แก้ ทีมออฟฟิศและพนักงานในตัวอย่างเป็นข้อมูลสมมติ คำตอบที่คุณได้จะใช้คำต่างไป ให้ดูที่ตัวเลขและเหตุผลเป็นหลัก

งานที่ให้ AI ทำ: สรุปวันลาของทีม

ไฟล์ใบลาของทีมเล็กๆ มี 2 แท็บ

  • ใบลา วันที่ยื่น ชื่อ ประเภทลา วันเริ่ม วันสิ้นสุด จำนวนวัน สถานะ (12 ใบ)
  • โควตา ชื่อ ทีม และสิทธิ์ลาพักร้อน ลาป่วย ลากิจ ต่อปี (5 คน)

อยากได้สรุปว่าแต่ละคนใช้วันลาไปเท่าไร เหลือเท่าไร แยกตามประเภท

เราใส่กับดักแบบที่เจอในงานจริงไว้ 4 จุด

  1. กิตติมีใบลาพักร้อน 2 วันที่ยัง "รออนุมัติ" ถ้านับรวม จะเหลือวันลาติดลบ
  2. ธนามีใบลา 3 วันที่ "ไม่อนุมัติ"
  3. กิตติลาครึ่งวัน จำนวนวันเป็น 0.5
  4. ชื่อ "สมชาย" ในใบลาใบหนึ่งมีวรรคต่อท้าย ตาเรามองไม่เห็น

และมี "ปิยะ" พนักงานใหม่ที่มีใบลาแต่ยังไม่มีชื่อในแท็บโควตา

ก่อนให้ AI เขียน เราคิดมือไว้ก่อนว่าคำตอบที่ถูกคืออะไร เช่น สมชายใช้ลาพักร้อนไป 5 วัน (3 + 2 จากใบที่มีวรรคท้ายชื่อ) เหลือ 5 วัน ส่วนกิตติเหลือ 1 วัน ไม่ใช่ -1

ไฟล์ตัวอย่าง: ดาวน์โหลด "ชีตตัวอย่าง Apps Script ตอน 3: ใบลาและโควตาวันลา" ได้ที่หน้าเทมเพลต (สมัครสมาชิกฟรีก่อนดาวน์โหลด) ใบลาในไฟล์เป็นปี 2026 ทั้งหมด ไฟล์เป็น Excel ต้องเปลี่ยนเป็น Google ชีตก่อนใช้ ดังนี้

  1. อัปไฟล์ขึ้น Google Drive แล้วเปิดไฟล์
  2. กด File › Save as Google Sheets ระบบจะเปิดไฟล์ใหม่ที่เป็น Google ชีต ใช้ไฟล์ใหม่นี้ในทุกขั้นต่อจากนี้
  3. กด File › Settings แล้วตั้งช่อง Locale เป็น Thailand ตามที่เราใช้ทดสอบ

แบบที่ 1: สั่งสั้นๆ ประโยคเดียว

ประโยคที่เราพิมพ์มีแค่นี้

เขียน Google Apps Script สรุปวันลาคงเหลือของพนักงานแต่ละคนให้หน่อย

AI ตอบยาวและดูดีมาก มีโค้ดราว 150 บรรทัด มีวิธีติดตั้ง มีระบบนับวันทำงานที่ตัดเสาร์-อาทิตย์และวันหยุดให้ด้วย และบอกตรงๆ ว่า "ผมไม่รู้ว่าชีตของคุณจัดคอลัมน์แบบไหน เลยกำหนดโครงสร้างขึ้นมาเอง"

สิ่งที่มันเดาเองทั้งหมดไม่ตรงกับชีตจริง

  • ชื่อแท็บ "โควต้าวันลา" กับ "บันทึกการลา" (ของจริงคือ "โควตา" กับ "ใบลา")
  • มีคอลัมน์ "รหัสพนักงาน" ซึ่งชีตเราไม่มี
  • อ่านคอลัมน์ตามตำแหน่ง ไม่ใช่ตามชื่อหัวตาราง
  • แถมฟังก์ชันตั้งเวลาให้รันเองทุกเช้า 7 โมง ซึ่งเราไม่ได้ขอ

พอวางโค้ดแล้วกด Run หน้าขอสิทธิ์ขอ 2 ข้อ คือแก้สเปรดชีตได้ทุกไฟล์ และ "ให้แอปทำงานตอนที่คุณไม่อยู่" ซึ่งเราไม่ได้ขอให้สคริปต์ทำงานเองเลย ในโค้ดก็มีฟังก์ชันตั้งเวลาที่เราไม่ได้ขอเช่นกัน

ผลที่ได้คือ error ทันที

ผลลัพธ์
Error: ไม่พบชีต "โควต้าวันลา" หรือ "บันทึกการลา"

โค้ดนี้ไม่ได้ผิด มันเขียนมาสำหรับชีตอีกไฟล์หนึ่งที่ไม่มีอยู่จริง ถ้าจะใช้ต่อ เราต้องแก้ชีตให้เหมือนที่ AI จินตนาการ หรือกลับไปเล่าให้ AI ฟังใหม่ ซึ่งก็คือแบบที่ 2

แบบที่ 2: บอก AI ครบ 6 ส่วน

ใช้งานเดียวกัน แต่บอก AI ครบ 6 เรื่อง

ส่วนเราใส่อะไรกันปัญหาอะไร
1. งานสรุปวันลาที่ใช้และคงเหลือ แยกประเภท—
2. ชีตที่มีชื่อแท็บ หัวตารางอยู่แถว 1 และก๊อปหัวตารางกับ 3–4 แถวแรกจากชีตไปวางAI ไม่ต้องเดาชื่อแท็บและคอลัมน์
3. กติกาของงานนับเฉพาะ "อนุมัติ" · ครึ่งวันใส่ 0.5 · มีพนักงานใหม่ที่ไม่มีในโควตาAI รู้ว่าใบที่รออนุมัติ ลาครึ่งวัน และพนักงานใหม่ ต้องนับอย่างไร
4. ผลลัพธ์ที่อยากได้แท็บใหม่ชื่อ "สรุปวันลา" คอลัมน์อะไรบ้างได้หน้าตาตามที่ต้องใช้
5. ข้อบังคับของโค้ด@OnlyCurrentDoc · ห้ามแก้แท็บต้นทาง · หาคอลัมน์จากชื่อ · ตัดวรรคก่อนเทียบ · ข้อมูลแปลกห้ามข้ามเงียบๆชื่อที่มีวรรคท้ายถูกนับรวม สคริปต์ขอสิทธิ์แค่ไฟล์นี้ และข้อมูลต้นทางไม่ถูกแก้
6. ถามก่อนเขียนถ้าข้อมูลไม่พอให้ถามไม่เกิน 3 ข้อ ถ้าพอให้ตอบเป็นโค้ด + วิธีรัน + ตัวอย่างคิดมือ 1 คนAI ไม่เดากติกาที่เราลืมบอก

ข้อมูลที่ก๊อปจากชีตไปวาง ถ้าเป็นข้อมูลจริงของคน ให้เปลี่ยนชื่อเป็นชื่อสมมติก่อน AI ต้องรู้แค่หน้าตาของข้อมูล ไม่ต้องรู้ว่าเป็นใคร

prompt ฉบับเต็มแบบเติมช่องว่างอยู่ในคลัง prompt (สมัครสมาชิกฟรีแล้วคัดลอกได้)

AI ถามกลับ 3 ข้อ ก่อนเขียนโค้ด

  1. นับใบลาช่วงไหน AI ให้เหตุผลว่าโควตาในแท็บน่าจะเป็นต่อปี ถ้าชีตมีใบลาหลายปีปนกัน นับรวมแล้วจะเกินจริง มันเสนอให้นับเฉพาะใบที่วันเริ่มอยู่ในปีปัจจุบัน
  2. พนักงานที่ไม่มีในแท็บโควตา จะให้แสดงในตารางหลักไหม
  3. คนที่ยังไม่เคยลา และคนที่ลาเกินโควตา จะแสดงยังไง

ข้อ 1 เป็นกติกาที่เราลืมบอกจริงๆ ทั้งที่สำคัญมาก ไฟล์ใบลาที่ใช้มาหลายปีจะนับผิดทันที นี่คือเหตุผลที่ควรใส่ส่วนที่ 6 ทุกครั้ง

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

เราตอบว่า "ตามที่เสนอ" แล้ว AI ส่งโค้ด วิธีรัน และตัวอย่างคิดมือของสมชายมาให้เทียบ

ผลจริงในชีต: ตรงกับที่คิดมือทุกแถว

วางโค้ด กด Run ได้แท็บ "สรุปวันลา" ทันที เราเทียบกับคำตอบที่คิดมือไว้ ตรงทุกแถว

ชื่อพักร้อน ใช้/เหลือป่วย ใช้/เหลือกิจ ใช้/เหลือ
สมชาย5 / 52 / 280 / 3
วิภา3 / 71 / 290 / 3
กิตติ5 / 10 / 300.5 / 2.5
นภา5 / 50 / 301 / 2
ธนา0 / 60 / 300 / 3

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

ที่ยังไม่ดี:

  • หน้าตายังต้องแก้ต่อ คอลัมน์แรกกว้างมาก เพราะบรรทัดหมายเหตุยาวๆ อยู่คอลัมน์เดียวกัน แล้วสคริปต์ขยายความกว้างตามข้อความที่ยาวที่สุด ผลถูก แต่ต้องสั่งแก้อีกรอบ
  • นับเฉพาะปีปัจจุบัน ตามที่ตกลงกันในคำถามข้อ 1 ข้อมูลตัวอย่างเป็นปี 2026 โค้ดนี้นับเฉพาะใบลาที่วันเริ่มอยู่ในปีที่กด Run ข้อมูลตัวอย่างจึงได้ผลตามตารางข้างบนเมื่อรันในปี 2026 ถ้าตัวเลขเป็น 0 ทั้งหมดในปีอื่น ไม่ได้แปลว่าโค้ดพัง

วิธีเช็กผล: คิดมือ 1 คนที่มีกับดัก แล้วเทียบกับผลจริง

AI ไม่ได้รันโค้ดให้ มันบอกเองว่า "ผมยังไม่ได้รันโค้ดนี้กับชีตจริง" แล้วยกตัวอย่างคิดมือมาให้เทียบ

วิธีนี้ใช้กับงานของคุณได้ทุกครั้ง แต่เลือกคนที่มีกับดัก ไม่ใช่คนที่ง่ายที่สุด ตัวอย่างของ AI คือสมชาย ซึ่งมันคิดจาก 4 แถวที่เราส่งไป ได้ "ใช้ไป 3 เหลือ 7" แต่ในชีตจริง สมชายมีอีกใบที่ชื่อมีวรรคท้าย คำตอบที่ถูกคือใช้ไป 5 เหลือ 5 ถ้าเราเทียบกับตัวเลขของ AI โดยไม่คิดเอง จะคิดว่าโค้ดผิด ทั้งที่โค้ดถูก

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

เช็กลิสต์ 6 ข้อก่อนกด Run โค้ดที่ AI เขียน

  1. บรรทัดแรกมี @OnlyCurrentDoc ถ้างานแตะแค่ไฟล์เดียว
  2. ชื่อแท็บและชื่อคอลัมน์ในโค้ดตรงกับชีต ค้นในโค้ดด้วย Ctrl+F (Mac ใช้ Cmd+F) ทีละชื่อ
  3. เขียนลงที่ไหน ต้องเป็นแท็บใหม่หรือแท็บผลลัพธ์ ไม่ใช่แท็บข้อมูลต้นทาง
  4. มีอะไรที่ไม่ได้ขอไหม เช่น newTrigger (ตั้งเวลา) MailApp หรือ GmailApp (ส่งอีเมล) ถ้าไม่ได้ขอ ให้ถาม AI ว่าใส่มาทำไม หรือสั่งให้ตัดออก
  5. รันกับสำเนาก่อน File › Make a copy แล้วลองกับไฟล์นั้น
  6. เทียบกับคำตอบที่คิดมือ ของคนที่มีกับดัก

ข้อ 4 คือสิ่งที่เกิดกับแบบที่ 1 ของเรา ถ้าไม่อ่าน เราจะอนุญาตให้สคริปต์ทำงานเองทุกเช้าโดยไม่รู้ตัว

สรุป: ทำไมแบบที่ 2 ได้ผล

prompt สั้นไม่ได้ทำให้ AI เขียนโค้ดแย่ลง แต่ทำให้ AI ต้องเดาชีตของเรา ส่วน prompt 6 ส่วนต้องเตรียมมากกว่า แต่ในการทดลองของเรา ได้โค้ดที่ใช้ได้ตั้งแต่ครั้งแรก

ส่วนที่คุ้มที่สุดคือส่วนที่ 6 "ถามก่อนเขียน" รอบแรก AI ใช้มันถามกติกาที่เราลืมบอก รอบที่สองมันบอกสิ่งที่ตัดสินใจเองให้เห็น

ตอนถัดไปเราจะใช้ prompt แบบเดียวกันทำงานที่สคริปต์ทำเองได้โดยไม่ต้องกดอะไร คือมีคนส่ง Google Form ขอลาแล้วระบบส่งอีเมลยืนยันให้อัตโนมัติ

อาทิตย์ละสกิล เดี๋ยวก็เก่ง