คุณเป็นผู้เชี่ยวชาญด้าน Google Apps Script, Google Sheets, HTML, CSS, JavaScript, Responsive Web Design, ระบบ QR Code, Chart.js, LINE Messaging API และการพัฒนาเว็บแอปพลิเคชันสำหรับสถานศึกษา
จงสร้างเว็บแอปพลิเคชันชื่อ
“ระบบเช็คชื่อนักเรียนและยืม-คืนอุปกรณ์ผ่าน QR Code บัตรนักเรียน”
ชื่อภาษาอังกฤษ:
“Student Attendance & QR Equipment Borrowing System”
ระบบต้องสามารถนำไปใช้งานจริงในโรงเรียน วิทยาลัย หรือมหาวิทยาลัยได้ โดยพัฒนาด้วย Google Apps Script และใช้ Google Sheets เป็นฐานข้อมูล
เว็บแอปพลิเคชันต้องรองรับการใช้งานผ่านโทรศัพท์มือถือ แท็บเล็ต และคอมพิวเตอร์ โดยเฉพาะระบบยืม-คืนอุปกรณ์ที่ต้องใช้โทรศัพท์มือถือสแกน QR Code บนบัตรนักเรียน และส่งคำขอไปแสดงบนหน้าจอคอมพิวเตอร์ของเจ้าหน้าที่แบบอัตโนมัติ
	•	วัตถุประสงค์ของระบบ
ระบบต้องมีวัตถุประสงค์ดังต่อไปนี้
	•	บันทึกการเข้าเรียนของนักเรียนรายวัน
	•	ตรวจสอบนักเรียนที่มาเรียน ขาดเรียน ลา และมาสาย
	•	จัดการข้อมูลนักเรียน ระดับชั้น และห้องเรียน
	•	รองรับการยื่นคำขอลาและอนุมัติการลา
	•	จัดเก็บข้อมูลอุปกรณ์ของโรงเรียน
	•	ตรวจสอบจำนวนอุปกรณ์ที่พร้อมให้ยืมแบบ Real-time
	•	ใช้ QR Code บนบัตรนักเรียนเพื่อระบุตัวตนของผู้ยืม
	•	ให้นักเรียนหรือเจ้าหน้าที่พิมพ์รายการอุปกรณ์ที่ต้องการยืมผ่านโทรศัพท์มือถือ
	•	ส่งคำขอจากโทรศัพท์มือถือไปแสดงบนหน้าจอคอมพิวเตอร์ของเจ้าหน้าที่
	•	ช่วยให้เจ้าหน้าที่ตรวจสอบและเลือกอุปกรณ์ที่ส่งมอบจริง
	•	บันทึกการยืม การส่งมอบ การคืน และการคืนบางส่วน
	•	ตรวจสอบนักเรียนที่คืนอุปกรณ์ไม่ครบ
	•	ติดตามอุปกรณ์ที่ใกล้ถึงกำหนดคืนและเกินกำหนดคืน
	•	บันทึกอุปกรณ์ที่ชำรุด สูญหาย หรืออยู่ระหว่างซ่อม
	•	สร้างรายงาน PDF และ CSV
	•	แจ้งเตือนผ่าน LINE Messaging API
	•	ลดการใช้เอกสารกระดาษภายในสถานศึกษา
	•	ประเภทผู้ใช้งาน
ระบบต้องมีผู้ใช้งานอย่างน้อย 3 บทบาท
2.1 ผู้ดูแลระบบ Admin
สามารถดำเนินการดังนี้
	•	ดูข้อมูลทั้งหมดของระบบ
	•	จัดการบัญชีผู้ใช้งาน
	•	เพิ่ม แก้ไข และปิดใช้งานข้อมูลนักเรียน
	•	จัดการระดับชั้นและห้องเรียน
	•	จัดการข้อมูลครูและเจ้าหน้าที่
	•	จัดการข้อมูลอุปกรณ์
	•	จัดการหมวดหมู่อุปกรณ์
	•	จัดการข้อมูลการเช็คชื่อ
	•	อนุมัติหรือไม่อนุมัติคำขอลา
	•	ดูคำขอยืมอุปกรณ์จากโทรศัพท์มือถือ
	•	อนุมัติและส่งมอบอุปกรณ์
	•	ตรวจรับคืนอุปกรณ์
	•	บันทึกอุปกรณ์ชำรุดหรือสูญหาย
	•	ตรวจสอบรายการคืนไม่ครบ
	•	ตรวจสอบรายการเกินกำหนด
	•	สร้างรายงาน PDF และ CSV
	•	ตั้งค่าข้อมูลโรงเรียน
	•	ตั้งค่าการแจ้งเตือน LINE
	•	ดูประวัติการทำรายการของผู้ใช้งาน
2.2 ครูหรือเจ้าหน้าที่ Teacher / Officer
สามารถดำเนินการดังนี้
	•	เช็คชื่อนักเรียนในห้องเรียนที่รับผิดชอบ
	•	ดูสถิติการเข้าเรียน
	•	ตรวจสอบคำขอลา
	•	ดูคำขอยืมอุปกรณ์จากโทรศัพท์มือถือ
	•	เลือกอุปกรณ์และจำนวนที่ส่งมอบจริง
	•	ยืนยันการส่งมอบอุปกรณ์
	•	สแกนบัตรนักเรียนตอนรับคืน
	•	ตรวจรับคืนอุปกรณ์
	•	บันทึกการคืนบางส่วน
	•	บันทึกอุปกรณ์ชำรุด สูญหาย หรืออุปกรณ์ไม่ครบ
	•	ดูรายการนักเรียนที่ยังคืนอุปกรณ์ไม่ครบ
	•	สร้างรายงานตามสิทธิ์ที่ได้รับ
2.3 นักเรียน Student
นักเรียนไม่จำเป็นต้องเข้าถึงหน้าจัดการระบบทั้งหมด แต่สามารถดำเนินการผ่านหน้าสำหรับโทรศัพท์มือถือได้ดังนี้
	•	ใช้ QR Code บนบัตรนักเรียนเพื่อระบุตัวตน
	•	ตรวจสอบชื่อ รหัสนักเรียน ระดับชั้น และห้องเรียนหลังสแกน
	•	พิมพ์รายการอุปกรณ์ที่ต้องการยืม
	•	ระบุวัตถุประสงค์ในการยืม
	•	ระบุวันที่ต้องการใช้และวันที่กำหนดคืน
	•	ส่งคำขอไปยังหน้าจอคอมพิวเตอร์ของเจ้าหน้าที่
	•	ตรวจสอบรายการอุปกรณ์ที่ตนเองกำลังยืม
	•	แจ้งขอคืนอุปกรณ์
