คู่มืออ้างอิงและเอกสารระบบ (README)

ระบบติดตามงานวิจัยหน่วยโรคผิวหนัง รามาธิบดี (Research Rama Tracker v2.38)

Version 2.38

1. System Overview (ภาพรวมของระบบ)

Web Application Research Rama Tracker พัฒนาขึ้นเพื่อเพิ่มประสิทธิภาพในการบริหารจัดการโครงร่างงานวิจัยและติดตามความก้าวหน้า (Progress Tracking) ของบุคลากรภายในหน่วยโรคผิวหนัง คณะแพทยศาสตร์โรงพยาบาลรามาธิบดี

ประโยชน์และฟังก์ชันเด่นของระบบ:

  • Real-time Tracking: ติดตามสเตตัสงานวิจัยได้อย่างละเอียดถึง 19 ขั้นตอนย่อย ตั้งแต่การยกร่าง Protocol ไปจนถึงขั้น Manuscriptได้รับการตอบรับ (Accept)
  • Real-time Dashboard Filter: ระบบแสดงภาพรวมที่มาพร้อมกับฟิลเตอร์คัดกรองข้อมูลตามรายชื่อผู้วิจัยหลัก (MR) และอาจารย์ที่ปรึกษา (MS) แบบทันทีโดยไม่ต้องโหลดหน้าเว็บใหม่
  • Role-Based Access Control (RBAC): แยกระดับสิทธิ์และหน้าที่ชัดเจนระหว่าง ผู้วิจัยหลัก (Main Research), อาจารย์ที่ปรึกษาหลัก (Main Staff) และผู้ร่วมวิจัย (Other)
  • LINE Login Integration (LIFF): เสริมความปลอดภัยขั้นสูงสำหรับกลุ่มอาจารย์แพทย์ ป้องกันการเข้าถึงข้อมูลและการอนุมัติโดยไม่ได้รับอนุญาต
  • Automated Cloud Storage: ระบบแปลงเอกสาร PDF เป็น Base64 อัปโหลดขึ้น Google Drive ของหน่วยงานโดยอัตโนมัติ และบันทึก URL ลิงก์กลับลงฐานข้อมูลอย่างเป็นระบบ

2. Architecture & Data Flow (สถาปัตยกรรมและการไหลของข้อมูล)

ระบบถูกออกแบบบนโครงสร้างแบบ Serverless Architecture โดยทำงานร่วมกันระหว่าง 3 ส่วนหลัก ดังนี้:

Frontend

HTML5, CSS3 (Bootstrap 5), JavaScript (LIFF SDK, SweetAlert2)

Backend (API)

Google Apps Script (code.gs) ประมวลผลผ่านฟังก์ชัน doGet และ doPost

Database & Storage

Google Sheets (ชีต staff และ research69) และ Google Drive Folder

แผนผังการไหลของข้อมูล (Data Flow) ในการอัปเดตข้อมูลและไฟล์:
  1. ผู้ใช้แนบไฟล์ PDF และกรอกข้อมูลบนฟอร์มหน้าเว็บ (Frontend)
  2. JavaScript แปลงไฟล์เป็น Base64 DataURL และจัดโครงสร้างในรูปแบบ JSON Payload
  3. ส่งข้อมูลผ่าน HTTP POST Request ไปยังตัวประมวลผลของ Google Apps Script (Backend)
  4. สคริปต์เซิร์ฟเวอร์ถอดรหัส Base64 สั่งสร้างไฟล์ PDF บน Google Drive ปรับสิทธิ์เป็น "ทุกคนที่มีลิงก์สามารถดูได้" และส่งค่า URL กลับมา
  5. สคริปต์เขียนข้อมูลข้อความ พร้อมลิงก์ URL ลงในแถวข้อมูลของชีต research69 ตามดัชนี rowIndex ที่ถูกต้อง

3. Core Logic & Functions (ลอจิกหลักของโค้ด)

