# 使用 Google Apps Script (GAS) 串接 LINE Messaging API 教學
## 前言
本教學將引導你如何使用 Google Apps Script (GAS) 來串接 LINE Messaging API,實現透過 GAS 發送 LINE 訊息的功能。GAS 是一個無伺服器平台,可讓您用 JavaScript 輕鬆擴展 Google Workspace 的功能,非常適合用來做為發送 LINE Notify 或聊天機器人的後端。
## 先備條件
在開始之前,請確保您已具備以下條件:
1. **一個 Google 帳號**:用於存取 Google Apps Script。
2. **一個 LINE 帳號**:用於建立 LINE Developer 帳號及 LINE Bot。
3. **一個 LINE Developer 帳號**:如果沒有,請至 [LINE Developers Console](https://developers.line.biz/console/) 註冊。
---
## 步驟一:取得 LINE Channel Access Token
Channel Access Token 是你的應用程式(GAS)與 LINE API 溝通的鑰匙。
1. **登入 LINE Developers Console**
前往 [LINE Developers Console](https://developers.line.biz/console/) 並登入你的帳號。
2. **建立一個 Provider**
如果你還沒有 Provider,請點擊 `Create a new provider` 並輸入一個你喜歡的名稱。
3. **建立一個 Channel**
- 在你的 Provider 之下,點選 `Create a new channel`。
- 選擇 `Messaging API`。
- 填寫所有必填欄位,例如:
- `Channel type`: Messaging API
- `Provider`: 選擇你剛建立的 Provider
- `Company or owner's country/region`: 你的國家/地區
- `Channel name`: 你的機器人名稱 (例如:GAS Bot)
- `Channel description`: 你的機器人描述
- `Category`: 選擇適合的類別
- `Subcategory`: 選擇適合的子類別
- 同意 LINE 的服務條款。
- 按下 `Create` 完成建立。
4. **取得 Channel Access Token (long-lived)**
- 進入你剛剛建立的 Channel。
- 切換到 `Messaging API` 分頁。
- 捲動到頁面底部,你會看到 `Channel access token` 區塊。
- 點擊 `Issue` 按鈕來產生一個長期的 Access Token。
- **請妥善保管這個 Token,稍後我們會在 GAS 中使用它。**
5. **讓使用者加入你的 LINE Bot**
- 在 `Messaging API` 分頁頂部,您會看到一個 QR Code。
- 使用您的 LINE App 掃描此 QR Code,並將此 LINE Bot 加入好友。這樣你的 Bot 才能發送訊息給你。
---
## 步驟二:設定 Google Apps Script 專案
1. **建立一個新的 GAS 專案**
- 前往 [Google Apps Script](https://script.google.com/)。
- 點擊左上角的 `+ 新專案`。
2. **命名你的專案**
- 點擊左上角的「未命名專案」,並將其命名為有意義的名稱,例如 `LINE Message Sender`。
---
## 步驟三:撰寫 GAS 程式碼
將以下程式碼複製並貼到 `程式碼.gs` 檔案中。
```javascript
// +-----------------------------------------------------------------+
// | **** 請將這裡的 TOKEN 換成你自己的 **** |
// +-----------------------------------------------------------------+
const CHANNEL_ACCESS_TOKEN = 'YOUR_CHANNEL_ACCESS_TOKEN';
// +-----------------------------------------------------------------+
// | **** 請將這裡的 USER_ID 換成你自己的 **** |
// +-----------------------------------------------------------------+
// 你的 LINE User ID,可以透過 Webhook 事件取得,
// 或讓 Bot 加入群組後,從群組事件中取得。
// 簡單的測試方法是,先設定好 Webhook,然後傳訊息給 Bot,
// 再從堆疊紀錄 (Stackdriver) 中找到你的 User ID。
const TO_USER_ID = 'YOUR_LINE_USER_ID';
/**
* 主要的進入點函式,用於發送訊息
*/
function sendMessage() {
const message = '這是一則來自 GAS 的測試訊息!';
pushMessage(TO_USER_ID, message);
}
/**
* 發送 LINE Push Message
* @param {string} userId - 要接收訊息的使用者 ID
* @param {string} text - 要發送的文字訊息
*/
function pushMessage(userId, text) {
const url = 'https://api.line.me/v2/bot/message/push';
const payload = {
'to': userId,
'messages': [
{
'type': 'text',
'text': text,
}
]
};
const options = {
'headers': {
'Content-Type': 'application/json',
'Authorization': 'Bearer ' + CHANNEL_ACCESS_TOKEN,
},
'method': 'post',
'payload': JSON.stringify(payload)
};
try {
const response = UrlFetchApp.fetch(url, options);
Logger.log(response.getContentText());
} catch (e) {
Logger.log('Error: ' + e.message);
}
}
/**
* 回應 Webhook 事件 (用於聊天機器人)
* 當 LINE 使用者傳送訊息給 Bot 時,LINE 平台會將事件發送到您設定的 Webhook URL。
* doPost 函式會接收這個請求。
*/
function doPost(e) {
// 解析從 LINE 平台傳來的事件
const event = JSON.parse(e.postData.contents).events[0];
// 確認是訊息事件
if (event.type === 'message') {
const replyToken = event.replyToken;
const userMessage = event.message.text;
const userId = event.source.userId; // 取得傳送訊息的使用者 ID
// 簡單的回應邏輯:回傳使用者傳送的訊息
const replyText = `你說了:「${userMessage}」。\n你的 User ID 是:${userId}`;
replyMessage(replyToken, replyText);
}
return ContentService.createTextOutput(JSON.stringify({'status': 'success'})).setMimeType(ContentService.MimeType.JSON);
}
/**
* 回覆 LINE Reply Message
* @param {string} replyToken - 用於回覆訊息的 Token
* @param {string} text - 要回覆的文字訊息
*/
function replyMessage(replyToken, text) {
const url = 'https://api.line.me/v2/bot/message/reply';
const payload = {
'replyToken': replyToken,
'messages': [
{
'type': 'text',
'text': text,
}
]
};
const options = {
'headers': {
'Content-Type': 'application/json',
'Authorization': 'Bearer ' + CHANNEL_ACCESS_TOKEN,
},
'method': 'post',
'payload': JSON.stringify(payload)
};
try {
UrlFetchApp.fetch(url, options);
} catch (e) {
Logger.log('Error: ' + e.message);
}
}
```
**重要:**
1. 將 `YOUR_CHANNEL_ACCESS_TOKEN` 替換成您在 **步驟一** 中取得的 Channel Access Token。
2. 將 `YOUR_LINE_USER_ID` 替換成你自己的 LINE User ID。
- **如何取得你的 User ID?**
- 最簡單的方法是先設定好 Webhook (見下方步驟),然後傳送任何訊息給你的 Bot。
- 接著在 GAS 編輯器中,點擊 `執行紀錄`,你會看到類似 `你說了:「...」。你的 User ID 是:Uxxxxxxxxxxxx` 的日誌,`U` 開頭的那串就是你的 User ID。
---
## 步驟四:部署 GAS 專案並測試
### 方法一:手動執行 (Push Message)
此方法用於主動發送訊息給指定使用者。
1. **儲存專案**
點擊上方的磁碟圖示儲存你的程式碼。
2. **選擇要執行的函式**
在函式選單中,選擇 `sendMessage`。
3. **執行函式**
點擊 `▶ 執行` 按鈕。
4. **授權**
- 第一次執行時,GAS 會要求您授權。
- 點擊 `審查權限` -> 選擇你的 Google 帳號。
- 點擊 `進階` -> `前往「(專案名稱)」(不安全)`。
- 點擊 `允許`。
5. **檢查結果**
- 執行完畢後,你的 LINE 應該會收到一則來自 Bot 的訊息。
- 你也可以在 GAS 編輯器下方的 `執行紀錄` 中看到 API 的回應。
### 方法二:部署為 Web App (Reply Message / Webhook)
此方法是將你的 GAS 腳本變成一個公開的 Web API,讓 LINE 平台可以呼叫它,以實現聊天機器人自動回應的功能。
1. **部署專案**
- 點擊右上角的 `部署` -> `新增部署作業`。
- 在「選取類型」旁邊,點擊齒輪圖示,選擇 `網頁應用程式`。
2. **設定網頁應用程式**
- `說明`:(選填) 輸入部署的描述,例如 `v1`。
- `執行身分`:選擇 `我`。
- `誰可以存取`:選擇 `任何人`。 **(這非常重要,因為 LINE 的伺服器需要公開存取此 URL)**
- 點擊 `部署`。
3. **取得 Web App URL**
- 部署成功後,你會得到一個**網頁應用程式的網址**。請複製此網址。
4. **設定 LINE Bot 的 Webhook**
- 回到你的 [LINE Developers Console](https://developers.line.biz/console/)。
- 進入你的 Channel,切換到 `Messaging API` 分頁。
- 找到 `Webhook settings` 區塊。
- 將剛剛複製的 GAS Web App URL 貼到 `Webhook URL` 欄位中。
- 點擊 `Update` -> `Verify` 來驗證 URL 是否有效。
- **啟用 Webhook**:將 `Use webhook` 這個開關打開。
- (可選) 停用自動回應:在 `Greeting messages` 和 `Auto-reply messages` 點擊 `Edit`,並將其 `Status` 設定為 `Disabled`,這樣 Bot 才不會在你設定的 `doPost` 之外自動回覆預設訊息。
5. **測試 Webhook**
- 打開你的 LINE App,對你的 Bot 發送任何訊息。
- 如果設定正確,Bot 應該會立刻回覆 `你說了:「(你傳的訊息)」。你的 User ID 是:(您的ID)`。
---
## 範例:發送不同類型的訊息
你可以修改 `pushMessage` 或 `replyMessage` 函式中的 `messages` 陣列來發送不同類型的訊息。
### 發送圖片訊息
```javascript
function sendImageMessage(userId) {
const url = 'https://api.line.me/v2/bot/message/push';
const payload = {
'to': userId,
'messages': [
{
'type': 'image',
'originalContentUrl': 'https://www.example.com/image.jpg', // 必須是 HTTPS
'previewImageUrl': 'https://www.example.com/preview.jpg' // 必須是 HTTPS
}
]
};
// ... 後續的 options 和 UrlFetchApp.fetch() 同上 ...
}
```
### 發送貼圖訊息
```javascript
function sendStickerMessage(userId) {
const url = 'https://api.line.me/v2/bot/message/push';
const payload = {
'to': userId,
'messages': [
{
'type': 'sticker',
'packageId': '446', // 貼圖包 ID
'stickerId': '1988' // 貼圖 ID
}
]
};
// ... 後續的 options 和 UrlFetchApp.fetch() 同上 ...
}
```
> **提示**:可用的貼圖列表請參考 [LINE Sticker List](https://developers.line.biz/en/docs/messaging-api/sticker-list/)。
---
## 結論
透過本教學,你已經學會如何設定一個 GAS 專案來發送 LINE 訊息,並將其部署為一個可以回應使用者訊息的聊天機器人。GAS 的方便之處在於它不需要你管理伺服器,且能與 Google 生態系統(如 Google Sheets, Docs)完美整合,為你的 LINE Bot 創造更多可能性。
若要探索更多功能,建議詳閱 [LINE Messaging API 官方文件](https://developers.line.biz/en/docs/messaging-api/overview/)。