ระบบต้องตรวจสอบสิทธิ์จากฝั่ง Server ทุกครั้ง ห้ามใช้เพียงการซ่อนเมนูจากหน้า HTML
	•	ระบบเข้าสู่ระบบ
ออกแบบหน้า Login สไตล์ Modern โดยมีรายละเอียดดังนี้
	•	แบ่งหน้าจอเป็นสองฝั่งเมื่อเปิดบนคอมพิวเตอร์
	•	ฝั่งซ้ายเป็นพื้นหลัง Gradient สีน้ำเงิน
	•	แสดงชื่อระบบ ชื่อโรงเรียน สโลแกน และจุดเด่นของระบบ
	•	ฝั่งขวาเป็นการ์ด Login สีขาว มุมโค้ง และมีเงานุ่ม
	•	มีช่องชื่อผู้ใช้
	•	มีช่องรหัสผ่าน
	•	มีปุ่มแสดงหรือซ่อนรหัสผ่าน
	•	มีตัวเลือกจดจำชื่อผู้ใช้
	•	มีปุ่มเข้าสู่ระบบแบบ Gradient
	•	รองรับการกด Enter เพื่อเข้าสู่ระบบ
	•	มี Loading ระหว่างตรวจสอบข้อมูล
	•	แสดงข้อความเมื่อเข้าสู่ระบบไม่สำเร็จ
	•	รองรับหน้าจอโทรศัพท์มือถือแบบ Responsive
	•	มีปุ่มออกจากระบบ
	•	กำหนดอายุ Session
	•	บังคับให้ผู้ดูแลระบบเปลี่ยนรหัสผ่านหลังเข้าสู่ระบบครั้งแรก
	•	ระบบรักษาความปลอดภัย
ระบบต้องมีมาตรการดังต่อไปนี้
	•	ห้ามเก็บรหัสผ่านเป็นข้อความธรรมดา
	•	เข้ารหัสหรือ Hash รหัสผ่านก่อนบันทึก
	•	ใช้ Salt ร่วมกับการ Hash รหัสผ่าน
	•	สร้าง Session Token ที่คาดเดาได้ยาก
	•	ตรวจสอบ Session ทุกครั้งก่อนเข้าถึงข้อมูลสำคัญ
	•	ตรวจสอบ Role จากฝั่ง Server
	•	ห้ามส่ง PasswordHash, LINE Token หรือข้อมูลสำคัญกลับไปยัง Browser
	•	ตรวจสอบและกรองข้อมูล Input
	•	ป้องกัน HTML Injection และ Script Injection
	•	ใช้ LockService เมื่อมีการเปลี่ยนจำนวนอุปกรณ์
	•	ป้องกันการกดปุ่มซ้ำ
	•	บันทึกประวัติการเข้าสู่ระบบ
	•	บันทึก Audit Log สำหรับรายการสำคัญ
	•	ใช้ Soft Delete หรือการเปลี่ยนสถานะแทนการลบประวัติธุรกรรม
	•	กำหนด Time Zone เป็น Asia/Bangkok
	•	ระบบจัดการข้อมูลนักเรียน
ข้อมูลนักเรียนต้องประกอบด้วย
	•	รหัสนักเรียน
	•	เลขบัตรหรือรหัส QR
	•	คำนำหน้า
	•	ชื่อ
	•	นามสกุล
	•	ชื่อเล่น
	•	ระดับชั้น
	•	ห้องเรียน
	•	เลขที่
	•	เพศ
	•	เบอร์โทร
	•	อีเมล
	•	ชื่อผู้ปกครอง
	•	เบอร์โทรผู้ปกครอง
	•	รูปประจำตัว
	•	สถานะ
	•	วันที่สร้างข้อมูล
	•	วันที่แก้ไขล่าสุด
ความสามารถของระบบ
	•	เพิ่มข้อมูลนักเรียน
	•	แก้ไขข้อมูลนักเรียน
	•	ค้นหาด้วยรหัสหรือชื่อ
	•	กรองตามระดับชั้นและห้องเรียน
	•	เปิดหรือปิดสถานะนักเรียน
	•	ดูประวัติการเช็คชื่อ
	•	ดูประวัติการลา
	•	ดูประวัติการยืม-คืนอุปกรณ์
	•	ดูรายการอุปกรณ์ที่นักเรียนยังไม่ได้คืน
	•	ระบบ QR Code บัตรนักเรียน
ระบบต้องสร้าง QR Code ประจำตัวนักเรียนแต่ละคน
ข้อมูลใน QR Code ควรใช้ Token หรือรหัสเฉพาะที่ระบบสร้างขึ้น ไม่ควรเก็บข้อมูลส่วนตัวทั้งหมดไว้ใน QR Code โดยตรง
ความสามารถของระบบ QR Code
	•	สร้าง QR Code ให้นักเรียนโดยอัตโนมัติ
	•	QR Code แต่ละคนต้องไม่ซ้ำกัน
	•	เปิดดูบัตรนักเรียนบนหน้าจอ
	•	แสดงชื่อ รหัสนักเรียน ระดับชั้น ห้องเรียน รูปนักเรียน และ QR Code
	•	พิมพ์บัตรนักเรียนได้
	•	ดาวน์โหลด QR Code ได้
	•	สร้างบัตรนักเรียนหลายคนพร้อมกันได้
	•	รองรับการเปลี่ยน QR Token กรณีบัตรสูญหาย
	•	QR Code เดิมต้องไม่สามารถใช้งานได้หลังเปลี่ยน Token
	•	ระบบเช็คชื่อนักเรียน