สคริปต์ฝั่งฝั่งเซิร์ฟเวอร์ (code.gs)
ชื่อฟังก์ชัน ลอจิกและการทำงานภายใน
doGet(e) เราเตอร์ฝั่งรับข้อมูลเข้าผ่าน URL พารามิเตอร์ คัดกรอง Action หากเป็น getInitialData จะสั่งรันระบบล็อกอินและดึงงานวิจัยเฉพาะของผู้ใช้ หากเป็น getAllResearch จะส่งคืนข้อมูลงานวิจัยทั้งหมดไปประมวลผลหน้าแดชบอร์ด
getInitialData() ตรวจสอบรหัส Rama ID หากผู้ใช้เป็นกลุ่ม "อาจารย์" จะตรวจเช็ค line_uid เพื่อทำระบบ LINE Login สำหรับยืนยันตัวตน และคัดกรองส่งงานวิจัยคืนไปเฉพาะชิ้นที่ผู้ใช้มีส่วนเกี่ยวข้อง (เป็น MR, MS, OR, OS)
saveResearchData() ตรวจสอบ JSON Payload ที่ส่งมาจากหน้าบ้าน ตรวจเช็คก้อน Base64 ของไฟล์ในแต่ละขั้นตอน หากพบข้อมูลจะสั่งอัปโหลดไฟล์ผ่าน uploadPDF() ก่อนจะนำอาร์เรย์ผลลัพธ์แมปลงคอลัมน์ใน Google Sheets ตามชื่อหัวตาราง (Headers Matching)
uploadPDF() ตัดแยก Header ของ Base64 เพื่อหา Content-Type ถอดรหัสด้วย Utilities.base64Decode() แล้วบันทึกลงโฟลเดอร์ปลายทาง พร้อมตั้งสิทธิ์เป็นแบบ View-only (Anyone with link)
สคริปต์ฝั่งหน้าเว็บ (index.html และ dashboard.html)
  • ระบบตรวจสอบลำดับขั้นตอน (Step Unlocking): ฟังก์ชัน renderProgress() ควบคุมการปิดกั้น/เปิดปุ่มแสตมป์เวลา โดยจะเช็คค่า prevOk หากขั้นตอนก่อนหน้ายังไม่มีข้อมูลแสตมป์เวลา ปุ่มในขั้นตอนถัดไปจะถูกเซ็ตสถานะเป็น disabled และเปลี่ยนคลาสเป็น step-locked ทันที
  • สิทธิ์การแสดงผล (Permission Mapping): ระบบจะคำนวณสิทธิ์ผู้ใช้งาน หากผู้ใช้ปัจจุบันไม่ได้เป็นผู้วิจัยหลัก (isMR) และไม่ได้เป็นอาจารย์ที่ปรึกษาหลัก (isMS) ตัวแปร isViewer จะมีค่าเป็น True ส่งผลให้ซ่อนปุ่มบันทึก ปุ่มเพิ่มรายชื่อ และซ่อนอินพุตสำหรับอัปโหลดไฟล์ทันที
  • ระบบคัดกรองแดชบอร์ด (Dashboard Filtering): หน้า Dashboard จะเก็บข้อมูลงานวิจัยทั้งหมดไว้ในหน่วยความจำชั่วคราว (allResearches) เพื่อรองรับการคัดกรองข้อมูลฝั่งผู้ใช้งาน (Client-side filtering) ทำให้สามารถเลือกดูงานวิจัยตามชื่อ MR และ MS ได้ในทันทีโดยไม่ต้องดึงข้อมูลจากฐานข้อมูลใหม่

4. Prompt & Input Logic (การตรวจสอบและจัดการข้อมูลขาเข้า)

ลอจิกการเคลียร์ข้อมูลไอดี (Rama ID Normalization)

เพื่อป้องกันความผิดพลาดจากการพิมพ์ช่องว่าง หรือการพิมพ์เลขศูนย์นำหน้าไม่เท่ากัน ระบบใช้ฟังก์ชัน normalizeID(id) ในการแปลงค่าข้อมูลก่อนนำไปเปรียบเทียบในฐานข้อมูลด้วยคำสั่ง:

