# RMUTI MOU Executive Dashboard — 2 เมนูใน Web App เดียว

ชุดโค้ดนี้อ่านข้อมูลจาก Google Sheets โดยไม่เขียนข้อมูลกลับลงชีต และมี 2 หน้าในโปรเจกต์เดียวกัน

1. **ภาพรวมความร่วมมือ MOU** — อ่านแท็บ `ความร่วมมือ MOU ทั้งหมด`
2. **MoU ภาคอุตสาหกรรม** — อ่านแท็บ `MoU ภาคอุตสาหกรรม`

## ไฟล์ที่ต้องนำไปวางใน Google Apps Script

- `Code.gs`
- `Index.html`

## วิธีติดตั้ง

1. เปิด Google Sheets ไฟล์ต้นทาง
2. ไปที่ **Extensions > Apps Script**
3. วางเนื้อหาจาก `Code.gs` ทับไฟล์ `Code.gs` เดิม
4. กดปุ่ม **+** ข้าง Files แล้วเลือก **HTML**
5. ตั้งชื่อไฟล์ว่า `Index` (ไม่ต้องพิมพ์ `.html`)
6. วางเนื้อหาจาก `Index.html`
7. กด Save
8. จากเมนูเลือกฟังก์ชัน ให้เลือก `getAllDashboardData` แล้วกด Run 1 ครั้ง เพื่ออนุญาตสิทธิ์เข้าถึง Google Sheets
9. ไปที่ **Deploy > New deployment > Web app**
10. เลือกสิทธิ์การเปิดใช้งานตามนโยบายของหน่วยงาน แล้วกด Deploy

> ถ้าสร้าง Apps Script ผ่าน Google Sheets ไฟล์นี้โดยตรง ให้คงค่า `SPREADSHEET_ID: ''` ใน `Code.gs` ไว้ตามเดิม

> **อัปเดตโค้ดทีหลัง:** หลังแก้ `Code.gs`/`Index.html` แล้วกด Save — ถ้าเปิดผ่านลิงก์ Web App (`.../exec`) ต้องไปที่ **Deploy > Manage deployments** กดดินสอแก้ แล้วเลือก **Version: New version** > Deploy เพื่อให้ลิงก์เดิมใช้โค้ดใหม่ (หรือทดสอบผ่านลิงก์ **Test deployments** `.../dev` ที่ใช้โค้ดล่าสุดเสมอ)

## เมนูที่เพิ่ม

### ภาพรวมความร่วมมือ MOU
- KPI: จำนวน MOU, สถานะ, DOM/INT, ผลการดำเนินงาน, กิจกรรมรวม และ MOU ใกล้หมดอายุ
- กราฟ: สถานะ, DOM/INT, ปีงบประมาณ, ผลการดำเนินงาน, Cluster, จำนวนกิจกรรม
- ตารางติดตาม MOU ที่หมดอายุ ยกเลิก ใกล้หมดอายุ หรือไม่ระบุวันสิ้นสุด

### MoU ภาคอุตสาหกรรม
- KPI: รายการทั้งหมด, มีผลบังคับใช้, หมดอายุ, ยกเลิก, ภาคเอกชน/อุตสาหกรรม, ระดับมหาวิทยาลัย, คู่ความร่วมมือไม่ซ้ำ และไม่ระบุรูปแบบเครือข่าย
- กราฟ: สถานะ, ประเภทหน่วยงาน, ระดับความร่วมมือ และรูปแบบเครือข่าย
- ตารางรายละเอียดพร้อมค้นหาและกรองตามสถานะ ระดับความร่วมมือ ประเภทหน่วยงาน และรูปแบบเครือข่าย

## ข้อมูลที่ตรวจจากไฟล์ Excel ล่าสุด

แท็บ `MoU ภาคอุตสาหกรรม` มี 207 รายการ โดย Dashboard จะคำนวณใหม่ทุกครั้งจาก Google Sheets

- มีผลบังคับใช้ 150 รายการ
- หมดอายุ 55 รายการ
- ยกเลิก 2 รายการ
- ภาคเอกชน / บริษัท / อุตสาหกรรม 92 รายการ
- ระดับมหาวิทยาลัย 165 รายการ
- ไม่ระบุรูปแบบเครือข่าย 41 รายการ

## จุดที่แก้ไขได้ใน Code.gs

```javascript
MOU_SHEET_NAME: 'ความร่วมมือ MOU ทั้งหมด',
INDUSTRY_SHEET_NAME: 'MoU ภาคอุตสาหกรรม',
DASHBOARD_TITLE: 'Dashboard สรุปความร่วมมือ MOU',
DASHBOARD_SUBTITLE: 'มหาวิทยาลัยเทคโนโลยีราชมงคลอีสาน',
NEAR_EXPIRY_DAYS: 180,
```

## แก้ปัญหาที่พบบ่อย

**ขึ้น “ไม่พบชีต …”** — เกิดจากชื่อแท็บใน Google Sheets ไม่ตรงกับ `CONFIG`
- โค้ดเวอร์ชันนี้มี `getSheetByFlexibleName_()` ที่ค้นหาแท็บแบบ **ยืดหยุ่น** อยู่แล้ว (ตัดช่องว่าง/อักขระล่องหน และไม่สนตัวพิมพ์เล็ก-ใหญ่) จึงทนต่อชื่อที่ต่างเล็กน้อย
- ถ้ายังไม่พบ ข้อความ error จะ **บอกชื่อแท็บจริงที่มีในไฟล์** ในวงเล็บต่อท้าย — อ่านแล้วแก้ `CONFIG` ให้ตรง
- ตรวจชื่อแท็บจริงได้ด้วยฟังก์ชันนี้ (วางใน `Code.gs` แล้วกด Run → ดู View ▸ Logs):

```javascript
function debugSheets() {
  var ss = getSpreadsheet_();
  Logger.log('ไฟล์: ' + ss.getName());
  Logger.log('URL : ' + ss.getUrl());
  ss.getSheets().forEach(function(s){ Logger.log('[' + s.getName() + ']'); });
}
```
- ถ้า URL ที่ log ออกมา **ไม่ใช่ไฟล์ที่มีแท็บนั้น** แปลว่า Script ผูกกับ Sheets คนละไฟล์ → ใส่ `SPREADSHEET_ID` ของไฟล์ที่ถูกต้องใน `CONFIG`
- ถ้าแก้แล้วยังเหมือนเดิม มักเป็นเพราะ Web App ยังเสิร์ฟโค้ดเก่า → **Deploy เวอร์ชันใหม่** (ดูหัวข้อด้านบน)

## หมายเหตุ

- ชื่อแท็บควรตรงกับใน Google Sheets: `ความร่วมมือ MOU ทั้งหมด` และ `MoU ภาคอุตสาหกรรม` (ต่างเล็กน้อยระบบจับให้อัตโนมัติ)
- Dashboard นี้อ่านข้อมูลอย่างเดียว ไม่มีคำสั่งแก้ไขข้อมูลต้นทาง
- หากแก้ชื่อแท็บ ให้แก้ที่ `CONFIG` ใน `Code.gs` ก่อน Deploy ใหม่