ระบบเช็คชื่อต้องมีความสามารถดังนี้
	•	เลือกวันที่
	•	เลือกระดับชั้น
	•	เลือกห้องเรียน
	•	เลือกรายวิชาหรือคาบเรียนได้
	•	แสดงรายชื่อนักเรียนตามตัวกรอง
	•	ค้นหาด้วยชื่อหรือรหัสนักเรียน
	•	แสดงรูป ชื่อ รหัส ห้องเรียน และเลขที่
	•	บันทึกสถานะรายบุคคล
	•	มีปุ่มกำหนดสถานะ “มาเรียนทั้งหมด”
	•	มีปุ่มล้างสถานะทั้งหมด
	•	มีช่องหมายเหตุรายบุคคล
	•	บันทึกชื่อผู้เช็ค
	•	บันทึกวันที่และเวลาทำรายการ
	•	แก้ไขย้อนหลังได้เฉพาะผู้มีสิทธิ์
	•	ป้องกันการบันทึกข้อมูลซ้ำ
สถานะการเข้าเรียนประกอบด้วย
	•	มาเรียน
	•	ขาดเรียน
	•	ลาป่วย
	•	ลากิจ
	•	มาสาย
	•	เข้าร่วมกิจกรรม
	•	อื่น ๆ
	•	ระบบยื่นคำขอลา
ระบบต้องรองรับ
	•	เลือกประเภทการลา
	•	วันที่เริ่มลา
	•	วันที่สิ้นสุด
	•	จำนวนวันลา
	•	เหตุผล
	•	เบอร์โทรติดต่อ
	•	URL เอกสารหรือหลักฐาน
	•	สถานะรออนุมัติ
	•	อนุมัติ
	•	ไม่อนุมัติ
	•	ยกเลิก
	•	บันทึกผู้อนุมัติ
	•	บันทึกวันที่และเวลาอนุมัติ
	•	บันทึกเหตุผลกรณีไม่อนุมัติ
	•	เมื่อลาได้รับอนุมัติ ให้ลงสถานะในระบบเช็คชื่อโดยอัตโนมัติ
	•	ป้องกันการยื่นคำขอลาซ้ำในช่วงวันเดียวกัน
	•	หน้า Dashboard
Dashboard ต้องแสดงข้อมูลแบบ Real-time หรือโหลดข้อมูลล่าสุดจาก Google Sheets
การ์ดสรุปการเช็คชื่อ
	•	นักเรียนทั้งหมด
	•	มาเรียนวันนี้
	•	ขาดเรียน
	•	ลาป่วย
	•	ลากิจ
	•	มาสาย
	•	ยังไม่เช็คชื่อ
การ์ดสรุปอุปกรณ์
	•	อุปกรณ์ทั้งหมด
	•	อุปกรณ์พร้อมให้ยืม
	•	อุปกรณ์กำลังถูกยืม
	•	คำขอยืมที่รอดำเนินการ
	•	นักเรียนที่ยังคืนอุปกรณ์ไม่ครบ
	•	อุปกรณ์ใกล้ถึงกำหนดคืน
	•	อุปกรณ์เกินกำหนดคืน
	•	อุปกรณ์ชำรุด
	•	อุปกรณ์สูญหาย
	•	อุปกรณ์อยู่ระหว่างซ่อม
กราฟและตาราง
	•	Donut Chart สัดส่วนการเข้าเรียนวันนี้
	•	Line Chart การเข้าเรียนย้อนหลัง 7 วัน
	•	Bar Chart แยกตามห้องเรียน
	•	Donut Chart สถานะอุปกรณ์
	•	Bar Chart จำนวนการยืมแยกตามหมวดหมู่
	•	ตารางนักเรียนที่ยังไม่เช็คชื่อ
	•	ตารางคำขอยืมล่าสุด
	•	ตารางนักเรียนที่คืนอุปกรณ์ไม่ครบ
	•	ตารางอุปกรณ์เกินกำหนด
ใช้ Chart.js และต้องป้องกันการสร้าง Chart ซ้ำบน Canvas เดิม
	•	ระบบจัดการอุปกรณ์
ข้อมูลอุปกรณ์ประกอบด้วย
	•	รหัสอุปกรณ์
	•	รหัสทรัพย์สิน
	•	ชื่ออุปกรณ์
	•	หมวดหมู่
	•	รายละเอียด
	•	ยี่ห้อ
	•	รุ่น
	•	Serial Number
	•	ประเภทอุปกรณ์
	•	หน่วยนับ
	•	จำนวนทั้งหมด
	•	จำนวนพร้อมให้ยืม
	•	จำนวนที่ถูกจอง
	•	จำนวนที่กำลังถูกยืม
	•	จำนวนชำรุด
	•	จำนวนสูญหาย
	•	สถานที่จัดเก็บ
	•	ผู้รับผิดชอบ
	•	รูปภาพ
	•	สถานะ
	•	หมายเหตุ
	•	วันที่สร้าง
	•	วันที่แก้ไขล่าสุด
ระบบต้องรองรับอุปกรณ์สองรูปแบบ
	•	อุปกรณ์แบบมีรหัสประจำชิ้น เช่น Notebook กล้องถ่ายรูป โทรศัพท์ และเครื่องมือวัด
	•	อุปกรณ์แบบนับจำนวน เช่น ลูกบอล สาย HDMI เมาส์ คีย์บอร์ด กรรไกร และอุปกรณ์กีฬา
สถานะอุปกรณ์ประกอบด้วย
	•	พร้อมใช้งาน
	•	ถูกจอง
	•	ถูกยืม
	•	ชำรุด
	•	สูญหาย
	•	อยู่ระหว่างซ่อม
	•	ยกเลิกการใช้งาน
ความสามารถของระบบ
	•	เพิ่ม แก้ไข และค้นหาอุปกรณ์
	•	กรองตามหมวดหมู่และสถานะ
	•	แสดงจำนวนคงเหลือแบบ Real-time
	•	แสดงรูปภาพอุปกรณ์
	•	แสดง Badge สถานะ
	•	ดูประวัติการยืม-คืนรายอุปกรณ์
	•	ห้ามยืมอุปกรณ์ที่ชำรุด สูญหาย อยู่ระหว่างซ่อม หรือยกเลิกการใช้งาน
	•	ขั้นตอนยืมอุปกรณ์ผ่าน QR Code บัตรนักเรียน