return id.toString().replace(/\s+/g, '').toLowerCase().replace(/^0+/, '') || "0";
ลอจิกแจ้งเตือนวันหมดอายุใบอนุมัติจริยธรรม (EC Expire Date Analytics)

ระบบคำนวณระยะต่างระหว่างวันปัจจุบันกับวันหมดอายุของ EC (EC_expire_date) และส่งคืน Tag Badge เตือนภัยบนการ์ดงานวิจัยดังนี้:

  • น้อยกว่า 0 วัน (หมดอายุแล้ว): แสดง Tag สีแดงพร้อมเอฟเฟกต์ไฟกะพริบแจ้งเตือน (Blink Alert)
  • เหลือไม่เกิน 30 วัน: แสดง Tag สีแดง แจ้งเตือนระดับวิกฤต
  • เหลือไม่เกิน 90 วัน: แสดง Tag สีเหลือง แจ้งเตือนให้เตรียมตัวต่ออายุ
  • มากกว่า 90 วัน: แสดง Tag สีเขียว สถานะปกติความปลอดภัยสูง

5. User Guide (ขั้นตอนการใช้งานสำหรับบุคลากร)

1 เข้าสู่ระบบ (Authentication)

กรอกรหัสบุคลากร (Rama ID) แล้วกดปุ่มเข้าสู่ระบบ สำหรับกลุ่มอาจารย์แพทย์หากเข้าใช้งานครั้งแรก ระบบจะแสดงป๊อปอัปแจ้งเตือนให้กดสิทธิ์ล็อกอินผ่าน LINE เพื่อทำการผูกบัญชีความปลอดภัย

2 เลือกหรือสร้างงานวิจัย

คลิกที่แถบเลือกงานวิจัย ระบบจะเรียงลำดับงานที่มีเครื่องหมายธงสีแดง 🚩 ไว้ด้านบนสุด ซึ่งหมายถึง "เป็นงานที่คุณต้องเข้าไปอัปเดตความคืบหน้าในปัจจุบัน" หรือคลิกเลือก + สร้างงานวิจัยใหม่ หากต้องการเปิดเรื่องใหม่

3 จัดการข้อมูลทีมวิจัย

กรอกชื่อเรื่อง (Title) จากนั้นสามารถกดปุ่ม + เพิ่มแพทย์ หรือ + เพิ่มอาจารย์ เพื่อเลือกรายชื่อทีมผู้ร่วมวิจัยจากหน้าต่างรายชื่อป๊อปอัปได้อย่างสะดวก

4 การแสตมป์เวลาและแนบเอกสาร

ในสเต็ปงานที่คุณมีสิทธิ์ ปุ่มกดจะเป็นคำว่า ลงเวลา หรือ 🔄 อัปเดตข้อมูล ให้ทำการแนบไฟล์ PDF ประจำขั้นตอนนั้นๆ (ถ้ามีกำหนดไว้ เช่น ขั้นตอนอนุมัติ EC หรือร่างแมนูสคริปต์) จากนั้นกดปุ่มแสตมป์ลงเวลา ระบบจะประทับเวลาปัจจุบันให้ทันที

5 บันทึกข้อมูลขึ้นระบบคลาวด์

ตรวจสอบข้อมูลให้แน่ใจแล้วกดปุ่มสีเขียว 💾 บันทึกข้อมูล ด้านล่างสุด ระบบจะซิงก์ข้อมูลอัปโหลดไฟล์ขึ้น Google Drive และบันทึกประวัติลง Google Sheets จนเสร็จสิ้น

6 การดูภาพรวมและคัดกรองข้อมูล (Dashboard & Filtering)

