
Queue Restaurant คือระบบคิวสำหรับร้านอาหาร: ลูกค้าสแกน QR หน้าร้าน กดปุ่มเดียว ได้เลขคิว แล้วดูสถานะคิวของตัวเองอัปเดตสดอยู่บนมือถือได้เลยโดยไม่ต้องกดรีเฟรช ฝั่งร้านเรียกคิวถัดไปจากแดชบอร์ดที่ล็อกด้วยรหัสผ่าน ส่วนจอทีวีหรือแท็บเล็ตที่แปะไว้หน้าร้านก็โชว์ "กำลังเรียกคิว" ให้เห็นทั้งร้าน — ทั้งหมดนี้รันอยู่บน Google Apps Script + Google Sheets ล้วน ๆ
จุดที่ทำให้ระบบนี้ตั้งได้เร็ว: ไม่มีเซิร์ฟเวอร์ ไม่มีค่าฐานข้อมูล ไม่มีขั้นตอน build ใด ๆ Sheet หนึ่งไฟล์คือทั้งฐานข้อมูลคิวและตัวเก็บโค้ด แก้อะไรก็แก้ที่ Sheet เดียว
โค้ดทั้งหมด: ติดมากับ Sheet เทมเพลตด้านล่างอยู่แล้ว (container-bound script) ไม่ต้องไปโหลดที่ไหนแยก
ค่าใช้จ่าย: ศูนย์บาท ทั้งระบบวิ่งอยู่บน Google Apps Script + Sheets ซึ่งฟรีสำหรับปริมาณการใช้งานระดับร้านอาหารทั่วไป
สิ่งที่ระบบนี้ไม่มี (ตั้งใจตัดออก): ระบบจองคิวล่วงหน้า, การแจ้งเตือนผ่าน SMS/LINE, ประวัติคิวย้อนหลังแบบรายงาน, รองรับหลายสาขาในไฟล์เดียว — ถ้าต้องการฟีเจอร์พวกนี้ นี่ไม่ใช่ระบบสำหรับคุณ
§01ต้องมีอะไรก่อนเริ่ม
แค่ บัญชี Google ธรรมดา (ฟรี) เท่านั้น — ไม่ต้องลง Node.js ไม่ต้องรู้จัก terminal ไม่ต้องมีพื้นฐานเขียนโค้ดเลย
§02ขั้นตอนที่ 1: คัดลอก Sheet ต้นแบบ
เปิดลิงก์นี้ → คัดลอก Queue Restaurant มาใช้เอง
Google จะถามว่า "สร้างสำเนา?" (Make a copy) — กด "ตกลง" ได้เลย ระบบจะคัดลอกทั้ง Sheet และ โค้ดที่ผูกอยู่กับมันไปไว้ใน Google Drive ของคุณเอง ภายใต้บัญชีของคุณเอง ทำอะไรต่อจากนี้ในสำเนาของคุณจะไม่กระทบต้นฉบับเลย
โค้ดทั้งหมดของระบบ "ติดมากับ Sheet" อยู่แล้ว (container-bound script) พอกด Make a copy โค้ดจะสำเนามาด้วยอัตโนมัติ ไม่ต้องไปโหลดโค้ดจากที่ไหนแยกต่างหาก
§03ขั้นตอนที่ 2: ตั้งรหัสผ่านพนักงาน
สำเนาของคุณต้องตั้งค่าอีกหนึ่งอย่างก่อนใช้งานได้: รหัสผ่านที่พนักงานจะพิมพ์เพื่อเข้าแดชบอร์ดเรียกคิว
- ในสำเนาใหม่ของคุณ ไปที่ Extensions → Apps Script
- เปิดไฟล์ Code.gs — เป็นไฟล์แรกในรายการ
- หาบรรทัดนี้ใกล้ ๆ ด้านบนของไฟล์:
const STAFF_PASSCODE = ''; - พิมพ์รหัสผ่านที่ต้องการลงในเครื่องหมายคำพูด เช่น
const STAFF_PASSCODE = '1234'; - กด Ctrl/Cmd+S เพื่อบันทึก
ไปที่ Project Settings → Script Properties แล้วเพิ่มคีย์ STAFF_PASSCODE ที่นั่นแทนได้เหมือนกัน แอปจะเช็กจุดนี้เป็นทางเลือกสำรอง ถ้าปล่อยบรรทัดใน Code.gs ว่างไว้
§04ขั้นตอนที่ 3: เผยแพร่เป็นเว็บแอปจริง
อยู่ใน Apps Script editor ต่อ:
- กด Deploy (มุมขวาบน) → New deployment
- กดไอคอนรูปเฟืองข้าง "Select type" → เลือก Web app
- Description: ใส่อะไรก็ได้ เช่น
v1 - Execute as: Me
- Who has access: Anyone
- กด Deploy
ครั้งแรกที่ทำแบบนี้ Google จะโชว์คำเตือน "unverified app" — เป็นเรื่องปกติสำหรับสคริปต์ที่คุณ (หรือคนที่คุณเชื่อใจ) เขียนขึ้นเอง ซึ่งยังไม่ได้ผ่านการรีวิวจาก Google กด Advanced → Go to (ชื่อโปรเจกต์ของคุณ) (unsafe) → Allow คุณกำลังอนุญาตให้สคริปต์ของคุณเองอ่าน/เขียน Sheet ของคุณเอง ไม่มีข้อมูลอะไรถูกส่งไปที่อื่น
คัดลอก Web app URL ที่ได้ตอนท้าย — นั่นคือลิงก์สำหรับลูกค้าถาวรของคุณ
§05ขั้นตอนที่ 4: ลองทั้ง 3 หน้าจอ
- ลูกค้า: ใช้ Web app URL จากขั้นตอนที่ 3 ตรง ๆ
- พนักงาน: ลิงก์เดิม แต่เติม
?page=staffต่อท้าย แล้วใส่รหัสผ่านจากขั้นตอนที่ 2 - บอร์ด / ทีวี: ลิงก์เดิม แต่เติม
?page=boardต่อท้าย
ลองสถานการณ์จริง: สมมติมีลูกค้ามาที่ร้าน 2 คนติดกัน คนแรกสแกนแล้วได้คิว 1 (ตาม FIG.01 ด้านบน) คนที่สองสแกนตามมาติด ๆ