ขั้นตอนต้องทำงานดังนี้
	•	ผู้ใช้งานเปิดหน้า “สแกนบัตรเพื่อยืม” บนโทรศัพท์มือถือ
	•	ระบบขออนุญาตใช้งานกล้อง
	•	ใช้กล้องโทรศัพท์สแกน QR Code บนบัตรนักเรียน
	•	ระบบนำ QR Token ไปตรวจสอบกับข้อมูลนักเรียนใน Google Sheets
	•	หากพบข้อมูล ให้แสดงชื่อ รูป รหัสนักเรียน ระดับชั้น และห้องเรียน
	•	หากไม่พบข้อมูล ให้แสดงข้อความว่าไม่พบบัตรนักเรียน
	•	รองรับการกรอกรหัสนักเรียนแทนการสแกน
	•	หลังยืนยันตัวตนแล้ว ให้แสดงแบบฟอร์มคำขอยืม
	•	นักเรียนหรือเจ้าหน้าที่พิมพ์ชื่ออุปกรณ์ที่ต้องการ
	•	สามารถพิมพ์ได้หลายรายการ
	•	ระบุจำนวนโดยประมาณ
	•	ระบุวัตถุประสงค์
	•	ระบุวันที่ต้องการใช้
	•	ระบุวันที่กำหนดคืน
	•	เพิ่มหมายเหตุ
	•	กดส่งคำขอ
	•	ระบบบันทึกคำขอลง Google Sheets
	•	ระบบแสดงเลขคิวหรือเลขที่คำขอ
	•	คำขอต้องไปแสดงบนหน้าจอคอมพิวเตอร์ของเจ้าหน้าที่
หน้าโทรศัพท์ต้องออกแบบให้ใช้งานง่าย ปุ่มมีขนาดใหญ่ ตัวหนังสืออ่านง่าย และไม่ล้นหน้าจอ
ใช้ไลบรารีสแกน QR Code เช่น html5-qrcode ผ่าน CDN โดยรวมการเรียกใช้งานไว้ในไฟล์ Index.html
	•	หน้าจอคิวคำขอบนคอมพิวเตอร์
สร้างหน้า “คิวคำขอยืม” สำหรับเปิดบนคอมพิวเตอร์ของเจ้าหน้าที่
ความสามารถของหน้าคิว
	•	แสดงคำขอใหม่จากโทรศัพท์มือถือ
	•	รีเฟรชข้อมูลอัตโนมัติทุก 3 วินาที
	•	มีปุ่มหยุดหรือเปิดการรีเฟรชอัตโนมัติ
	•	แสดงเลขคิว
	•	แสดงเวลาที่ส่งคำขอ
	•	แสดงชื่อและรูปนักเรียน
	•	แสดงรหัสนักเรียน
	•	แสดงระดับชั้นและห้องเรียน
	•	แสดงข้อความรายการอุปกรณ์ที่นักเรียนพิมพ์
	•	แสดงวัตถุประสงค์
	•	แสดงกำหนดคืน
	•	เรียงคำขอใหม่ที่สุดหรือเก่าที่สุดได้
	•	มีเสียงแจ้งเตือนเมื่อมีคำขอใหม่ โดยต้องเปิดใช้งานเสียงหลังผู้ใช้กดอนุญาต
	•	ป้องกันคิวเดิมแสดงซ้ำ
	•	มีสถานะ รอดำเนินการ กำลังจัดของ ส่งมอบแล้ว ยกเลิก และไม่อนุมัติ
	•	ระบบเลือกอุปกรณ์และส่งมอบจริง
ข้อความที่นักเรียนพิมพ์เป็นเพียงคำขอเบื้องต้น เจ้าหน้าที่ต้องเลือกอุปกรณ์จริงจากฐานข้อมูล
เจ้าหน้าที่สามารถ
	•	เปิดรายละเอียดคำขอ
	•	ค้นหาอุปกรณ์จากฐานข้อมูล
	•	เพิ่มอุปกรณ์หลายรายการในคำขอเดียว
	•	ระบุจำนวนที่อนุมัติ
	•	ตรวจสอบจำนวนคงเหลือ
	•	ลบรายการที่เลือกผิด
	•	เปลี่ยนจำนวน
	•	ระบุสภาพก่อนยืม
	•	ระบุอุปกรณ์ประกอบ
	•	เพิ่มหมายเหตุ
	•	ยืนยันส่งมอบ
	•	ไม่อนุมัติคำขอ
	•	ยกเลิกคำขอ
ก่อนส่งมอบ ระบบต้องตรวจสอบจำนวนคงเหลือล่าสุดจาก Google Sheets อีกครั้ง
เมื่อยืนยันส่งมอบ
	•	ลด AvailableQty
	•	เพิ่ม BorrowedQty
	•	บันทึกวันและเวลาส่งมอบ
	•	บันทึกชื่อเจ้าหน้าที่
	•	บันทึกอุปกรณ์และจำนวนที่ส่งมอบจริง
	•	บันทึก Transaction
	•	เปลี่ยนสถานะคำขอเป็น “ส่งมอบแล้ว”
	•	แสดงรายการในหน้าอุปกรณ์ที่นักเรียนกำลังถือครอง
	•	การป้องกันจำนวนอุปกรณ์ผิดพลาด
ทุกครั้งที่อนุมัติ ส่งมอบ คืน ยกเลิก หรือเปลี่ยนจำนวนอุปกรณ์ ต้องใช้ LockService
ขั้นตอนภายใน LockService ต้องเป็นดังนี้
	•	เรียก Lock
	•	รอ Lock ตามเวลาที่เหมาะสม
	•	อ่านจำนวนล่าสุดจาก Google Sheets
	•	ตรวจสอบจำนวนอีกครั้ง
	•	ปรับจำนวน
	•	บันทึก Transaction
	•	บันทึก Audit Log
	•	ปล่อย Lock ใน finally
กฎสำคัญ
	•	ห้าม AvailableQty ติดลบ
	•	ห้าม BorrowedQty ติดลบ
	•	ห้ามคืนเกินจำนวนที่ยังไม่ได้คืน
	•	ห้ามส่งมอบเกินจำนวนที่มี
	•	ห้ามบันทึกรายการซ้ำจากการกดปุ่มหลายครั้ง
	•	ต้องใช้รหัสธุรกรรมที่ไม่ซ้ำกัน
	•	หากเกิดข้อผิดพลาด ให้พยายามคืนค่าข้อมูลเดิมเท่าที่ Google Sheets รองรับ
	•	แสดงข้อความผิดพลาดที่ผู้ใช้งานเข้าใจได้
	•	ระบบรับคืนอุปกรณ์ด้วยบัตรนักเรียน
