โค้ดตัวอย่างนี้เป็นเว็บเพจแบบ Single Page Application (SPA) ที่ผสมผสาน LitElement สำหรับสร้าง component แบบ reusable และ Google Apps Script สำหรับดึงข้อมูลจาก Google Sheets พร้อมระบบ routing และ dynamic template บนหน้าเว็บ
1. โครงสร้าง HTML หลัก
<header>
และ<footer>
เป็นพื้นที่สำหรับ component แบบ reusable<main>
เป็น container สำหรับเนื้อหาหลักของแต่ละหน้า SPA<div id="spinner">
ใช้แสดง loading indicator ระหว่างดึงข้อมูล<div id="app">
เป็นพื้นที่หลักที่เราจะ render content ของแต่ละ page
2. การโหลด Bootstrap และ CSS
- ใช้ Bootstrap 5.3 เพื่อทำให้หน้าตาสวยงามแบบ responsive
nav a.active
กำหนดสีและ font-weight ของเมนูที่ถูกเลือก.spinner
ซ่อนโดย default และจัดให้อยู่ตรงกลางmain
กำหนดความสูงขั้นต่ำ เพื่อให้ layout สวยงามแม้ข้อมูลน้อย
3. Import Lit Bundle แบบครบทุกอย่าง
- ใช้ Lit’s all-in-one bundle (
lit-all.min.js
) รวม directives และฟังก์ชันทั้งหมด html
ใช้สร้าง template literalsrender
ใช้ render template ลงใน DOMLitElement
สำหรับสร้าง custom elementcss
สำหรับ styling ของ componentunsafeHTML
สำหรับ render HTML string ที่มาจาก server (ต้องระวัง XSS)
4. Header Component
- สร้าง navbar แบบ Bootstrap
- ใช้ hash URL เช่น
#home
,#about
,#data
สำหรับ routing SPA - ใช้
render
เพื่อ render header ลง<header id="header">
5. Footer Component
- Footer แบบง่าย ๆ
- render ลง
<footer id="footer">
6. LitElement Component สำหรับตารางข้อมูล
การทำงานของ component:
- properties: กำหนด
rows
เป็น array - styles: กำหนด CSS ของตาราง
- connectedCallback(): เรียก
loadData()
หลัง component ถูก mount - loadData(): เรียก
google.script.run.getSheetData()
เพื่อดึงข้อมูลจาก Google Sheet - render(): แสดงตาราง หรือข้อความ “กำลังโหลดข้อมูล...”
7. ระบบ Router
การทำงาน:
1. route(): ตรวจสอบ hash ใน URL และโหลดหน้าให้ตรงกับ hash2. loadPage(page):
- แสดง spinner
- ล้างเนื้อหาเดิม
- เรียก
google.script.run.getTemplate(page)
เพื่อดึง HTML ของ page จาก Google Apps Script - render HTML ลง
<div id="app">
- อัปเดต class
active
ของเมนู navbar
8. การเชื่อมต่อ Google Apps Script
- ฟังก์ชันสำคัญจากฝั่ง GAS:
getSheetData()
→ คืนค่า array ของ objects จาก Google SheetgetTemplate(page)
→ คืนค่า HTML string ของแต่ละ page- ทำให้หน้าเว็บ ไม่ต้องโหลดใหม่ทั้งหมด และ อัปเดตเนื้อหาแบบ dynamic
9. จุดเด่นของระบบนี้
- SPA Hybrid: ใช้ LitElement สำหรับ component + Google Apps Script เป็น backend
- Reusable Components: header, footer, table สามารถ reuse ได้
- Dynamic Table: ตารางดึงจาก Google Sheet โดยตรง และ render ด้วย LitElement
- Routing แบบ Hash: ไม่ต้อง reload page ทั้งหมด
- Bootstrap Styling: หน้าเว็บสวยและ responsive พร้อม spinner
- Loading & Error Handling: มี spinner และ alert หากโหลด page ไม่สำเร็จ
10. Code.gs
สรุป
โค้ดนี้เป็นตัวอย่าง Google Apps Script SPA แบบครบวงจร
- ผสม LitElement และ Bootstrap
- ใช้ google.script.run ดึงข้อมูลและ template
- ระบบ hash router ทำให้หน้าเว็บเปลี่ยน content แบบ dynamic
- รองรับ componentization (header/footer/table)
- มี loading indicator และ error handling
เหมาะกับเว็บแอปที่ต้อง เชื่อม Google Sheets เป็น backend และต้องการ SPA ที่เบาและโมดูลาร์