เปิดจอบอร์ดที่ฝั่งร้าน (ลิงก์ ?page=board) เอาไปแปะจอทีวีหรือแท็บเล็ตตรงไหนก็ได้ในร้าน ตอนยังไม่มีใครกดเรียก จะเห็นข้อความ "กำลังเรียกคิว" เฉย ๆ พร้อมปุ่มเลขคิวที่รอทั้งหมดด้านล่าง

ฝั่งพนักงานเปิดแดชบอร์ด (ลิงก์ ?page=staff ใส่รหัสผ่าน) จะเห็นรายการคิวทั้งหมดเรียงตามลำดับ กดปุ่ม "เรียกคิวถัดไป" คิวแรกจะเปลี่ยนสถานะเป็น called ทันที มีปุ่ม "เสร็จ" กับ "ข้าม" โผล่มาให้กดต่อในแถวนั้น

ฝั่งลูกค้าคิว 1 ที่เปิดหน้าจอค้างไว้ตั้งแต่ตอนกดรับคิว จะเห็นข้อความเปลี่ยนเองแบบเกือบเรียลไทม์ ทันทีที่พนักงานกดเรียก โดยไม่ต้องกดรีเฟรชเอง

จอบอร์ดฝั่งร้านก็อัปเดตพร้อมกันเป็นเลขคิวที่กำลังเรียกอยู่ ให้ทุกคนในร้านเห็นตรงกัน

พอลูกค้าคิว 1 มารับบริการเสร็จ พนักงานกดปุ่ม "เสร็จ" ที่แถวนั้นในแดชบอร์ด ฝั่งลูกค้าจะเห็นข้อความขอบคุณปิดจบการรอคิว