ขั้นตอนรับคืนต้องทำงานดังนี้
	•	เจ้าหน้าที่เปิดหน้า “สแกนบัตรรับคืน”
	•	ใช้โทรศัพท์หรือกล้องสแกน QR Code บัตรนักเรียน
	•	รองรับการกรอกรหัสนักเรียนแทนการสแกน
	•	ระบบแสดงข้อมูลนักเรียน
	•	ระบบค้นหารายการอุปกรณ์ที่นักเรียนยังไม่ได้คืน
	•	แสดงชื่ออุปกรณ์ จำนวนที่ยืม จำนวนที่คืนแล้ว และจำนวนที่ยังค้าง
	•	แสดงวันที่ยืม
	•	แสดงกำหนดคืน
	•	แสดงจำนวนวันที่เกินกำหนด
	•	เจ้าหน้าที่เลือกรายการที่นำมาคืน
	•	ระบุจำนวนที่คืน
	•	ระบุสภาพหลังคืน
	•	ระบุอุปกรณ์ประกอบที่ขาด
	•	ระบุค่าเสียหาย
	•	เพิ่มหมายเหตุ
	•	ยืนยันรับคืน
สภาพหลังคืนประกอบด้วย
	•	ปกติ
	•	ชำรุด
	•	อุปกรณ์ไม่ครบ
	•	สูญหาย
	•	รอตรวจสอบเพิ่มเติม
	•	ระบบคืนบางส่วน
ระบบต้องรองรับการคืนอุปกรณ์บางส่วน
ตัวอย่าง
นักเรียนยืมลูกบอลจำนวน 10 ลูก
	•	คืนครั้งแรก 6 ลูก
	•	ระบบต้องแสดงว่ายังค้าง 4 ลูก
	•	คืนครั้งที่สอง 4 ลูก
	•	ระบบจึงเปลี่ยนสถานะเป็นคืนครบแล้ว
กฎการปรับจำนวน
	•	คืนสภาพปกติ: ลด BorrowedQty และเพิ่ม AvailableQty
	•	คืนชำรุด: ลด BorrowedQty แต่ไม่เพิ่ม AvailableQty ให้เพิ่มจำนวนชำรุด
	•	สูญหาย: ลด BorrowedQty แต่ไม่เพิ่ม AvailableQty ให้เพิ่มจำนวนสูญหาย
	•	คืนไม่ครบ: คงจำนวนที่เหลือในระบบ
	•	ต้องบันทึกประวัติการคืนทุกครั้ง
	•	ห้ามแก้ไขทับประวัติการคืนครั้งก่อน
	•	หน้า “รายการคืนไม่ครบ”
สร้างหน้าสำหรับติดตามนักเรียนที่ยังคืนอุปกรณ์ไม่ครบ
ข้อมูลที่ต้องแสดง
	•	รหัสนักเรียน
	•	ชื่อนักเรียน
	•	ระดับชั้น
	•	ห้องเรียน
	•	เบอร์โทรนักเรียน
	•	เบอร์โทรผู้ปกครอง
	•	เลขที่คำขอยืม
	•	ชื่ออุปกรณ์
	•	จำนวนที่ยืม
	•	จำนวนที่คืนแล้ว
	•	จำนวนที่ยังค้าง
	•	วันที่ยืม
	•	กำหนดคืน
	•	จำนวนวันที่เกินกำหนด
	•	สถานะ
	•	หมายเหตุ
ความสามารถของหน้า
	•	ค้นหาด้วยรหัสหรือชื่อนักเรียน
	•	กรองตามระดับชั้น
	•	กรองตามห้องเรียน
	•	กรองตามสถานะ
	•	กรองเฉพาะรายการเกินกำหนด
	•	เปิดดูรายละเอียดนักเรียน
	•	เปิดดูประวัติการคืน
	•	พิมพ์รายงาน
	•	ส่งออก CSV
	•	สร้าง PDF
	•	ส่งข้อความแจ้งเตือนผ่าน LINE
	•	เรียงลำดับตามจำนวนวันที่เกินกำหนด
	•	ระบบติดตามกำหนดคืน
ระบบต้อง
	•	คำนวณจำนวนวันที่เหลือก่อนกำหนดคืน
	•	แสดงสถานะ “ใกล้ถึงกำหนด”
	•	แสดงสถานะ “ครบกำหนดวันนี้”
	•	แสดงสถานะ “เกินกำหนด”
	•	แสดงจำนวนวันที่เกินกำหนด
	•	ตรวจสอบรายการอัตโนมัติทุกวัน
	•	สร้าง Time-driven Trigger
	•	ป้องกันการสร้าง Trigger ซ้ำ
	•	ส่งสรุปรายการเกินกำหนดให้เจ้าหน้าที่ตามการตั้งค่า
	•	แสดงรายการบน Dashboard
	•	ระบบแจ้งซ่อม
ระบบต้องรองรับ
	•	เลือกอุปกรณ์
	•	ระบุอาการเสีย
	•	ระบุระดับความเสียหาย
	•	ระบุผู้แจ้ง
	•	ระบุผู้รับผิดชอบ
	•	ระบุวันที่ส่งซ่อม
	•	ระบุสถานะการซ่อม
	•	ระบุค่าใช้จ่าย
	•	ระบุผลการซ่อม
	•	แนบ URL รูปภาพ
	•	เพิ่มหมายเหตุ
สถานะการซ่อม
	•	รอตรวจสอบ
	•	รอส่งซ่อม
	•	กำลังซ่อม
	•	ซ่อมเสร็จ
	•	ซ่อมไม่ได้
	•	ยกเลิก
เมื่อซ่อมเสร็จและใช้งานได้ ให้ปรับจำนวนอุปกรณ์กลับเข้าสู่ AvailableQty อย่างถูกต้อง
	•	ระบบรายงาน
รายงานการเช็คชื่อ
	•	รายงานเช็คชื่อรายวัน
	•	รายงานเช็คชื่อรายเดือน
	•	รายงานแยกตามห้องเรียน
	•	รายงานนักเรียนขาดเรียน
	•	รายงานนักเรียนมาสาย
	•	รายงานการลา
	•	รายงานรายบุคคล
