# LINE Bot 開發 (搭配 Google Apps Script)
## 案例 1:回聲測試 (Echo Test)
**目標:** 開發一個 LINE Bot,使用 Google Apps Script (GAS) 作為後端,並透過 clasp 進行佈署。
**需求:**
1. **回聲功能**:使用者傳送什麼訊息,Bot 就回覆相同的內容。
2. **Channel Access Token (Long-lived)**:
```text
你的專屬Token
```
**交付項目:**
* 完整的 GAS 程式碼。
* clasp 佈署指令/說明。
---
## 案例 2:連動 Google Sheet (業務邏輯)
**目標:** 修改現有程式碼,加入與 Google 試算表的連動與特定業務邏輯。
**環境設定:**
* 建立一個 Google Sheet 並連動至 GAS。
* **分頁 A `Dashboard**`:
* `B1` 儲存格:OTD 數值。
* `C1` 儲存格:停機時間數值。
* **分頁 B `Records**`:
* 用途:存檔/紀錄 log。
**實作邏輯:**
1. **查詢功能 (Dashboard)**
* **觸發條件**:`userMessage` 包含關鍵字 **『戰情』** 或 **『數據』**。
* **動作**:讀取 `Dashboard` 分頁的 `B1` 與 `C1`。
* **回覆**:「報告主管,今日 OTD 為 `[B1數值]`,累積停機 `[C1數值]`」。
2. **紀錄功能 (Logging)**
* **觸發條件**:`userMessage` 以 **『回報』** 開頭(範例:`'回報 3號機異常'`)。
* **動作**:將 `[現在時間, 訊息內容]` 寫入 `Records` 分頁的新的一行 (`appendRow`)。
* **回覆**:「✅ 已紀錄異常事項」。
3. **其他**
* 維持原樣回覆 (Echo) 或不處理。
---
## 案例 3:連動多模態模型 (Multimodal AI)
**目標:** 整合圖像辨識功能,讓 Bot 能看懂使用者上傳的圖片。
**環境設定:**
* **API Provider**:Groq
* **Model**:`meta-llama/llama-4-scout-17b-16e-instruct`
* **API Key**:
```text
你的專屬API Key
```
**實作邏輯:**
* 當使用者上傳圖片時。
* 呼叫 API 進行圖片辨識。
* 回傳模型從圖片中看到的事物描述。
---
## 案例 4:導引式對話服務 (員工請假引導)
**目標:** 開發一個 LINE Webhook 應用程式,引導員工完成請假流程。
**環境設定:**
1. 綁定 Google Sheet 目標工作表名稱:`LeaveRecords`。
2. **Channel Access Token**:
```text
你的專屬Token
```
**互動流程邏輯 (State Flow):**
1. **觸發請假**
* **User**:傳送文字 **"我要請假"**。
* **Bot**:回覆 LINE Flex Message (或 Template Message)。
* 包含 **"Date Picker Action"** (選取日期)。
* Payload 設定:`action=select_date`。
2. **選取日期 (Postback Event)**
* **User**:選取日期。
* **Bot**:
* 抓取日期參數 `event.postback.params.date`。
* 暫存日期 (或直接帶入下一步)。
* 回覆 **"Quick Reply" (快速回覆)** 選單。
* 選項:`[事假, 病假, 特休, 公假]`。
* Postback Data 格式:`action=select_type&date={剛選的日期}&type={假別}`。
3. **點選假別 (Postback Event)**
* **User**:點選假別。
* **Bot**:
* 解析 Postback data 取得 `date` 和 `type`。
* 呼叫 **LINE Profile API** 取得使用者 `displayName`。
* 寫入 Google Sheet `LeaveRecords`:`[時間, userId, displayName, date, type, '待審核']`。
* 回覆:「申請已送出!日期:`{date}`,假別:`{type}`」。
**程式碼要求:**
* 包含簡單的錯誤處理。
* 提供 clasp 佈署方式。
---
## 案例 5:美化 UI (Flex Message 設計)
**目標:** 優化請假確認介面。
**需求:**
* 設計一個 **Flex Message**。
* **樣式**:類似「機票登機證」。
* **顯示資訊**:請假日期、假別。
* **互動按鈕**:
1. 『確認送出』 (觸發 Postback)
2. 『取消』 (觸發 Postback)
---
## 案例 6:使用官方 JSON 樣板
**目標:** 使用指定的 JSON 結構封裝成函式,並動態替換內容。
**輸入樣板 (Reference JSON):**
*(來源:[https://developers.line.biz/flex-simulator/](https://developers.line.biz/flex-simulator/))*
```json
{
"type": "bubble",
"hero": {
"type": "image",
"url": "https://developers-resource.landpress.line.me/fx/img/01_3_movie.png",
"size": "full",
"aspectRatio": "20:13",
"aspectMode": "cover",
"action": {
"type": "uri",
"uri": "https://line.me/"
}
},
"body": {
"type": "box",
"layout": "vertical",
"spacing": "md",
"contents": [
{
"type": "text",
"text": "BROWN'S ADVENTURE\nIN MOVIE",
"wrap": true,
"weight": "bold",
"gravity": "center",
"size": "xl"
},
{
"type": "box",
"layout": "baseline",
"margin": "md",
"contents": [
{ "type": "icon", "size": "sm", "url": "https://developers-resource.landpress.line.me/fx/img/review_gold_star_28.png" },
{ "type": "icon", "size": "sm", "url": "https://developers-resource.landpress.line.me/fx/img/review_gold_star_28.png" },
{ "type": "icon", "size": "sm", "url": "https://developers-resource.landpress.line.me/fx/img/review_gold_star_28.png" },
{ "type": "icon", "size": "sm", "url": "https://developers-resource.landpress.line.me/fx/img/review_gold_star_28.png" },
{ "type": "icon", "size": "sm", "url": "https://developers-resource.landpress.line.me/fx/img/review_gray_star_28.png" },
{ "type": "text", "text": "4.0", "size": "sm", "color": "#999999", "margin": "md", "flex": 0 }
]
},
{
"type": "box",
"layout": "vertical",
"margin": "lg",
"spacing": "sm",
"contents": [
{
"type": "box",
"layout": "baseline",
"spacing": "sm",
"contents": [
{ "type": "text", "text": "Date", "color": "#aaaaaa", "size": "sm", "flex": 1 },
{ "type": "text", "text": "Monday 25, 9:00PM", "wrap": true, "size": "sm", "color": "#666666", "flex": 4 }
]
},
{
"type": "box",
"layout": "baseline",
"spacing": "sm",
"contents": [
{ "type": "text", "text": "Place", "color": "#aaaaaa", "size": "sm", "flex": 1 },
{ "type": "text", "text": "7 Floor, No.3", "wrap": true, "color": "#666666", "size": "sm", "flex": 4 }
]
},
{
"type": "box",
"layout": "baseline",
"spacing": "sm",
"contents": [
{ "type": "text", "text": "Seats", "color": "#aaaaaa", "size": "sm", "flex": 1 },
{ "type": "text", "text": "C Row, 18 Seat", "wrap": true, "color": "#666666", "size": "sm", "flex": 4 }
]
}
]
},
{
"type": "box",
"layout": "vertical",
"margin": "xxl",
"contents": [
{
"type": "image",
"url": "https://developers-resource.landpress.line.me/fx/img/linecorp_code_withborder.png",
"aspectMode": "cover",
"size": "xl",
"margin": "md"
},
{
"type": "text",
"text": "You can enter the theater by using this code instead of a ticket",
"color": "#aaaaaa",
"wrap": true,
"margin": "xxl",
"size": "xs"
}
]
}
]
}
}
```
**需求:**
1. **封裝**:將上述 JSON 封裝成一個 GAS 函式:`sendLeaveTicket(userId, date, type)`。
2. **內容替換**:
* **標題**:修改為 **『請假單』**。
* **Date 欄位**:替換為傳入參數 `date`。
* **Place 欄位**:替換為傳入參數 `userName` (注意:需自行獲取或傳入 userName,函式簽章未包含,但需求描述有提及)。
* **Seats 欄位**:替換為傳入參數 `type` (假別)。