เมื่อเข้าสู่หน้า Dashboard คุณสามารถใช้เครื่องมือ ตัวกรอง (Filter) ด้านบนเพื่อค้นหางานวิจัยเฉพาะเจาะจงได้:

  • กรองตาม MR / MS: เลือกรายชื่อจาก Dropdown เพื่อดูเฉพาะงานวิจัยที่แพทย์หรืออาจารย์ท่านนั้นรับผิดชอบเป็นหลัก
  • ตรรกะการกรองแบบรวม (AND Logic): หากเลือกทั้ง MR และ MS พร้อมกัน ระบบจะแสดงเฉพาะงานวิจัยที่ตรงกับทั้ง 2 ชื่อเท่านั้น
  • ล้างค่า (Reset): กดปุ่ม "ล้างค่า" เพื่อกลับไปดูรายการงานวิจัยทั้งหมดดังเดิม

6. Troubleshooting & Maintenance (การแก้ไขปัญหาและการดูแลรักษา)

สาเหตุ: เกิดจากอาจารย์แพทย์ท่านนั้นๆ มีการเปลี่ยนสลับบัญชี LINE หรือเคยใช้ LINE Account อื่นล็อกอินค้างไว้ในระบบเป็นครั้งแรก
วิธีแก้ไขสำหรับผู้ดูแลระบบ (Admin): ให้เปิดไฟล์ฐานข้อมูล Google Sheets เข้าไปที่ชีตชื่อ staff ค้นหาแถวรายชื่อของอาจารย์ท่านนั้น แล้วทำการลบข้อมูลในช่องคอลัมน์ line_uid และ line_displayname ให้เป็นช่องว่างว่างๆ จากนั้นแจ้งให้อาจารย์ล็อกอินใหม่อีกครั้งเพื่อผูกไอดีใหม่

สาเหตุ: เพื่อความปลอดภัยของข้อมูล ระบบมีเงื่อนไขล็อกไม่ให้แพทย์แก้ไขเปลี่ยนตัวอาจารย์ที่ปรึกษาหลัก หากอาจารย์ที่ปรึกษาท่านนั้นๆ ได้เริ่มทำการกดอนุมัติหรือแสตมป์เวลาความก้าวหน้าในขั้นตอนฝั่งของอาจารย์ (MS Action) ไปแล้ว
วิธีแก้ไข: หากมีความจำเป็นเร่งด่วนในการเปลี่ยนย้ายตัวอาจารย์ที่ปรึกษาหลัก แอดมินผู้ดูแลระบบจะต้องเข้าไปทำการแก้ไขรหัสและชื่ออาจารย์ด้วยตนเองโดยตรงในแถวข้อมูลของชีต research69

สาเหตุ: ไฟล์เอกสาร PDF มีขนาดใหญ่เกินกว่าขีดจำกัดที่ก้อนข้อมูล String ของ Google Apps Script API จะรับได้ในหนึ่งตารางเวลา หรือโฟลเดอร์ Google Drive ปลายทางถูกจำกัดสิทธิ์เขียนไฟล์
วิธีแก้ไข: ให้ทำการบีบอัดขนาดไฟล์ PDF (Compress PDF) ให้เล็กลงก่อนทำการอัปโหลด (แนะนำไม่ควรเกิน 5-10 MB) และตรวจสอบว่าตัวแปร FOLDER_ID ในไฟล์ code.gs ยังสอดคล้องกับโฟลเดอร์คลาวด์ที่มีสิทธิ์เขียนแชร์ข้อมูลอยู่จริง
การเพิ่มรายชื่อบุคลากรใหม่เข้าระบบ (Maintenance)

ผู้ดูแลระบบไม่จำเป็นต้องเข้ามาแก้ไขโค้ดโปรแกรมแต่อย่างใด เพียงแค่เปิด Google Sheets ชีต staff แล้วทำการกรอกข้อมูลแพทย์ใหม่ลงไปในแถวถัดไป โดยระบุ ramaID, name และช่อง group ให้มีคำระบุประเภทชัดเจน (เช่นมีคำว่า "อาจารย์" หรือกลุ่ม "แพทย์ประจำบ้าน") ระบบหน้าบ้านจะทำการดึงข้อมูลไปแสดงผลในตัวเลือกและคัดแยกสิทธิ์ให้โดยอัตโนมัติในการล็อกอินครั้งถัดไป