รายงานอุปกรณ์
	•	รายงานอุปกรณ์ทั้งหมด
	•	รายงานอุปกรณ์พร้อมให้ยืม
	•	รายงานอุปกรณ์ที่กำลังถูกยืม
	•	รายงานนักเรียนที่คืนไม่ครบ
	•	รายงานรายการเกินกำหนด
	•	รายงานอุปกรณ์ชำรุด
	•	รายงานอุปกรณ์สูญหาย
	•	รายงานประวัติการยืม-คืน
	•	รายงานอุปกรณ์ที่ถูกยืมบ่อย
	•	รายงานแยกตามห้องเรียน
	•	รายงานค่าใช้จ่ายในการซ่อม
รองรับ
	•	ดาวน์โหลด PDF
	•	ดาวน์โหลด CSV
	•	พิมพ์รายงาน
	•	กรองตามช่วงวันที่
	•	กรองตามระดับชั้น
	•	กรองตามห้องเรียน
	•	กรองตามนักเรียน
	•	กรองตามอุปกรณ์
	•	กรองตามสถานะ
รายงาน PDF ต้องมี
	•	โลโก้โรงเรียน
	•	ชื่อโรงเรียน
	•	ชื่อรายงาน
	•	ช่วงวันที่
	•	วันที่สร้าง
	•	ชื่อผู้สร้างรายงาน
	•	ตารางข้อมูล
	•	สรุปยอดรวม
	•	เลขหน้า
	•	ช่องลงชื่อผู้จัดทำและผู้ตรวจสอบ
	•	ระบบแจ้งเตือน LINE Messaging API
ใช้ LINE Messaging API ไม่ใช้ LINE Notify
ตั้งค่าผ่าน Script Properties หรือหน้า Settings
ข้อมูลที่ต้องตั้งค่า
	•	LINE Channel Access Token
	•	LINE Target User ID
	•	LINE Group ID
	•	เปิดหรือปิดการแจ้งเตือน
	•	จำนวนวันแจ้งเตือนก่อนกำหนด
	•	เวลาส่งสรุปประจำวัน
เหตุการณ์ที่แจ้งเตือน
	•	มีคำขอยืมใหม่
	•	ยืนยันการส่งมอบ
	•	แจ้งขอคืน
	•	รับคืนเรียบร้อย
	•	คืนอุปกรณ์ไม่ครบ
	•	อุปกรณ์ใกล้ถึงกำหนดคืน
	•	อุปกรณ์เกินกำหนด
	•	อุปกรณ์ชำรุด
	•	อุปกรณ์สูญหาย
	•	สรุปประจำวัน
สร้างฟังก์ชันทดสอบการส่ง LINE และแสดงผลว่าสำเร็จหรือไม่
ห้ามส่ง LINE Token กลับไปยังหน้า Browser
	•	โครงสร้าง Google Sheets
ระบบต้องสร้าง Sheet และหัวตารางให้อัตโนมัติเมื่อรัน setupSystem()
สร้าง Sheet อย่างน้อยดังนี้
Students
StudentID | QRToken | Prefix | FirstName | LastName | Nickname | GradeLevel | ClassRoom | StudentNumber | Gender | Phone | Email | ParentName | ParentPhone | PhotoURL | Status | CreatedAt | UpdatedAt
Classes
ClassID | GradeLevel | ClassRoom | HomeroomTeacher | Status | CreatedAt | UpdatedAt
Users
UserID | Username | PasswordHash | PasswordSalt | Role | StudentID | DisplayName | MustChangePassword | Status | LastLogin | CreatedAt | UpdatedAt
Sessions
SessionID | UserID | SessionToken | ExpireAt | CreatedAt | LastActiveAt | Status
Attendance
AttendanceID | Date | StudentID | GradeLevel | ClassRoom | Subject | Period | Status | TimeIn | Note | RecordedBy | CreatedAt | UpdatedAt
LeaveRequests
LeaveID | StudentID | LeaveType | StartDate | EndDate | TotalDays | Reason | ContactPhone | AttachmentURL | Status | ApprovedBy | ApprovedAt | RejectReason | SubmittedAt | UpdatedAt
EquipmentCategories
CategoryID | CategoryName | Description | Status | CreatedAt | UpdatedAt
Equipment
EquipmentID | AssetCode | EquipmentName | CategoryID | Description | Brand | Model | SerialNumber | EquipmentType | Unit | TotalQty | AvailableQty | ReservedQty | BorrowedQty | DamagedQty | LostQty | StorageLocation | ResponsiblePerson | ImageURL | Status | Note | CreatedAt | UpdatedAt | UpdatedBy
MobileRequests
MobileRequestID | QueueNumber | StudentID | RequestedText | EstimatedQty | Purpose | NeededDate | DueDate | Note | RequestStatus | SubmittedAt | ProcessedBy | ProcessedAt | UpdatedAt
BorrowRequests
BorrowID | BorrowNumber | MobileRequestID | StudentID | GradeLevel | ClassRoom | RequestDate | NeededDate | DueDate | Purpose | Status | ApprovedBy | ApprovedAt | DeliveredBy | DeliveredAt | ReturnRequestedAt | CompletedAt | Note | CreatedAt | UpdatedAt
BorrowItems
BorrowItemID | BorrowID | EquipmentID | RequestedQty | ApprovedQty | DeliveredQty | ReturnedQty | RemainingQty | ItemStatus | ConditionBefore | Accessories | Note | CreatedAt | UpdatedAt
EquipmentReturns
ReturnID | BorrowID | BorrowItemID | EquipmentID | StudentID | ReturnQty | ReturnDateTime | ConditionAfter | MissingAccessories | DamageFee | ReceivedBy | EvidenceURL | Note | CreatedAt
EquipmentTransactions
TransactionID | BorrowID | BorrowItemID | EquipmentID | StudentID | TransactionType | Quantity | TransactionDateTime | ConditionBefore | ConditionAfter | PerformedBy | ReferenceID | Note
EquipmentRepairs
RepairID | EquipmentID | ReportDate | ProblemDescription | Severity | ReportedBy | AssignedTo | RepairStatus | SentRepairDate | CompletedDate | RepairResult | Cost | ImageURL | Note | CreatedAt | UpdatedAt
Settings
Key | Value | Description | UpdatedAt | UpdatedBy
AuditLogs
LogID | UserID | Username | Action | Module | ReferenceID | OldValue | NewValue | UserAgent | CreatedAt
LoginLogs
LoginLogID | UserID | Username | LoginStatus | UserAgent | CreatedAt
Notifications
NotificationID | UserID | NotificationType | Title | Message | ReferenceID | IsRead | CreatedAt
	•	การออกแบบหน้าเว็บ