§06ขั้นตอนที่ 5: เอาไปใช้จริง
- เอาลิงก์หน้าลูกค้าไปใส่ในเว็บสร้าง QR code ฟรี (หาได้ทั่วไป) แล้วปริ้นไปติดหน้าร้าน
- Bookmark ลิงก์
?page=staffไว้ที่เครื่องหน้าเคาน์เตอร์ และ?page=boardไว้ที่จอที่หันไปทางที่นั่งรอ
§07ถ้าใช้งานไม่ได้ ลองเช็กตรงนี้
| อาการ | สาเหตุที่เป็นไปได้ |
|---|---|
| ลูกค้าเจอหน้า login ของ Google | กลับไปดูขั้นตอนที่ 3 เช็กว่า "Who has access" ตั้งเป็น Anyone แล้ว ไม่ใช่ "Only myself" |
| มี pop-up "Authorization required" ตอนกดครั้งแรก | ปกติ เกิดแค่ครั้งเดียว และเห็นเฉพาะคุณในฐานะเจ้าของตอนทดสอบเท่านั้น |
| แก้โค้ดแล้วแต่ลิงก์จริงไม่เปลี่ยน | ทุกครั้งที่แก้โค้ดต้อง deploy ใหม่เสมอ: Deploy → Manage deployments → ไอคอนดินสอ → New version → Deploy ระบบนี้ไม่มี auto-publish เพราะไม่ได้ใช้ command line |
| ใส่รหัสผ่านถูกแล้วแต่ระบบไม่ยอมรับ | เช็กที่ STAFF_PASSCODE ใน Code.gs (หรือ Script Properties ถ้าใช้ทางนั้น) ว่าพิมพ์ผิดหรือเปล่า ระบบเช็กตัวพิมพ์เล็ก-ใหญ่ด้วย |
§08ข้อจำกัดที่ควรรู้ก่อนใช้จริง
ระบบนี้อัปเดตสถานะด้วย polling ไม่ใช่ push จริง — ฝั่งลูกค้า poll ทุก ~7 วินาที ฝั่งบอร์ด poll ทุก ~5 วินาที ผ่าน google.script.run ธรรมดา ไม่มี WebSocket ไม่มี server-sent events เพราะ Apps Script ทำ push แบบนั้นไม่ได้ ผลคือทุกจุดอัปเดตจะ "ช้ากว่า" ระบบ full-stack จริงอยู่เสมอในหลักไม่กี่วินาที ไม่ใช่ทันทีที่พนักงานกดปุ่ม และเวลาลูกค้าสลับแท็บหรือพับหน้าจอ การ poll จะหยุดโดยตั้งใจ (ประหยัด execution quota) แล้วกลับมา poll ต่อตอนเปิดหน้าจอใหม่ ไม่ใช่บั๊ก
Apps Script มีเพดานจำนวน execution พร้อมกัน ต่อบัญชี (ประมาณ 30 ครั้งพร้อมกัน) และการออกเลขคิวใหม่ทุกครั้งต้องผ่าน LockService แบบ global lock เพื่อกันเลขคิวซ้ำ — เหมาะกับร้านอาหารทั่วไปที่ลูกค้ามาแบบทยอย ๆ แต่ถ้าร้านคุณมีจังหวะที่คนแห่มากดรับคิวพร้อมกันเป็นสิบ ๆ คนในเสี้ยววินาที มีโอกาสเจอ error "คิวหนาแน่น ลองอีกครั้ง" ได้บ้าง เพราะทุกคนต้องรอคิวเข้า lock ทีละคน
พูดสั้น ๆ: นี่ไม่ใช่สถาปัตยกรรมสำหรับงานที่ต้องการความเรียลไทม์แบบเป๊ะ ๆ หรือรองรับ concurrency สูง ถ้าจะทำแบบนั้นได้ดีจริง ต้องขยับไปเป็น full-stack ที่มี read/write ผ่าน API จริงแทน Google Sheet — เป็นคนละ trade-off กับของฟรีที่ตั้งบนเชลล์ Apps Script ตัวนี้ ถ้ามีคนสนใจเวอร์ชัน full-stack คอมเมนต์บอกไว้ได้ จะเขียนให้ดูในตอนถัดไป
§09ค่าใช้จ่ายและการดูแลระยะยาว
ศูนย์บาท ตลอดไป (สำหรับปริมาณการใช้งานระดับร้านอาหารทั่วไป) — Google Apps Script และ Sheets ฟรีทั้งหมด เนื่องจากสำเนาของคุณแยกออกจากต้นฉบับตั้งแต่วัน Make a copy โค้ดจะไม่อัปเดตให้อัตโนมัติ ถ้าอยากได้ฟีเจอร์ใหม่ ให้กลับมาดูโพสต์นี้อีกครั้ง — ถ้ามีอัปเดตสำคัญจะประกาศไว้ด้านบน
💬 ติดปัญหาระหว่าง setup คอมเมนต์ไว้ที่ Facebook Group ได้เลยครับ
Engineer, writer, occasional GPU-melter. Writes every Sunday about applied AI — agents, evals, and whatever broke that week.
If you got something out of this, share it with someone who's trying to ship their first agent.
