สร้างระบบขอเปิดกล้องวงจรปิดด้วยของฟรีล้วนๆ: Apps Script + Sheets + GitHub Pages 0 บาท ไม่ต้องเช่าเซิร์ฟเวอร์
ใบขอเปิดกล้องวงจรปิดเคยเป็นแค่กระดาษแผ่นหนึ่ง ยื่นแล้วรอ ไม่รู้ว่าเรื่องไปถึงไหน ผมเลยสร้างระบบยื่นคำร้องออนไลน์ขึ้นมาเองทั้งระบบ โดยไม่เสียเงินเลยสักบาท ใช้ของฟรีที่มีอยู่แล้ว 4 อย่างประกอบกัน แล้วพัฒนามาเรื่อยๆ จนถึงเวอร์ชันที่ 80 บทนี้เล่าว่าระบบประกอบด้วยอะไรบ้าง เดินเรื่องอย่างไร และบั๊กไหนที่เจ็บจริงจนต้องจำ
🏗️ สถาปัตยกรรม: ของฟรี 4 ชิ้นประกอบกันเป็นระบบ
ระบบนี้ไม่มีเซิร์ฟเวอร์ของตัวเองเลย หน้าเว็บเป็นไฟล์ HTML ไฟล์เดียว โฮสต์บน GitHub Pages ซึ่งฟรีถ้าโค้ดอยู่ใน repo สาธารณะ หน้าฟอร์มส่งข้อมูลไปที่ Google Apps Script ซึ่งทำหน้าที่เป็นหลังบ้าน อ่านและเขียนลง Google Sheet ที่เป็นฐานข้อมูล ส่วนการแจ้งเตือนใช้ LINE Official Account ส่งข้อความหาคนที่ต้องดำเนินการต่อ ทุกชิ้นฟรี ไม่มีค่าเช่าเซิร์ฟเวอร์ ไม่มีค่าบริการรายเดือน หน้าที่ของแต่ละชิ้นแยกกันชัด หน้าเว็บแค่รับข้อมูลกับแสดงผล หลังบ้านเป็นคนตรวจสิทธิ์กับเก็บข้อมูลจริง หน้าเว็บมี 2 โฮสต์ คือ GitHub Pages กับตัว Apps Script เอง โค้ดชุดเดียวกัน deploy ทั้ง 2 ที่ ทุกเวอร์ชันก่อนขึ้นระบบจริงต้องผ่านชุดตรวจอัตโนมัติ 932 ข้อทั้งหมดถึงจะปล่อย
🔄 4 บทบาท 6 สถานะ เดินตามลำดับไม่ข้ามขั้น
คำร้องหนึ่งใบเดินผ่าน 4 บทบาท เริ่มจากผู้ยื่นกรอกฟอร์ม ฝ่ายไอทีเป็นผู้ดำเนินการรับเรื่อง ฝ่ายบุคคลเป็นผู้ตรวจสอบ แล้วฝ่ายบัญชีเป็นผู้อนุมัติ ผู้ดูแลระบบทำได้ทุกอย่าง สถานะมี 6 ขั้น เรียงตามลำดับ รอตรวจสอบ ไปกำลังดำเนินการ ไปรออนุมัติ ไปอนุมัติหรือปฏิเสธ แล้วจบที่ปิดงาน ข้ามขั้นไม่ได้ ยกเว้นผู้ดูแลระบบ เปิดฟอร์มเจ้าหน้าที่แล้วระบบจะเลื่อนไปส่วนของตัวเองอัตโนมัติพร้อมขอบสีน้ำเงินกับป้ายบอกว่าส่วนนี้คือส่วนของคุณ ส่วนอื่นจะจางลง อีเมลแจ้งเตือนทุกฉบับมีปุ่มเปิดใบนี้ 3 ปุ่ม แยกตามบทบาท กดแล้วเข้าระบบเป็นบทบาทนั้นพร้อมเปิดฟอร์มใบนั้นทันที ไม่ต้องล็อกอินซ้ำ ลิงก์ใช้ซ้ำได้ 5 ครั้งใน 24 ชั่วโมง โดยเริ่มนับจากกดครั้งแรกเท่านั้น ลิงก์ที่ยังไม่เคยกดไม่มีวันหมดอายุ ส่วนปุ่มบันทึกมีล็อกกันกดซ้ำ ตอนกำลังบันทึกปุ่มจะขึ้นว่ากำลังบันทึกและกดซ้ำไม่ได้ กันใบซ้ำจากการกดย้ำตอนเน็ตช้า รายการสาธารณะซ่อนชื่อคนอื่น เหลือแค่แผนกกับสถานะ ส่วนแดชบอร์ดหลังบ้านแสดงแค่ตัวเลขสรุป ไม่ดึงใบทั้งหมดมาโชว์
🐛 บั๊กที่เจ็บจริง 3 เรื่อง
เวอร์ชันหนึ่งเคยพังแบบตลก ลิงก์ในอีเมลหมดอายุทันทีตั้งแต่กดครั้งแรก สาเหตุคือชีตแปลงวันที่ที่บันทึกเป็นข้อความกลับมาเป็นวันที่ ทำให้ฟังก์ชันนับอายุอ่านค่าไม่ได้ แล้วตีว่าลิงก์อายุเกือบหมื่นชั่วโมง แก้โดยจัดรูปแบบวันที่ให้ตรงกันก่อนจับเวลา อีกเรื่องคือตอนทดสอบเจอว่ากดปุ่มบันทึกซ้ำตอนไม่มีผลตอบรับสร้างคำร้องซ้ำได้ เลยใส่ล็อกที่ปุ่มบันทึก ส่วนที่เจ็บที่สุดคือการแก้ไฟล์ในตัวแก้ไขของ Apps Script ผ่านเบราว์เซอร์อัตโนมัติ วางไฟล์ทั้งไฟล์ไม่ติดเลย สุดท้ายต้องใช้เครื่องมือ clasp ผ่าน Cloud Shell แทน ส่วนไฟล์ .bat สำหรับเปิดเซิร์ฟเวอร์บน Windows ต้องขึ้นบรรทัดใหม่แบบ CRLF เท่านั้น ใช้ LF อย่างเดียวหน้าต่างจะปิดทันทีโดยไม่รันอะไรเลย
📇 สแกนบัตรประชาชน: เลขแม่น ชื่อไม่แม่น
ฟอร์มมีปุ่มสแกนบัตรประชาชนด้วย OCR ที่รันในเบราว์เซอร์ทั้งหมด ไม่ส่งรูปออกไปข้างนอก เลข 13 หลักอ่านได้แม่นเพราะมี checksum เป็นตัวตัดสิน ถ้าอ่านผิด checksum จะไม่ผ่าน ส่วนชื่ออ่านไม่แม่น เพราะตัวหนังสือบนพื้นหลังโฮโลแกรมเพี้ยนง่าย และชื่อไม่มี checksum ให้ตรวจ ผมเลยให้ชื่อที่อ่านได้เป็นแค่คำแนะนำที่ต้องให้คนตรวจก่อนบันทึก ถ้าอ่านชื่อไม่ได้ก็พิมพ์ชื่อเอง ใช้เวลาไม่กี่วินาที ดีกว่ามานั่งแก้ชื่อที่อ่านเพี้ยน
💰 ของฟรีมีเพดาน ต้องออกแบบเผื่อไว้
ของฟรีไม่ได้แปลว่าไม่มีขีดจำกัด เอกสารทางการของ Google ระบุว่า Apps Script รันได้ครั้งละไม่เกิน 6 นาที ส่งอีเมลได้วันละ 100 คนถ้าใช้บัญชีฟรี และเรียก URL ภายนอกได้วันละ 20,000 ครั้ง ระบบที่คนใช้เยอะต้องออกแบบให้ทำงานจบใน 6 นาที และไม่ส่งอีเมลพร่ำเพรื่อ GitHub Pages เองก็โฮสต์ได้แค่ไฟล์นิ่ง รันโค้ดฝั่งเซิร์ฟเวอร์ไม่ได้ และหน้าเว็บที่โฮสต์ไว้เป็นสาธารณะ ใครก็เปิดดูได้ ข้อมูลอ่อนไหวจึงต้องอยู่หลังบ้านเท่านั้น ไม่ใช่ในหน้าเว็บ ส่วน LINE แพ็กเกจฟรีมีโควต้าข้อความต่อเดือนและต่างกันตามประเทศ นับเฉพาะข้อความที่เราส่งออกไปเอง ข้อความตอบกลับไม่นับ ต้องเช็กหน้าแพ็กเกจของ LINE ก่อนเริ่ม และ LINE Notify ที่เคยใช้ส่งแจ้งเตือนฟรีปิดไปแล้วตั้งแต่ 31 มีนาคม 2025 ต้องใช้ Messaging API ผ่าน LINE Official Account แทน
⚠️ อะไรยังไม่สมบูรณ์
ระบบนี้ยังไม่เสร็จสมบูรณ์ มีงานค้างที่รู้ตัวอยู่ เช่น ข้อมูลบางส่วนยังส่งผ่าน URL แบบ GET อยู่ กำลังจะเปลี่ยนเป็นส่งแบบ POST และมีจุดหนึ่งที่ผมรับไว้แบบมีตำหนิ คือผู้อนุมัติเลือกปฏิเสธโดยไม่กรอกเหตุผลยังบันทึกค่าได้ แม้สถานะจะไม่เปลี่ยนก็ตาม อีกเรื่องคือระบบยังอยู่บนบัญชี Google ส่วนตัวของผม การย้ายไปบัญชีขององค์กรยังค้างอยู่ เพราะเป็นงานใหญ่ที่ต้องวางแผนก่อน แต่ทั้งหมดนี้ก็คือสิ่งที่ได้จากการทำจริง ไม่ใช่จากตำรา
จากกระดาษแผ่นหนึ่งกลายเป็นระบบที่เดินเรื่องเองได้ แจ้งเตือนเองได้ และมีคำร้องจริงวิ่งผ่านระบบแล้ว ผมใช้ของฟรี 4 ชิ้นประกอบกัน แล้วแก้บั๊กทีละเวอร์ชันจนถึงเวอร์ชันที่ 80 ใครที่องค์กรยังใช้ฟอร์มกระดาษอยู่ ลองเริ่มจากของฟรีแบบนี้ได้ ไม่ต้องเช่าเซิร์ฟเวอร์ก่อนสักบาท
เขียนโดย พีรพัฒน์ พีพี
10 ชื่อหญิงไทย ฮิตตั้งแต่โบราณจนถึงปัจจุบัน
แบรนด์รถมอเตอร์ไซค์สัญชาติไทย ที่ประสบความสำเร็จมากที่สุดแบรนด์หนึ่งของประเทศ
5 โรงเรียนไทย ที่ค่าเทอมแพงที่สุด ปีละหลายแสน (ไม่รวมนานาชาติ)
ทำไม "รูระบายความร้อนที่พื้นรองเท้าคัทชูหรือรองเท้าทำงานบางรุ่น" ถึงต้องทำไว้ที่พื้นรองเท้า?
เบื้องหลัง "ลายตารางข้าวหลามตัดหรือร่องนูนที่ด้ามจับไขควงพลาสติก" มีไว้ทำไม?
ทำไม "ลวดเย็บกระดาษ (Max)" ถึงต้องทำเป็นเส้นยาวต่อกันและหักงอเป็นมุมฉากเมื่อถูกกดลงไป?
ตำนานอสูรกายแวมไพร์แห่งเบลดเดนโบโร (The Beast of Bladenboro): เมื่อความหวาดผวาเข้าครอบงำเมืองเล็ก ๆ ในปี 1954
5 มหาวิทยาลัยไทยที่อัตราการแข่งขันสูงที่สุด บางสาขาคนสมัครหลายพัน แต่รับเพียงหลักสิบ
เปิด 5 ประเทศในโลก ที่ไม่เคยตกเป็นเมืองขึ้นของประเทศอื่น
ปฏิทินจีนงวด 16 พฤศจิกายน 2569 เปิดเลขจากตาราง เจาะชุดสองตัว–สามตัว พร้อมเลขกลับน่าจับตา
น้ำพุเทรวี (Trevi Fountain) ประเทศอิตาลี น้ำพุที่โด่งดังระดับโลก สถาปัตยกรรมแห่งความรัก ตำนานโยนเหรียญ และความลับที่ซ่อนอยู่ใต้สายน้ำกว่า 2,000 ปี
โทรเลขอาจกลายเป็นอดีต แต่ระบบ TELEX และ SITA ยังขับเคลื่อนโลกการบินอยู่เบื้องหลัง