ออกแบบสไตล์ Modern School Dashboard
ใช้สีหลัก
	•	น้ำเงิน #2563EB
	•	เขียว #10B981
	•	แดง #EF4444
	•	เหลือง #F59E0B
	•	ม่วง #8B5CF6
	•	พื้นหลัง #F8FAFC
	•	ข้อความหลัก #0F172A
	•	ข้อความรอง #64748B
ลักษณะ UI
	•	Sidebar บนคอมพิวเตอร์
	•	Hamburger Menu บนโทรศัพท์
	•	Top Navigation
	•	การ์ดมุมโค้ง
	•	เงานุ่ม
	•	ตาราง Responsive
	•	Modal Form
	•	Toast Notification
	•	Confirm Dialog
	•	Loading Overlay
	•	Skeleton Loading
	•	Badge แสดงสถานะ
	•	ปุ่มมี Hover Effect
	•	รองรับภาษาไทย
	•	ใช้ Font Sarabun หรือ Prompt
	•	ห้ามหน้าเว็บล้นจอบนมือถือ
	•	ปุ่มสแกน QR ต้องเห็นชัดและกดง่าย
	•	หน้าคิวคอมพิวเตอร์ต้องอ่านง่ายจากระยะไกล
	•	เทคโนโลยีที่ใช้
	•	Google Apps Script Web App
	•	Google Sheets Database
	•	HTML
	•	CSS
	•	Vanilla JavaScript
	•	google.script.run
	•	Chart.js
	•	html5-qrcode
	•	QRCode.js
	•	Google Drive
	•	Google Sheets Export
	•	LINE Messaging API
	•	LockService
	•	PropertiesService
	•	CacheService
	•	Time-driven Trigger
	•	โครงสร้างไฟล์
ต้องสร้างโค้ดเพียง 2 ไฟล์เท่านั้น
ไฟล์ที่ 1 ชื่อ Code.gs
รวมโค้ดฝั่ง Server ทั้งหมด เช่น
	•	doGet()
	•	setupSystem()
	•	createDefaultAdmin()
	•	setupDailyTrigger()
	•	ระบบ Login
	•	ระบบ Session
	•	ระบบตรวจสอบ Role
	•	ระบบนักเรียน
	•	ระบบ QR Token
	•	ระบบเช็คชื่อ
	•	ระบบลา
	•	ระบบอุปกรณ์
	•	ระบบคำขอจากมือถือ
	•	ระบบคิวบนคอมพิวเตอร์
	•	ระบบอนุมัติและส่งมอบ
	•	ระบบรับคืน
	•	ระบบคืนบางส่วน
	•	ระบบติดตามคืนไม่ครบ
	•	ระบบเกินกำหนด
	•	ระบบแจ้งซ่อม
	•	ระบบ Dashboard
	•	ระบบรายงาน PDF และ CSV
	•	ระบบ LINE Messaging API
	•	ระบบ LockService
	•	ระบบ Audit Log
	•	Utility Functions ทั้งหมด
ไฟล์ที่ 2 ชื่อ Index.html
รวมโค้ดฝั่ง Client ทั้งหมด เช่น
	•	HTML
	•	CSS
	•	JavaScript
	•	หน้า Login
	•	Dashboard
	•	Sidebar
	•	Top Navigation
	•	หน้าเช็คชื่อ
	•	หน้านักเรียน
	•	หน้าบัตรนักเรียนและ QR Code
	•	หน้าสแกนบัตรเพื่อยืมบนมือถือ
	•	หน้าคิวคำขอบนคอมพิวเตอร์
	•	หน้าส่งมอบอุปกรณ์
	•	หน้าสแกนบัตรรับคืน
	•	หน้ารายการคืนไม่ครบ
	•	หน้าอุปกรณ์เกินกำหนด
	•	หน้าจัดการอุปกรณ์
	•	หน้ารายงาน
	•	หน้าตั้งค่า
	•	Modal
	•	Toast
	•	Loading
	•	Confirm Dialog
	•	Chart.js
	•	QR Scanner
	•	Responsive Design
ห้ามสร้างไฟล์ CSS หรือ JavaScript แยกเพิ่มเติม
	•	ข้อกำหนดการเขียนโค้ด
	•	ห้ามย่อโค้ด
	•	ห้ามตัดโค้ด
	•	ห้ามใช้ Pseudocode
	•	ห้ามใช้ Placeholder แทนฟังก์ชันจริง
	•	ห้ามเขียนว่า “เพิ่มโค้ดส่วนที่เหลือเอง”
	•	ห้ามเขียนว่า “โค้ดเหมือนเดิม”
	•	ต้องเขียนโค้ดให้ครบทุกฟังก์ชันหลัก
	•	ใส่ Comment ภาษาไทยในส่วนสำคัญ
	•	ตั้งชื่อฟังก์ชันและตัวแปรให้อ่านเข้าใจง่าย
	•	ทุกฟังก์ชันฝั่ง Server ต้องส่งค่ากลับเป็น Object รูปแบบเดียวกัน เช่น success, message และ data
	•	ทุกการเรียก google.script.run ต้องมี Success Handler และ Failure Handler
	•	ปิด Loading ทั้งกรณีสำเร็จและเกิดข้อผิดพลาด
	•	ตรวจสอบข้อมูลว่าง
	•	ตรวจสอบ Sheet ที่ไม่มี
	•	ตรวจสอบ Header ที่ไม่ตรง
	•	ตรวจสอบ ID ของ HTML ให้ตรงกับ JavaScript
	•	ตรวจสอบชื่อฟังก์ชัน Client และ Server ให้ตรงกัน
	•	ป้องกัน Chart.js สร้างกราฟซ้ำ
	•	ป้องกัน QR Scanner เปิดกล้องซ้ำ
	•	ปิดกล้องเมื่อออกจากหน้าสแกน
	•	ป้องกัน setInterval ซ้ำ
	•	หยุด Auto Refresh เมื่อออกจากหน้าคิว
	•	ป้องกันปุ่มกดซ้ำ
	•	ใช้ try-catch-finally ในฟังก์ชันสำคัญ
	•	ใช้ LockService ทุกครั้งที่เปลี่ยนจำนวนอุปกรณ์
	•	ห้ามส่งข้อมูลสำคัญไปยัง Browser
	•	ใช้ Time Zone Asia/Bangkok
	•	แสดงวันที่แบบ DD/MM/YYYY
	•	ตรวจสอบ Syntax Error ก่อนส่งออก
	•	ตรวจสอบวงเล็บและเครื่องหมายคำพูด
	•	ตรวจสอบ Template Literal
	•	ตรวจสอบฟังก์ชันที่เรียกแต่ไม่ได้ประกาศ
	•	ตรวจสอบกรณีข้อมูลใน Google Sheets ว่าง
	•	รองรับการใช้งานจริงบนโทรศัพท์มือถือ
	•	ข้อมูลเริ่มต้น
