ตั้งเป้าที่ท้าทาย วัดผลเป็นตัวเลข แล้วเดินไปด้วยกันทั้งโรงพยาบาล
OKR ย่อมาจาก Objective and Key Results เป็นวิธีตั้งเป้าหมายของแต่ละบุคคลและหน่วยงานให้สอดคล้องกันทั้งองค์กร ตั้งแต่ทิศทางกลยุทธ์ของโรงพยาบาลลงไปถึงแผนปฏิบัติการของเจ้าหน้าที่แต่ละคน
- O
- ยกระดับประสบการณ์ผู้ป่วย OPD ให้รวดเร็วและน่าประทับใจ
- KR1
- ลดเวลารอคอยเฉลี่ย จาก 120 เหลือ 60 นาที
- KR2
- NPS เพิ่มจาก 70% เป็น 90%
- KR3
- Medication Error ที่ห้องยา OPD เป็น 0%
- ขั้นที่ 1
ตั้งเป้าร่วมกัน
ผู้บริหารวางทิศทาง หน่วยงานและบุคลากรเสนอ OKR ที่ท้าทาย
- ขั้นที่ 2
มอบหมายผู้รับผิดชอบ
หัวหน้าเลือกคนที่เหมาะสมดูแล KR แต่ละข้อ
- ขั้นที่ 3
Check-in ทุก 2 สัปดาห์
คุย 1 ต่อ 1 อัปเดตตัวเลข ให้ Feedback และชื่นชมกัน
- ขั้นที่ 4
ทบทวนสิ้นไตรมาส
ให้คะแนน 0.0–1.0 สรุปบทเรียน แล้วตั้งรอบใหม่
Objective (O), วัตถุประสงค์หลัก
จุดมุ่งหมายขององค์กรหรือสิ่งที่เราต้องการทำให้สำเร็จ เป็นเป้าหมายที่ ท้าทาย และ สร้างการเปลี่ยนแปลง เขียนเป็นข้อความเชิงคุณภาพที่ปลุกแรงบันดาลใจ
- ตอบคำถามว่า "เราอยากไปที่ไหน"
- ชัดเจน จำง่าย มีพลัง ไม่ใส่ตัวเลข
- หน่วยงานหนึ่งควรมี 1–3 Objective ต่อรอบ
Key Results (KR), ผลลัพธ์หลัก
ตัวชี้วัดหรือวิธีการที่บอกว่าเราไปถึง Objective แล้วหรือยัง ต้อง วัดผลเป็นตัวเลขหรือคณิตศาสตร์ได้ชัดเจน มีค่าตั้งต้นและค่าเป้าหมาย
- ตอบคำถามว่า "รู้ได้อย่างไรว่าไปถึงแล้ว"
- รูปแบบ: เพิ่ม/ลด [ตัวชี้วัด] จาก X เป็น Y
- 2–5 KR ต่อ 1 Objective
OKR ต่างจาก KPI อย่างไร
| ประเด็น | KPI | OKR |
|---|---|---|
| ใช้กับงานแบบไหน | งานประจำ สิ่งที่ทำให้การดำเนินงานเป็นปกติ (Run the hospital) | เรื่องใหม่ที่ไม่เคยทำได้มาก่อน ต้องการการเติบโตแบบก้าวกระโดด (Change the hospital) |
| ระดับเป้าหมาย | ต้องทำได้ 100% ตามมาตรฐาน | ตั้งสูงจนท้าทาย ทำได้ 60–70% ถือว่าสำเร็จ |
| ใช้ประเมินผลงาน | ใช้ประกอบการประเมินผลงานประจำ | ไม่ใช้พิจารณาเงินเดือนและโบนัสโดยตรง |
| ความโปร่งใส | มักเห็นเฉพาะในหน่วยงาน | เปิดเผยทั้งองค์กร ทุกคนเห็น OKR ของกันและกัน |
| รอบเวลา | รายปี | ราย 3 เดือน (ไตรมาส) หรือรายปี ปรับได้ระหว่างทาง |
| ตัวอย่างในโรงพยาบาล | อัตราครองเตียง, จำนวนผู้ป่วยนอกต่อวัน | ลดเวลารอคอย OPD จาก 120 เหลือ 60 นาทีในไตรมาสนี้ |
วัดเพื่อเรียนรู้ ไม่ใช่เพื่อขึ้นเงินเดือน
OKR ไม่นำมาใช้ประเมินผลงานเพื่อพิจารณาเงินเดือนและโบนัสโดยตรง แต่เน้นการสร้างคุณค่า การเรียนรู้ และการพัฒนาบุคลากร คะแนนให้แบบ 0.0–1.0
เส้นสีทองบนแถบความก้าวหน้าทุกแถบในระบบนี้คือเกณฑ์ 0.7
จากทิศทางกลยุทธ์สู่แผนปฏิบัติการ
ระบบนี้รองรับการพบกันครึ่งทาง: เจ้าหน้าที่เสนอ OKR หน่วยงานได้ แล้วหัวหน้าอนุมัติ
CFR: ขับเคลื่อน OKR ด้วยการสื่อสาร
พูดคุย 1 ต่อ 1 ระหว่างหัวหน้ากับผู้รับผิดชอบ อย่างน้อยทุก 2 สัปดาห์
ให้ข้อเสนอแนะสองทาง ทั้งบนลงล่างและล่างขึ้นบน แก้ปัญหาบุคลากรไม่ได้รับ Feedback
ชื่นชมความพยายามและผลงานอย่างเปิดเผย สร้างแรงจูงใจให้ทีม
ตัวอย่างร่าง OKR สำหรับโรงพยาบาลชุมชน
กด "ใช้เป็นแม่แบบ" เพื่อคัดลอกตัวอย่างไปปรับเป็น OKR ของหน่วยงานคุณในโมดูลที่ 2
จุดสำคัญในการนำไปใช้
เป้าหมายเหล่านี้ไม่ใช่ KPI สำหรับขึ้นเงินเดือน แต่เป็นการตั้งเป้าให้ทีมท้าทายตัวเองในรอบ 3 เดือน ค่าเป้าหมายที่ตั้งสูง (เช่น 0% หรือลดลง 50%) หากทำได้เพียง 60–70% ตามเกณฑ์ OKR ก็ถือว่าประสบความสำเร็จและมีแรงขับเคลื่อนแล้ว
ตั้งเป้าหมายและเชื่อมโยง OKR ทั้งโรงพยาบาล
ทุกคนเห็น OKR ของทุกหน่วยงาน เพื่อวิเคราะห์ความสอดคล้องได้เอง เป้าหมายที่เส้นขอบเป็นเส้นประคือข้อเสนอแบบ Bottom Up ที่รอหัวหน้าอนุมัติ
มอบหมายผู้รับผิดชอบ ติดตามความก้าวหน้า และพูดคุยแบบ CFR
เลือก OKR เพื่อมอบหมายผู้รับผิดชอบรายข้อ บันทึก Check-in จากการคุย 1 ต่อ 1 การประชุมกลุ่ม หรือรายงานผู้บริหาร และปรับเปลี่ยน OKR เมื่อจำเป็น
บันทึก Check-in
Conversation, Feedback, Recognition
พื้นที่สื่อสารระหว่างผู้บริหาร หัวหน้า และเจ้าหน้าที่ โพสต์ของเจ้าหน้าที่ที่ยังไม่มีหัวหน้าหรือผู้บริหารตอบจะถูกนับเป็น "รอ Feedback"
ภาพรวมการขับเคลื่อน OKR
สรุปข้อมูลให้ผู้บริหารและหัวหน้าแผนกใช้ตัดสินใจจากข้อมูล ตัวเลขทุกตัวคำนวณจาก OKR และ Check-in ที่บันทึกในระบบนี้
คะแนนเฉลี่ยรายหน่วยงาน
ค่าเฉลี่ยคะแนน OKR หน่วยงานและบุคคล (0.0–1.0) เส้นสีทองคือเกณฑ์ 0.7
จังหวะการ Check-in และ CFR
จำนวนบันทึก Check-in และโพสต์ CFR ต่อสัปดาห์ ย้อนหลัง 8 สัปดาห์
OKR ที่ต้องให้ความสนใจ
คะแนนต่ำกว่า 0.4, ความมั่นใจล่าสุดต่ำกว่า 5/10 หรือไม่มี Check-in เกิน 14 วัน
ตารางสิทธิ์ผู้ใช้งาน
C = เพิ่ม, R = ดู, U = แก้ไข, D = ลบ, สีเหลือง = มีเงื่อนไข (ระบุใต้ช่อง), แถบไฮไลต์คือบทบาทของคุณ
สิทธิ์การใช้ระบบแต่ละส่วน (ค่าเริ่มต้นตามบทบาท)
ผู้ดูแลระบบเปิดหรือปิดแต่ละส่วนให้ผู้ใช้รายคนได้ในตารางผู้ใช้ด้านล่าง ส่วนที่ปิดจะไม่แสดงในเมนู และเซิร์ฟเวอร์จะไม่ส่งข้อมูลส่วนนั้นให้
คู่มือระบบศูนย์ OKR โรงพยาบาล
ส่วนแรกสำหรับบุคลากรทุกระดับที่ใช้งานระบบประจำวัน ส่วนที่สองสำหรับผู้ดูแลระบบหรืองานสารสนเทศที่ติดตั้งระบบบน Google Sheets, Google Drive และ Cloudflare
1. การเข้าใช้งาน
- เปิดลิงก์ระบบที่งานสารสนเทศแจ้ง เช่น
https://okr.โรงพยาบาล.go.th - กรอก ชื่อผู้ใช้ และ รหัสผ่าน ที่ได้รับจากผู้ดูแลระบบ แล้วกด เข้าสู่ระบบ ติ๊ก "จำการเข้าสู่ระบบ" เฉพาะเครื่องส่วนตัวเท่านั้น
- ครั้งแรกระบบจะให้ ตั้งรหัสผ่านใหม่ แทนรหัสตั้งต้น 1234 อย่างน้อย 8 ตัวอักษร มีทั้งตัวอักษรภาษาอังกฤษและตัวเลข
- มุมขวาบนจะแสดงชื่อและบทบาทของคุณ พร้อมปุ่ม เปลี่ยนรหัสผ่าน และ ออกจากระบบ
เมนูที่คุณเห็นขึ้นกับสิทธิ์ที่ผู้ดูแลระบบกำหนด ถ้าไม่เห็นแท็บที่ต้องใช้ ให้ติดต่อผู้ดูแลระบบ
เมนูหลักมี 5 แท็บด้านบน: ความรู้ OKR, ตั้งเป้าหมาย & เชื่อมโยง, มอบหมาย & Check-In, แดชบอร์ด & สิทธิ์ และคู่มือนี้ ใช้งานได้ทั้งบนคอมพิวเตอร์และโทรศัพท์มือถือ
2. บทบาทของคุณ
ผู้ใช้ทุกคนเห็น OKR ของทุกหน่วยงานเพื่อความโปร่งใส แต่สิทธิ์เพิ่ม แก้ไข และลบ ขึ้นกับบทบาท ดูตารางสิทธิ์เต็มได้ที่แท็บ 4
| บทบาท | ใครควรได้บทบาทนี้ | ทำอะไรได้ |
|---|---|---|
| ผู้บริหาร | ผอ., รองผอ., ทีมนำ | กำหนดทิศทางกลยุทธ์และ OKR องค์กร แก้ไข OKR หน่วยงานทุกแห่ง ดูข้อมูลเชิงลึกทั้งหมด |
| หัวหน้ากลุ่มงาน/หัวหน้าหอ | หัวหน้ากลุ่มงาน, หัวหน้าหอผู้ป่วย | สร้าง แก้ไข อนุมัติ OKR หน่วยงานและบุคคลในหน่วยงานตนเอง มอบหมายผู้รับผิดชอบ ดูบันทึก 1 ต่อ 1 ของหน่วยงาน |
| เจ้าหน้าที่ | บุคลากรทั่วไป | สร้าง OKR บุคคลของตนเอง เสนอ OKR หน่วยงาน (รออนุมัติ) บันทึก Check-in โพสต์ CFR |
| ผู้ดูแลระบบ | งานสารสนเทศ, เลขาทีม OKR | ทำได้ทุกอย่าง และกำหนดบทบาทให้ผู้อื่น |
| ผู้เยี่ยมชม | ผู้ตรวจประเมิน, ผู้เยี่ยมสำรวจ | ดูได้อย่างเดียว ไม่เห็นข้อมูลเชิงลึก |
3. รอบการทำงาน OKR 1 ไตรมาส
ระบบตั้งรอบเป็นไตรมาสตามปีงบประมาณ เช่น Q1/2570 คือ ต.ค.–ธ.ค. 2569 ลำดับงานที่แนะนำ:
| ช่วงเวลา | สิ่งที่ทำ | ผู้ทำ | ทำที่แท็บ |
|---|---|---|---|
| 2 สัปดาห์ก่อนเริ่มไตรมาส | ทบทวนทิศทางกลยุทธ์ ประกาศ OKR องค์กร | ผู้บริหาร | 2 |
| สัปดาห์ที่ 1 | หน่วยงานประชุมร่วมกันตั้ง OKR หน่วยงาน เจ้าหน้าที่เสนอไอเดีย (Bottom Up) | หัวหน้า + ทีม | 1, 2 |
| สัปดาห์ที่ 2 | อนุมัติ OKR หน่วยงาน ตั้ง OKR บุคคล มอบหมายผู้รับผิดชอบรายข้อ KR | หัวหน้า, เจ้าหน้าที่ | 2, 3 |
| ทุก 2 สัปดาห์ | คุย 1 ต่อ 1 แล้วบันทึก Check-in พร้อมอัปเดตค่า KR | หัวหน้า + ผู้รับผิดชอบ | 3 |
| ทุกเดือน | ประชุมกลุ่มทบทวนความก้าวหน้า ส่งรายงานผู้บริหาร | หัวหน้า | 3, 4 |
| สัปดาห์สุดท้าย | ประเมินคะแนนสุดท้าย สรุปบทเรียน ตั้ง OKR รอบใหม่ | ทุกคน | 3, 4 |
4. ศึกษาความรู้ OKR (แท็บ 1)
อ่านหลักการก่อนตั้งเป้าหมาย: ความหมายของ O และ KR, ความต่างระหว่าง OKR กับ KPI และหลักการประเมินผลที่ไม่ผูกกับเงินเดือน ด้านล่างมีคลังตัวอย่าง 2 ชุด
- เลือกชุดตัวอย่าง ครบทุกกลุ่มงาน หรือ 4 แผนกหลัก
- กด ใช้เป็นแม่แบบ ใต้ตัวอย่างที่ใกล้กับหน่วยงานคุณ ระบบจะเปิดฟอร์มลงทะเบียนพร้อมข้อความและค่าเป้าหมายให้
- ปรับข้อความ ค่าตั้งต้น และค่าเป้าหมายให้ตรงกับข้อมูลจริงของหน่วยงาน แล้วกดบันทึก
5. ลงทะเบียน OKR (แท็บ 2)
- กด + ลงทะเบียน OKR ใหม่ หรือกด + OKR หน่วยงาน ใต้เป้าหมายระดับบนที่ต้องการเชื่อมโยง (ระบบจะเลือกเป้าหมายระดับบนให้อัตโนมัติ)
- เลือก ระดับเป้าหมาย: ทิศทางกลยุทธ์ → OKR องค์กร → OKR หน่วยงาน → OKR บุคคล ระดับที่เลือกได้ขึ้นกับบทบาทของคุณ
- เลือก เป้าหมายระดับบน ที่ OKR นี้ช่วยให้สำเร็จ, หน่วยงาน, รอบเวลา (ไตรมาสหรือรายปี) และผู้รับผิดชอบหลัก
- เขียน Objective เป็นข้อความเชิงคุณภาพที่ท้าทาย ไม่ต้องมีตัวเลข
- เลือกที่มาของเป้าหมาย: Top Down, Bottom Up หรือพบกันครึ่งทาง
- เพิ่ม Key Results 2–5 ข้อ แต่ละข้อกรอก ค่าตั้งต้น, ค่าเป้าหมาย, หน่วย และทิศทาง (ยิ่งมากยิ่งดี หรือยิ่งน้อยยิ่งดี)
- เพิ่ม แผนปฏิบัติการ: กิจกรรม ผู้ทำ และวันกำหนดเสร็จ ติ๊กช่องหน้ากิจกรรมเมื่อทำเสร็จ
- กด บันทึก OKR จะขึ้นในแผนผังให้ทุกคนเห็นทันที
6. เชื่อมโยงเป้าหมายและอ่านแผนผัง
- แผนผังแสดงลำดับชั้นจากทิศทางกลยุทธ์ลงไปถึง OKR บุคคล เส้นด้านซ้ายบอกว่าเป้าหมายย่อยอยู่ใต้เป้าหมายใด
- กลุ่ม ยังไม่เชื่อมโยงกับเป้าหมายระดับบน คือ OKR ที่ยังไม่ระบุว่าส่งผลต่อเป้าหมายใดของโรงพยาบาล ควรแก้ไขให้เชื่อมโยงก่อนเริ่มไตรมาส
- ตัวเลข เชื่อมโยงกับระดับบนแล้ว ด้านบนแผนผังบอกระดับความสอดคล้อง (Alignment) ของทั้งองค์กร
- ใช้ช่องค้นหา ตัวกรองหน่วยงาน และรอบเวลา เพื่อดู OKR ของหน่วยงานอื่น เมื่อกรองอยู่ ระบบแสดงเป็นรายการแทนแผนผัง
- กด Key Results n ข้อ เพื่อดูค่าตั้งต้น เป้าหมาย ค่าปัจจุบัน และผู้รับผิดชอบรายข้อ
7. เสนอ OKR แบบ Bottom Up และการอนุมัติ
- เจ้าหน้าที่ลงทะเบียน OKR ระดับ OKR หน่วยงาน ได้ ระบบบันทึกเป็น รออนุมัติ และกรอบเป็นเส้นประ
- หัวหน้าหน่วยงานเห็นปุ่ม อนุมัติข้อเสนอ บนการ์ด หรือกด แก้ไข เพื่อปรับก่อนอนุมัติ
- เมื่ออนุมัติ ระบบบันทึกประวัติ "อนุมัติข้อเสนอ Bottom Up" ไว้ใน OKR นั้น
8. ปรับเปลี่ยน OKR ระหว่างรอบ
OKR ปรับได้ตลอดเวลาเมื่อสถานการณ์เปลี่ยน เช่น ข้อมูลฐานผิด หรือมีนโยบายใหม่ กด แก้ไข / ปรับเปลี่ยน ที่การ์ด หรือ ปรับเปลี่ยน OKR ในแท็บ 3 แล้วกรอกช่อง เหตุผลการปรับเปลี่ยน ทุกครั้ง ประวัติจะแสดงให้ทุกคนเห็นว่าใครปรับอะไรเมื่อไร
9. มอบหมายผู้รับผิดชอบ (แท็บ 3)
- เลือก OKR จากช่อง OKR ที่ต้องการติดตาม หรือกด ติดตามผล บนการ์ดในแท็บ 2
- กรอกชื่อในช่อง ผู้รับผิดชอบหลัก แล้วกดบันทึก
- ใต้ KR แต่ละข้อ กรอกชื่อผู้รับผิดชอบแล้วกด มอบหมาย ระบบจะแนะนำชื่อที่เคยใช้ในระบบให้เลือก
- กด แชร์ OKR เพื่อคัดลอกข้อความสรุปไปวางใน LINE กลุ่มหรืออีเมลของหน่วยงาน
10. บันทึก Check-in และแนบไฟล์
- ในแท็บ 3 กด + Check-in แล้วเลือกรูปแบบ: พูดคุย 1 ต่อ 1, ประชุมกลุ่ม หรือ รายงานผู้บริหาร
- กรอกค่าปัจจุบันของ KR ที่มีข้อมูลใหม่ ข้อที่ไม่เปลี่ยนให้คงค่าเดิมไว้
- เลื่อนแถบ ความมั่นใจ 1–10 ว่าจะบรรลุ OKR ภายในรอบนี้
- เขียนสรุป: ทำอะไรไปแล้ว ติดอุปสรรคอะไร ต้องการความช่วยเหลืออะไร และจะทำอะไรต่อ
- แนบไฟล์หลักฐาน (ไม่เกิน 8 MB ต่อไฟล์) เช่น รายงานสรุป ภาพกิจกรรม ไฟล์จะเก็บใน Google Drive ของโรงพยาบาล
- กด บันทึก Check-in แถบความก้าวหน้าและแดชบอร์ดจะอัปเดตทันที
บันทึก 1 ต่อ 1 เป็นข้อมูลเชิงลึก ผู้ที่ไม่มีสิทธิ์จะเห็นเพียงว่ามีการคุย แต่ไม่เห็นเนื้อหา ค่าความมั่นใจ และไฟล์แนบ
11. กระดาน CFR
- Conversation: ถามคำถาม ขอความช่วยเหลือ หรือเล่าความคืบหน้าแบบไม่เป็นทางการ
- Feedback: ให้ข้อเสนอแนะ ทั้งหัวหน้าถึงทีมและทีมถึงหัวหน้า
- Recognition: ชื่นชมบุคคลหรือทีมอย่างเปิดเผย
เลือกประเภท ระบุว่าถึงใคร เลือก OKR ที่เกี่ยวข้อง (ถ้ามี) แล้วกด โพสต์ ทุกโพสต์ตอบกลับได้ใต้โพสต์นั้น โพสต์ของเจ้าหน้าที่ที่ยังไม่มีหัวหน้าหรือผู้บริหารตอบจะมีป้าย รอ Feedback หัวหน้าควรกดตัวกรอง รอ Feedback ทุกสัปดาห์และตอบให้ครบ
12. อ่านแดชบอร์ด (แท็บ 4)
- คะแนนเฉลี่ย และ ถึงเกณฑ์ 0.7: ภาพรวมความสำเร็จของรอบที่เลือก
- เชื่อมโยงระดับบน: สัดส่วน OKR ที่ระบุเป้าหมายระดับบน ควรใกล้ 100%
- Check-in ใน 14 วัน: สัดส่วน OKR ที่มีการติดตามสม่ำเสมอ
- คะแนนเฉลี่ยรายหน่วยงาน: เส้นสีทองคือเกณฑ์ 0.7 แถบสีเขียว เหลือง แดง บอกระดับ
- จังหวะการ Check-in และ CFR: ถ้ากราฟเป็นศูนย์หลายสัปดาห์ แปลว่าการขับเคลื่อนหยุดชะงัก
- OKR ที่ต้องให้ความสนใจ: คะแนนต่ำกว่า 0.4 ความมั่นใจต่ำกว่า 5 หรือไม่ได้ Check-in เกิน 14 วัน (เห็นเฉพาะผู้มีสิทธิ์ข้อมูลเชิงลึก)
13. วิธีคิดคะแนน
คะแนน KR แต่ละข้ออยู่ระหว่าง 0.0–1.0 คิดจากระยะทางที่เดินไปได้จากค่าตั้งต้นสู่ค่าเป้าหมาย คะแนน OKR คือค่าเฉลี่ยของ KR ทุกข้อ ทิศทางกลยุทธ์ที่ไม่มี KR ใช้ค่าเฉลี่ยของเป้าหมายย่อย
คะแนน KR = (ค่าปัจจุบัน − ค่าตั้งต้น) ÷ (ค่าเป้าหมาย − ค่าตั้งต้น) จำกัดไว้ที่ 0.0–1.0
| ตัวอย่าง KR | ตั้งต้น | เป้าหมาย | ปัจจุบัน | คะแนน |
|---|---|---|---|---|
| เวลารอคอย OPD (ยิ่งน้อยยิ่งดี) | 120 | 60 | 80 | (80−120)÷(60−120) = 0.67 |
| NPS (ยิ่งมากยิ่งดี) | 70 | 90 | 85 | (85−70)÷(90−70) = 0.75 |
| Medication Error = 0 (ไม่มีค่าตั้งต้น) | — | 0 | 0 | ผ่าน = 1.00 |
OKR นี้ได้ (0.67 + 0.75 + 1.00) ÷ 3 = 0.81 ซึ่งเกินเกณฑ์ 0.7 ถือว่าสำเร็จ จำไว้ว่าคะแนนนี้ใช้เพื่อเรียนรู้ ไม่ใช้พิจารณาเงินเดือนหรือโบนัส
14. คำถามที่พบบ่อย
ทำไมกดปุ่มแก้ไขไม่ได้
บทบาทของคุณไม่มีสิทธิ์แก้ไข OKR นั้น เช่น หัวหน้าหน่วยงานอื่น ให้ติดต่อผู้รับผิดชอบหรือผู้ดูแลระบบ
บันทึกแล้วข้อมูลหายหรือไม่ขึ้น
ระบบดึงข้อมูลใหม่ทุก 30 วินาที ถ้าขึ้นข้อความแจ้งข้อผิดพลาด ให้ลองใหม่ หรือโหลดหน้าใหม่ ถ้าขึ้นว่า "หมดเวลาเข้าสู่ระบบ" ให้โหลดหน้าแล้วกรอกรหัสจากอีเมลอีกครั้ง
ลบ OKR ผิดกู้คืนได้ไหม
ผู้ดูแลระบบกู้คืนได้จากประวัติเวอร์ชันของ Google Sheets (ไฟล์ > ประวัติเวอร์ชัน) แจ้งเวลาที่ลบให้ผู้ดูแลระบบ
OKR ทำได้แค่ 60% ถือว่าล้มเหลวไหม
ไม่ใช่ OKR ตั้งให้ท้าทาย ทำได้ 60–70% ถือว่าสำเร็จและมีแรงขับเคลื่อนแล้ว ถ้าได้ 100% ทุกรอบ แปลว่าเป้าหมายอาจง่ายเกินไป
1. สถาปัตยกรรมระบบ
public/ และ Function /api ตรวจ JWT- หน้าเว็บเป็นไฟล์ static ไม่มีข้อมูลในตัว ข้อมูลทั้งหมดไหลผ่าน
/apiเท่านั้น - Function
/apiตรวจลายเซ็น JWT ของ Cloudflare Access ทุกคำขอ แล้วส่งอีเมลที่ยืนยันแล้วพร้อม secret ไปยัง Apps Script เบราว์เซอร์จึงไม่เคยเห็น secret หรือ URL ของ Apps Script - Apps Script ตรวจสิทธิ์ตามตาราง Access Control Matrix ฝั่งเซิร์ฟเวอร์ และกรองบันทึก 1 ต่อ 1 ที่ผู้ใช้ไม่มีสิทธิ์ดูออกก่อนส่งกลับ
- ไฟล์แนบเก็บในโฟลเดอร์ Drive ของบัญชีผู้ติดตั้ง ไม่เปิดแชร์สาธารณะ ผู้ใช้ดาวน์โหลดผ่าน
/apiตามสิทธิ์
2. สิ่งที่ต้องเตรียม
- บัญชี Google ของหน่วยงาน (แนะนำ Google Workspace ของโรงพยาบาลมากกว่าบัญชี Gmail ส่วนตัว) ทำหน้าที่เป็นเจ้าของ Sheet, Drive และ Apps Script
- บัญชี Cloudflare (แพ็กเกจฟรีใช้ได้ Cloudflare Access ฟรีสำหรับผู้ใช้ไม่เกิน 50 คน ถ้าเกินต้องใช้แพ็กเกจเสียเงิน)
- คอมพิวเตอร์ที่ติดตั้ง Node.js 18 ขึ้นไป เพื่อใช้คำสั่ง
wranglerหรือจะอัปโหลดผ่าน Dashboard ก็ได้ - (ทางเลือก) โดเมนของโรงพยาบาลที่อยู่ใน Cloudflare เช่น
okr.hospital.go.th - ไฟล์ในโปรเจกต์:
src/app.html,scripts/build.mjs,functions/api/index.js,apps-script/Code.gs,wrangler.toml
3. สร้างฐานข้อมูลบน Google Sheets
- เข้า sheets.google.com ด้วยบัญชีหน่วยงาน สร้างสเปรดชีตใหม่ ตั้งชื่อ OKR Hospital Database
- เมนู ส่วนขยาย > Apps Script จะเปิดโปรเจกต์ที่ผูกกับชีตนี้ ตั้งชื่อโปรเจกต์ OKR Hospital API
- ลบโค้ดเดิมในไฟล์
Code.gsทั้งหมด แล้ววางเนื้อหาจากไฟล์apps-script/Code.gsในโปรเจกต์ กด Ctrl+S - ที่แถบด้านบน เลือกฟังก์ชัน setup แล้วกด เรียกใช้ ครั้งแรกจะขออนุญาตสิทธิ์ ให้กด ตรวจสอบสิทธิ์ > เลือกบัญชี > ขั้นสูง > ไปที่ OKR Hospital API > อนุญาต
- เปิด บันทึกการดำเนินการ จะเห็นค่าดังนี้ จดค่า
API_SECRETไว้ใช้ในขั้นที่ 6 (เก็บเป็นความลับ) - สร้างบัญชีผู้ดูแลระบบสำหรับเข้าสู่ระบบ: ในโค้ดหาฟังก์ชัน
createAdminแก้usernameและใส่passwordแล้วเลือกฟังก์ชัน createAdmin กด เรียกใช้ - (ทางเลือก) เลือกฟังก์ชัน createDepartmentHeads แล้วกด เรียกใช้ เพื่อสร้างบัญชีหัวหน้าทุกหน่วยงาน รหัสผ่าน 1234 รายชื่อที่สร้างจะแสดงในบันทึกการดำเนินการ
- ลบรหัสผ่านออกจากโค้ดทันที (แก้กลับเป็น
"") แล้วบันทึก รหัสผ่านในชีตเก็บเป็นค่าแฮชแล้ว ไม่ต้องเก็บในโค้ด
API_SECRET = 3f9c…(ตัวอักษร 64 ตัว) DRIVE_FOLDER_ID = 1AbC… ขั้นต่อไป: แก้ชื่อผู้ใช้และรหัสผ่านในฟังก์ชัน createAdmin แล้วเรียกใช้
setup จะสร้างชีต 10 แผ่น (Users, Sessions, OKRs, KeyResults, Actions, History, CheckIns, CFR, Files, AuditLog) ตั้งหัวตาราง ซ่อนชีต Sessions และสร้างโฟลเดอร์ Drive เรียกซ้ำได้โดยข้อมูลเดิมไม่หาย
ค่าตั้งค่าเพิ่มเติม (Script Properties)
ไปที่ การตั้งค่าโปรเจกต์ (ไอคอนเฟือง) > คุณสมบัติของสคริปต์
| คีย์ | ค่า | ความหมาย |
|---|---|---|
API_SECRET | สร้างอัตโนมัติ | รหัสที่ Cloudflare ต้องแนบมาทุกคำขอ เปลี่ยนได้โดยแก้ค่าแล้วตั้งค่าใหม่ใน Cloudflare ให้ตรงกัน |
DRIVE_FOLDER_ID | สร้างอัตโนมัติ | โฟลเดอร์เก็บไฟล์แนบ เปลี่ยนเป็นโฟลเดอร์ใน Shared Drive ของโรงพยาบาลได้ |
AUTO_ROLE | staff | (เฉพาะโหมด access) บทบาทของผู้ที่เข้าระบบด้วยอีเมลครั้งแรก ตั้งเป็น viewer หรือ none (ต้องให้ผู้ดูแลเพิ่มก่อนเท่านั้น) ได้ |
4. เปิดเว็บแอป Apps Script
- ในหน้า Apps Script กด การทำให้ใช้งานได้ > การทำให้ใช้งานได้รายการใหม่
- กดไอคอนเฟือง เลือกประเภท เว็บแอป
- ตั้งค่า ดำเนินการในฐานะ: ฉัน และ ผู้ที่มีสิทธิ์เข้าถึง: ทุกคน แล้วกด ทำให้ใช้งานได้
- คัดลอก URL ของเว็บแอป ที่ลงท้ายด้วย
/execไว้ใช้ในขั้นที่ 6
API_SECRET ที่ถูกต้อง ซึ่งมีเฉพาะใน Cloudflare ห้ามเผยแพร่ URL และ secretเมื่อแก้โค้ดในอนาคต ให้ใช้ การทำให้ใช้งานได้ > จัดการการทำให้ใช้งานได้ > แก้ไข (ดินสอ) > เวอร์ชัน: เวอร์ชันใหม่ เพื่อให้ URL เดิมใช้ได้ต่อ
ทดสอบโดยเปิด URL ในเบราว์เซอร์ ต้องเห็น {"ok":true,"service":"okr-hospital",…}
5. Google Drive สำหรับไฟล์แนบ
setupสร้างโฟลเดอร์ OKR Hospital - ไฟล์แนบ ใน My Drive ของบัญชีผู้ติดตั้ง ไฟล์ของแต่ละ OKR จะอยู่ในโฟลเดอร์ย่อยตามรหัส OKR- ไฟล์ไม่ถูกแชร์ให้ใครโดยอัตโนมัติ ผู้ใช้ดาวน์โหลดผ่านระบบตามสิทธิ์ ไฟล์ที่แนบในบันทึก 1 ต่อ 1 ดาวน์โหลดได้เฉพาะผู้มีสิทธิ์ข้อมูลเชิงลึก
- แนะนำให้ย้ายไปใช้ Shared Drive ของโรงพยาบาล: สร้างโฟลเดอร์ใน Shared Drive คัดลอก ID จาก URL (ส่วนหลัง
/folders/) แล้วใส่ใน Script PropertyDRIVE_FOLDER_ID - ขนาดไฟล์สูงสุด 8 MB ต่อไฟล์ ตามข้อจำกัดของการส่งข้อมูลผ่าน Apps Script
6. นำหน้าเว็บขึ้น Cloudflare Pages
โครงสร้างโปรเจกต์:
okr-hospital/ ├── src/app.html หน้าเว็บ (แก้ไขที่ไฟล์นี้) ├── scripts/build.mjs สร้าง public/index.html สำหรับ Cloudflare ├── public/index.html ไฟล์ที่ build แล้ว (อย่าแก้ตรงนี้) ├── functions/api/index.js Pages Function สำหรับ /api ├── apps-script/Code.gs โค้ด Google Apps Script ├── wrangler.toml ค่าตั้งค่า Cloudflare ├── package.json คำสั่ง npm run build / deploy / dev └── README.md
- แก้
wrangler.toml: ใส่GAS_URL(URL จากขั้นที่ 4) ส่วนCF_ACCESS_TEAMและCF_ACCESS_AUDจะได้ในขั้นที่ 7 - เปิด Terminal ในโฟลเดอร์
okr-hospitalแล้วล็อกอิน Cloudflare
npx wrangler login npx wrangler pages project create okr-hospital --production-branch main npx wrangler pages secret put GAS_SECRET --project-name okr-hospital npm run deploy
คำสั่งที่ 3 จะถามค่า ให้วาง API_SECRET จากขั้นที่ 3 หลัง deploy จะได้ URL เช่น https://okr-hospital.pages.dev
ผูกโดเมนของโรงพยาบาล (ทางเลือก)
Dashboard > Workers & Pages > okr-hospital > Custom domains > Set up a custom domain ใส่ okr.hospital.go.th
ทางเลือก: อัปโหลดผ่าน Dashboard หรือ GitHub
สร้างโปรเจกต์ Pages ด้วยการเชื่อม GitHub repository ที่มีไฟล์ชุดนี้ ตั้ง Build command ว่าง และ Build output directory เป็น public โฟลเดอร์ functions จะถูก deploy อัตโนมัติ (การลากไฟล์ขึ้น Dashboard โดยตรงจะไม่รวม Functions)
7. เลือกวิธีเข้าสู่ระบบ
ระบบรองรับ 2 วิธี เลือกด้วยตัวแปร AUTH_MODE ใน wrangler.toml
| วิธี | ผู้ใช้ล็อกอินด้วย | เหมาะกับ |
|---|---|---|
password (ค่าเริ่มต้น) | ชื่อผู้ใช้และรหัสผ่านที่ผู้ดูแลสร้างในระบบ เก็บในชีต Users | โรงพยาบาลที่บุคลากรไม่มีอีเมลองค์กรครบทุกคน ไม่จำกัดจำนวนผู้ใช้ |
access | รหัส OTP ทางอีเมล ผ่าน Cloudflare Access | โรงพยาบาลที่ทุกคนมีอีเมลองค์กร ผู้ใช้ไม่เกิน 50 คน (แพ็กเกจฟรี) |
ถ้าใช้โหมด password ข้ามขั้นตอนด้านล่างได้ทั้งหมด ถ้าใช้โหมด access ให้ตั้งค่าดังนี้ แล้วตั้ง AUTH_MODE = "access"
- Dashboard > Zero Trust ครั้งแรกให้ตั้งชื่อทีม เช่น
myhospital(ได้โดเมนmyhospital.cloudflareaccess.com) ค่านี้คือCF_ACCESS_TEAM - Settings > Authentication > Login methods เปิด One-time PIN (หรือเชื่อม Google Workspace / Microsoft Entra ID ของโรงพยาบาล)
- Access > Applications > Add an application > Self-hosted ตั้งชื่อ OKR Hospital Session duration 24 ชั่วโมง
- เพิ่ม Public hostname ทุกโดเมนที่ใช้:
okr-hospital.pages.devและokr.hospital.go.th(ถ้ามี) - สร้าง Policy ชื่อ Hospital staff Action: Allow Include: Emails ending in
@hospital.go.thหรือ Emails ระบุรายชื่อ - บันทึกแล้วเปิดแอปที่สร้าง คัดลอก Application Audience (AUD) Tag นี่คือ
CF_ACCESS_AUD - ในโปรเจกต์ Pages > Settings > General > Access policy เปิดใช้เพื่อป้องกัน preview deployments ด้วย
ใส่ค่าใน wrangler.toml แล้ว deploy อีกครั้ง:
[vars] AUTH_MODE = "access" CF_ACCESS_TEAM = "myhospital" CF_ACCESS_AUD = "4714c1358e65fe4b408ad6d432a5f878f08194bdb4752441fd56faefa9b2b6f2" GAS_URL = "https://script.google.com/macros/s/AKfycb.../exec"
npm run deploy
8. ทดสอบและเปิดใช้งาน
- เปิด URL ของระบบ ต้องเจอหน้า เข้าสู่ระบบ (หรือหน้าขออีเมลของ Cloudflare Access ถ้าใช้โหมด access)
- ล็อกอินด้วยบัญชีจาก
createAdminมุมขวาบนต้องขึ้น Google Sheets และบทบาท ผู้ดูแลระบบ - ลงทะเบียน OKR ทดสอบ 1 รายการ แล้วเปิด Google Sheets ต้องเห็นแถวใหม่ในชีต OKRs และ KeyResults
- บันทึก Check-in พร้อมแนบไฟล์ ตรวจว่ามีไฟล์ในโฟลเดอร์ Drive และแถวในชีต Files
- แท็บ 4 > ผู้ใช้งาน รหัสผ่าน และสิทธิ์ เพิ่มบัญชีผู้บริหารและหัวหน้า กำหนดบทบาท หน่วยงาน และส่วนที่ใช้งานได้ (ดูหัวข้อ 9)
- ใช้ ทดลองดูในมุมมอง ตรวจว่าแต่ละบทบาทเห็นปุ่มตามตารางสิทธิ์ จากนั้นประกาศลิงก์ให้บุคลากร
ทดสอบในเครื่องก่อนขึ้นจริง
สร้างไฟล์ .dev.vars (ห้าม commit) แล้วรัน npm run dev ระบบจะใช้อีเมลใน DEV_USER_EMAIL แทนการล็อกอิน
# .dev.vars GAS_SECRET=ค่า API_SECRET DEV_USER_EMAIL=it@hospital.go.th
npm run dev
DEV_USER_EMAIL บน production เพราะจะทำให้ผู้ที่ไม่มี JWT ถูกนับเป็นอีเมลนั้น9. ผู้ใช้ รหัสผ่าน และสิทธิ์
สิทธิ์ของผู้ใช้แต่ละคนกำหนดจาก 3 ชั้น ทุกชั้นตรวจที่เซิร์ฟเวอร์ (Apps Script) ไม่ใช่แค่ซ่อนปุ่มบนหน้าจอ
| ชั้น | กำหนดอะไร | ตั้งที่ไหน |
|---|---|---|
| บทบาท | เพิ่ม ดู แก้ไข ลบ ข้อมูลแต่ละประเภท (ตาราง Access Control Matrix) | คอลัมน์ role |
| หน่วยงาน | หัวหน้าแก้ไขได้เฉพาะ OKR ของหน่วยงานตนเอง และเห็นบันทึก 1 ต่อ 1 ของหน่วยงานตนเอง | คอลัมน์ dept |
| ส่วนของระบบ | เปิดหรือปิดแท็บและฟังก์ชัน: ความรู้ OKR, ตั้งเป้าหมาย, มอบหมาย & Check-in, กระดาน CFR, แดชบอร์ด, คู่มือ, จัดการผู้ใช้ (ส่วนสุดท้ายใช้ได้เฉพาะผู้ดูแลระบบ) | คอลัมน์ modules_json (เก็บเฉพาะค่าที่ต่างจากค่าเริ่มต้นของบทบาท) |
งานประจำของผู้ดูแลระบบ (แท็บ 4)
- บัญชีหัวหน้าหน่วยงาน: กด สร้างบัญชีหัวหน้าทุกหน่วยงาน (หรือเรียกฟังก์ชัน
createDepartmentHeadsใน Apps Script) ระบบสร้างhead-opd,head-er,head-ipdฯลฯ ครบ 15 หน่วยงาน บทบาทหัวหน้า ผูกกับหน่วยงานของตน (ทีมบริหารได้บทบาทผู้บริหาร) รหัสผ่านตั้งต้น 1234 แจ้งชื่อผู้ใช้ให้หัวหน้าแต่ละคน แล้วแก้ชื่อจริงในตารางผู้ใช้ - เพิ่มผู้ใช้รายคน: กรอกชื่อผู้ใช้ (a-z ตัวเลข . _ - @) ชื่อ-สกุล บทบาท หน่วยงาน แล้วเลือก สถานะเริ่มต้น: เปิดใช้งานทันที หรือ รอดำเนินการ (สร้างบัญชีไว้ก่อน แต่ผู้ใช้ยังเข้าระบบไม่ได้) กด เพิ่มผู้ใช้ รหัสผ่านตั้งต้นคือ 1234
- สถานะบัญชี: แต่ละแถวมีช่องสถานะ 3 แบบ เปิดใช้งาน เข้าระบบได้ตามปกติ รอดำเนินการ บัญชีถูกสร้างแล้วแต่ยังเข้าระบบไม่ได้ เช่น รอยืนยันตำแหน่งหรือรอเริ่มงาน ปิดการใช้งาน ย้ายหรือลาออก เปลี่ยนสถานะแล้วกด บันทึก หรือกด อนุมัติเปิดใช้งาน ในแถวที่รอดำเนินการ ใช้ปุ่มกรองเหนือตารางเพื่อดูเฉพาะสถานะที่ต้องการ ป้าย รออนุมัติ มุมขวาบนบอกจำนวนบัญชีที่รอดำเนินการ
- ปรับสิทธิ์: เปลี่ยนบทบาท หน่วยงาน หรือติ๊กส่วนที่ใช้งานได้ แล้วกด บันทึก มีผลในการรีเฟรชครั้งถัดไปของผู้ใช้ (ไม่เกิน 30 วินาที)
- คำขอลืมรหัสผ่าน: เมื่อผู้ใช้กด ลืมรหัสผ่าน จะมีป้ายแจ้งที่มุมขวาบนและกล่องคำขอในแท็บ 4 ยืนยันตัวตนกับเจ้าของบัญชีก่อน (โทรหรือพบตัว) แล้วกด อนุมัติ รีเซ็ตเป็น 1234 หรือ ปฏิเสธ ผู้ใช้ถูกออกจากระบบทุกเครื่องและต้องตั้งรหัสใหม่เมื่อเข้าครั้งถัดไป ผู้ดูแลกด รีเซ็ตเป็น 1234 ในแถวผู้ใช้ได้โดยตรงเช่นกัน
- บัญชีถูกล็อก: เกิดเมื่อใส่รหัสผิด 5 ครั้ง ล็อก 15 นาที หรือกด ปลดล็อก ได้ทันที
- บุคลากรย้ายหรือลาออก: เปลี่ยนสถานะเป็น ปิดการใช้งาน แล้วกดบันทึก ผู้ใช้ถูกออกจากระบบทันที ระบบไม่ลบบัญชี เพื่อให้ประวัติการแก้ไขยังอ้างถึงชื่อเดิมได้
การเก็บรหัสผ่าน
- รหัสผ่านไม่ถูกเก็บเป็นข้อความ ระบบเก็บค่าแฮช PBKDF2-HMAC-SHA256 (2,000 รอบ) กับ salt สุ่มรายคน ในคอลัมน์
password_hashและpassword_saltผู้ดูแลระบบก็อ่านรหัสผ่านไม่ได้ - การเข้าสู่ระบบสร้าง token สุ่ม เก็บในชีต Sessions เป็นค่าแฮช SHA-256 หมดอายุใน 12 ชั่วโมง ออกจากระบบ รีเซ็ตรหัส หรือปิดบัญชี จะยกเลิก token ทันที
- จำกัดสิทธิ์การเปิดไฟล์ Google Sheet ไว้เฉพาะผู้ดูแลระบบ เพราะมีค่าแฮชรหัสผ่านและข้อมูลทั้งหมด
- ทุกการเข้าสู่ระบบ ทั้งสำเร็จและไม่สำเร็จ และทุกการแก้ไข บันทึกในชีต AuditLog
10. โครงสร้างตารางข้อมูลใน Google Sheets
| ชีต | คอลัมน์ | เก็บอะไร |
|---|---|---|
| Users | username, email, name, role, dept, modules_json, active, password_hash, password_salt, must_change_password, failed_attempts, locked_until, last_login, created_at, updated_at, reset_requested_at | บัญชีผู้ใช้ สถานะในคอลัมน์ active (true เปิดใช้งาน, pending รอดำเนินการ, false ปิดการใช้งาน) บทบาท (exec, manager, staff, admin, viewer) หน่วยงาน สิทธิ์รายส่วน ค่าแฮชรหัสผ่าน สถานะการล็อก และเวลาที่ขอรีเซ็ตรหัสผ่าน |
| Sessions | token_hash, username, created_at, expires_at, user_agent | การเข้าสู่ระบบที่ยังใช้งานอยู่ (ชีตถูกซ่อน) |
| OKRs | id, level, parent_id, dept, cycle, title, owner, approach, status, example, created_by, created_at, updated_at | ทิศทางกลยุทธ์และ Objective ทุกระดับ parent_id ใช้เชื่อมลำดับชั้น |
| KeyResults | id, okr_id, seq, text, start, target, current, unit, dir, owner | KR ของแต่ละ OKR dir = up/down |
| Actions | id, okr_id, seq, text, due, done | แผนปฏิบัติการ |
| History | id, okr_id, at, by, note | ประวัติการปรับเปลี่ยนและการอนุมัติ |
| CheckIns | id, okr_id, type, text, confidence, deltas_json, files_json, author, author_role, created_at | บันทึก 1 ต่อ 1, ประชุมกลุ่ม, รายงานผู้บริหาร |
| CFR | id, kind, to, okr_id, text, parent, author, author_role, created_at | โพสต์และการตอบกลับบนกระดาน CFR |
| Files | id, drive_file_id, name, mime, size, okr_id, checkin_id, uploaded_by, uploaded_at | ทะเบียนไฟล์แนบที่อยู่ใน Google Drive |
| AuditLog | at, username, action, target_id, detail | บันทึกการเปลี่ยนแปลงทุกครั้ง ใช้ตรวจสอบย้อนหลัง |
11. สำรองข้อมูล ขีดจำกัด และการแก้ปัญหา
สำรองข้อมูล
- Google Sheets เก็บประวัติเวอร์ชันอัตโนมัติ (ไฟล์ > ประวัติเวอร์ชัน) กู้คืนได้ทั้งไฟล์
- แนะนำให้ทำสำเนาทุกสิ้นไตรมาส: ไฟล์ > ทำสำเนา ตั้งชื่อเช่น OKR Hospital Q1-2570 backup
- ชีต AuditLog เก็บว่าใครแก้ไขอะไรเมื่อไร
ขีดจำกัดที่ควรรู้
- Google Sheets รองรับ 10 ล้านเซลล์ต่อไฟล์ เพียงพอสำหรับโรงพยาบาลชุมชนหลายปี
- Apps Script ตอบสนองประมาณ 1–3 วินาทีต่อคำขอ และรันพร้อมกันได้ราว 30 คำขอ เหมาะกับผู้ใช้หลักร้อยคน
- Cloudflare Pages Functions แพ็กเกจฟรีรองรับ 100,000 คำขอต่อวัน
แก้ปัญหา
| อาการ | สาเหตุและวิธีแก้ |
|---|---|
| ขึ้น "โหมดสาธิตในเครื่อง" | ไม่พบ /api ตรวจว่า deploy ด้วย npm run deploy หรือ GitHub ที่มีโฟลเดอร์ functions |
| "รหัสเชื่อมต่อ (secret) ไม่ถูกต้อง" | ค่า GAS_SECRET ใน Cloudflare ไม่ตรงกับ API_SECRET ใน Apps Script ตั้งใหม่แล้ว deploy อีกครั้ง |
| "กรุณาเข้าสู่ระบบผ่าน Cloudflare Access อีกครั้ง" | ตรวจ CF_ACCESS_TEAM, CF_ACCESS_AUD และว่าโดเมนที่เปิดอยู่ใน Public hostname ของแอป Access |
| "Google Apps Script ตอบกลับผิดรูปแบบ" | GAS_URL ผิด หรือเว็บแอปไม่ได้ตั้ง "ผู้ที่มีสิทธิ์เข้าถึง: ทุกคน" หรือยังไม่ได้ deploy เวอร์ชันใหม่หลังแก้โค้ด |
| "ไม่พบชีต … กรุณาเรียกใช้ฟังก์ชัน setup" | ชีตถูกลบหรือเปลี่ยนชื่อ เรียก setup อีกครั้ง |
| ผู้ดูแลระบบลืมรหัสผ่านหรือถูกล็อก | ผู้ดูแลคนอื่นรีเซ็ตให้ได้ ถ้าไม่มี ให้แก้ฟังก์ชัน createAdmin ใน Apps Script ใส่รหัสใหม่แล้วเรียกใช้ จากนั้นลบรหัสออกจากโค้ด |
| "บัญชีของคุณไม่มีสิทธิ์ใช้งานส่วนนี้" | ส่วนนั้นถูกปิดให้ผู้ใช้คนนี้ ตรวจช่องติ๊กในตารางผู้ใช้ หรือคอลัมน์ modules_json |
| ผู้ใช้เข้าได้แต่ทำอะไรไม่ได้ | บทบาทเป็น viewer หรือบัญชีถูกปิด ตรวจในชีต Users |