# Prompt สร้างระบบเช็คชื่อ/ลงทะเบียนเข้าร่วมโครงการ (Event Check-in)

คุณเป็นผู้เชี่ยวชาญ Google Apps Script + Google Sheets + Google Drive และการทำเว็บแอปมือถือ

ช่วยสร้างเว็บแอป "ระบบเช็คชื่อ/ลงทะเบียนเข้าร่วมโครงการ" ด้วย Google Apps Script (Web App) แยกเป็น 2 ไฟล์: Code.gs และ Index.html โดยมีคุณสมบัติดังนี้

## หน้าเว็บ (Index.html)
- ออกแบบสำหรับมือถือเป็นหลัก (mobile-first) ภาษาไทย ดูทันสมัย โทนสีน้ำเงินเขียว (teal)
- ฟอร์ม: ชื่อ-นามสกุล, รหัสนักศึกษา, เบอร์โทรศัพท์ (ไม่บังคับ), หมายเหตุ (ไม่บังคับ)
- ถ่ายรูปยืนยันตัวตนจากกล้อง (ใช้ input capture) พร้อม:
  - ใส่ลายน้ำบนรูป (ชื่องาน + วันเวลา)
  - ฟิลเตอร์ปรับแสง/สี/ความนุ่มเล็กน้อย (ไม่เปลี่ยนตัวตน)
  - บีบอัดรูปอัตโนมัติให้ด้านยาวไม่เกิน 900px และประมาณ 700KB ต่อรูป
- ตรวจตำแหน่ง GPS: ขอพิกัดด้วย watchPosition เลือกค่าที่แม่นที่สุดภายใน 30 วินาที
- มี consent (ยินยอมเก็บข้อมูลตาม PDPA) และปุ่มลงทะเบียนจะกดได้เมื่อกรอกครบ + มีรูป + อยู่ในพื้นที่ + ติ๊กยินยอม
- แจ้งผลด้วย modal (info/success/warning/error)

## ฝั่งเซิร์ฟเวอร์ (Code.gs)
- doGet() คืนหน้า Index, getClientConfig() ส่งค่า config ที่ไม่ลับให้หน้าเว็บ
- submitRegistration(payload): ตรวจซ้ำ "ฝั่งเซิร์ฟเวอร์" ทุกครั้ง (ไม่เชื่อค่าจากหน้าเว็บอย่างเดียว)
  - คำนวณระยะจากจุดงานด้วยสูตร Haversine ต้องอยู่ในรัศมี ALLOWED_RADIUS_M และ GPS แม่นกว่า MAX_ACCURACY_M
  - กันลงทะเบียนซ้ำด้วยเบอร์โทร และ User Agent
  - ป้องกัน Formula Injection ก่อนเขียนลงชีต (นำหน้า ' ถ้าขึ้นต้นด้วย = + - @)
  - ใช้ LockService กันการเขียนชนกันเมื่อมีคนลงพร้อมกัน
  - บันทึกข้อมูลลง Google Sheets และอัปโหลดรูปลงโฟลเดอร์ Google Drive (ถ้าเขียนชีตไม่สำเร็จให้ลบไฟล์รูปที่ค้าง)
- setup(): ตรวจ config + สร้าง/อัปเดตหัวตาราง (รันครั้งเดียว)
- CONFIG ให้ตั้งค่าได้: SPREADSHEET_ID, DRIVE_FOLDER_ID, SHEET_NAME, EVENT_NAME, EVENT_LAT, EVENT_LNG, ALLOWED_RADIUS_M, MAX_ACCURACY_M

## ผลลัพธ์ที่ต้องการ
1. โค้ด Code.gs แบบเต็ม
2. โค้ด Index.html แบบเต็ม
3. วิธีตั้งค่า CONFIG (โดยเฉพาะพิกัดงานจาก Google Maps)
4. วิธี Deploy เป็น Web App (Execute as: Me, Who has access: Anyone)

สำคัญ: ห้ามย่อโค้ด ห้ามตัดโค้ด และตรวจสอบ syntax error, undefined variable ให้ครบก่อนตอบ