สร้างฟังก์ชัน setupSystem() เพื่อ
	•	สร้าง Sheet ทุก Sheet
	•	สร้าง Header
	•	ตั้งรูปแบบ Header
	•	Freeze แถวแรก
	•	ตั้ง Time Zone
	•	สร้างข้อมูลตัวอย่างระดับชั้น
	•	สร้างหมวดหมู่อุปกรณ์ตัวอย่าง
	•	สร้างอุปกรณ์ตัวอย่าง
	•	สร้างนักเรียนตัวอย่าง
	•	สร้าง Admin เริ่มต้น
บัญชี Admin เริ่มต้นสำหรับทดสอบ
Username: admin
Password: Admin@1234
ระบบต้องบังคับให้เปลี่ยนรหัสผ่านหลังเข้าสู่ระบบครั้งแรก
	•	รูปแบบ Output ที่ต้องการ
ให้สร้างไฟล์จริงจำนวน 2 ไฟล์ ได้แก่
	•	Code.gs
	•	Index.html
หากสภาพแวดล้อมรองรับการสร้างไฟล์ ให้สร้างไฟล์ไว้ในตำแหน่งดังนี้
/mnt/data/Code.gs
/mnt/data/Index.html
จากนั้นให้แสดงลิงก์ดาวน์โหลดในรูปแบบ
ดาวน์โหลด Code.gs
ดาวน์โหลด Index.html
ห้ามตอบเฉพาะ Code Block หากสามารถสร้างไฟล์ดาวน์โหลดได้
ห้ามรวม Code.gs และ Index.html ไว้ในไฟล์เดียว
ห้ามเปลี่ยนชื่อไฟล์
ห้ามสร้างไฟล์อื่นเพิ่มเติม เว้นแต่จะสร้าง ZIP เพิ่มเป็นตัวเลือก โดยต้องมี Code.gs และ Index.html อยู่ภายในครบถ้วน
ก่อนส่งไฟล์ ให้ตรวจสอบว่าไฟล์มีอยู่จริงและเปิดอ่านได้
	•	คำอธิบายหลังสร้างไฟล์
หลังจากแสดงลิงก์ดาวน์โหลด ให้สรุปวิธีใช้งานแบบสั้น ๆ ตามลำดับดังนี้
	•	สร้าง Google Sheets ใหม่
	•	เปิดเมนูส่วนขยาย
	•	เลือก Apps Script
	•	วาง Code.gs
	•	สร้างไฟล์ HTML ชื่อ Index
	•	วาง Index.html
	•	รัน setupSystem()
	•	อนุญาตสิทธิ์
	•	Deploy เป็น Web App
	•	เข้าสู่ระบบด้วยบัญชี Admin เริ่มต้น
	•	เปลี่ยนรหัสผ่าน
	•	ทดสอบเพิ่มนักเรียนและสร้างบัตร QR
	•	เปิดหน้าสแกนบนโทรศัพท์
	•	เปิดหน้าคิวบนคอมพิวเตอร์
	•	ทดลองยืมและคืนบางส่วน
	•	การตรวจสอบก่อนส่งคำตอบ
ก่อนสร้างไฟล์และส่งคำตอบ ต้องตรวจสอบประเด็นต่อไปนี้
	•	Code.gs ไม่มี Syntax Error
	•	JavaScript ใน Index.html ไม่มี Syntax Error
	•	ฟังก์ชันที่เรียกทั้งหมดมีการประกาศ
	•	ชื่อ Sheet ตรงกันทุกตำแหน่ง
	•	ชื่อ Column ตรงกันทุกตำแหน่ง
	•	ชื่อฟังก์ชัน Client และ Server ตรงกัน
	•	QR Scanner สามารถเริ่มและหยุดได้
	•	QR Token ค้นหานักเรียนได้ถูกต้อง
	•	หน้าคิวรีเฟรชทุก 3 วินาที
	•	ไม่สร้าง setInterval ซ้ำ
	•	จำนวนอุปกรณ์ไม่ติดลบ
	•	ไม่สามารถคืนเกินจำนวนคงค้าง
	•	รองรับคืนบางส่วน
	•	รายการคืนไม่ครบแสดงถูกต้อง
	•	กำหนดคืนและจำนวนวันเกินกำหนดคำนวณถูกต้อง
	•	Session และ Role ทำงานถูกต้อง
	•	Loading ปิดทุกกรณี
	•	Modal เปิดและปิดได้
	•	ปุ่มไม่สามารถกดซ้ำระหว่างประมวลผล
	•	ตารางใช้งานได้บนโทรศัพท์
	•	หน้าเว็บไม่ล้นจอ
	•	ข้อมูลสำคัญไม่ถูกส่งไปยัง Browser
	•	ไฟล์ Code.gs และ Index.html สามารถดาวน์โหลดได้จริง
ห้ามถามคำถามเพิ่มเติม
หากรายละเอียดบางส่วนไม่ได้กำหนดไว้ ให้เลือกแนวทางที่ปลอดภัย เหมาะสม และสามารถใช้งานจริงกับ Google Apps Script และ Google Sheets ได้
ผลลัพธ์สุดท้ายต้องเป็นเว็บแอปพลิเคชันที่ผู้เข้าอบรมสามารถดาวน์โหลดไฟล์ Code.gs และ Index.html แล้วนำไปวางใน Google Apps Script เพื่อทดลองใช้งานได้ทันที
