先說結論
嗯,今天要來聊聊怎麼把 LINE Bot 跟 Google Sheet 串起來。說真的,這組合超實用,你可以把它想像成一個不用錢、又永遠不會累的助理。 客人半夜傳訊息問產品價格?Bot 自己去試算表查了就回。辦活動要統計人數?大家在群組裡喊+1,Bot 就自動寫進 Google Sheet。 整個過程可以全自動,讓你從一堆重複的雜事裡解脫出來。
老實說,串接的方法不只一種。你可以用 Google 自己家的 Apps Script (GAS) 來寫點程式碼,這是最常見也最彈性的方法,我們今天主要就聊這個。 如果你完全不想碰程式碼,也可以用 Make 或 Zapier 這種第三方工具,拉一拉積木就搞定,但功能和彈性就比較受限,而且量大的話是要錢的。 還有一種是自己架一台伺服器跑,這就比較硬核了,適合需要處理超大流量或是有特殊資安需求的公司。
所以,簡單講,如果你是個人開發者、行銷人員,或是想做個小專案,用 Google Apps Script 絕對是首選,因為它免費、功能強大,而且跟 Google 生態圈完美整合。 這篇會一步步帶你走過最關鍵的設定,特別是那些很多人會卡關的權限問題。
別人沒講清楚的,我們來聊聊
網路上教學很多,但說真的,我看大部分都只講了「怎麼讓它動起來」,卻很少提到一些很重要的「眉角」。這些細節沒搞懂,未來很可能會踩到坑,甚至造成資料外洩,這就不好玩了。
第一個就是「權限設定」。一堆教學為了方便,會教你把 Google Apps Script 的網路應用程式權限設成「任何人,甚至是匿名使用者」(Anyone, even anonymous)。 雖然這樣最快,但這也代表「任何知道你 GAS 網址的人」都能觸發你的程式。這就像你家大門鑰匙到處亂丟一樣,超危險。一個比較安全的作法是,雖然你還是得開放給匿名使用者(因為你不知道 LINE Server 的 IP),但在程式碼最前面加上一道驗證,檢查收到的請求是不是真的從 LINE 平台來的。這點超級重要,但一堆人懶得做。
再來,很多人會混淆 `SpreadsheetApp` 和 `Google Sheets API`。 在 Google Apps Script 裡面,你直接用 `SpreadsheetApp` 就能讀寫試算表,非常方便。 但如果你要處理的資料量非常大,或是需要做一些比較複雜的操作,直接去呼叫 `Google Sheets API v4` 會有效率得多。 比如說,一次要更新好幾千個儲存格,用 Sheets API 的批次更新 (batchUpdate) 會比你用 `SpreadsheetApp` 一格一格跑迴圈快上好幾倍。 大部分教學只會教你用 `SpreadsheetApp`,因為最簡單,但沒告訴你它在效能上的極限在哪。
最後是「錯誤處理」跟「日誌記錄」(Logging)。你寫的程式不可能永遠都順順跑。要是今天 LINE 的格式改了、或是 Google Sheet 被人改了欄位,你的 Bot 可能就掛了。一個健壯的程式應該要能處理這些預期外的狀況,比如用 `try...catch` 包起來,然後把錯誤訊息記錄在另一個工作表,或是發通知給你。這樣出問題你才能馬上知道,而不是等客人抱怨了才發現「啊,原來我的 Bot 罷工三天了」。
怎麼做:最常見的 Google Apps Script (GAS) 路線
好,觀念講完了,我們來實際操作一次。這裡會用最主流的 Google Apps Script (GAS) 方式,帶你建立一個可以回應訊息的 LINE Bot。
步驟一:準備你的 LINE Bot 和 Google Sheet
這部分算是前置作業。你得先去 LINE Developers 網站建立一個你的 Bot,專業術語叫作建立一個「Channel」。 建立好之後,你會拿到兩組最重要的東西:「Channel access token」和「Channel secret」。 前者是你的 Bot 的身分證,讓你可以呼叫 LINE 的 API;後者是用來驗證收到的訊息是不是真的 LINE 傳來的。先把這兩個字串存好,等下會用到。 接著,去 Google 雲端硬碟開一個新的 Google Sheet,就把它當作你的簡易資料庫。 你可以先在裡面建幾個欄位,例如「關鍵字」和「回覆內容」。
步驟二:撰寫 Google Apps Script 程式碼
打開你剛才建立的 Google Sheet,點選頂端選單的「擴充功能」>「Apps Script」。這會開啟一個新的程式碼編輯器。 這裡就是我們要寫程式的地方。核心程式碼其實只有一個函式,叫做 `doPost(e)`。 這個函式會在 LINE 把使用者訊息用 POST 請求的方式傳過來時自動執行。
在 `doPost(e)` 裡面,你需要做幾件事:
- 解析請求:LINE 傳來的資料 `e.postData.contents` 是一個 JSON 格式的字串,裡面包含了是誰、在什麼時候、傳了什麼訊息等等。 你需要先用 `JSON.parse()` 把它轉成物件,方便後續取用。
- 讀取試算表:使用 `SpreadsheetApp.openByUrl()` 或 `openById()` 來打開你的 Google Sheet。 然後用 `getSheetByName()` 選定工作表,再用 `getDataRange().getValues()` 把所有資料一次讀出來。
- 尋找對應的回覆:用一個迴圈來檢查使用者傳來的訊息,是否符合你在試算表裡設定的任何一個「關鍵字」。
- 回覆訊息給 LINE:如果找到對應的關鍵字,就要把「回覆內容」打包成 LINE API 指定的 JSON 格式,然後用 `UrlFetchApp.fetch()` 這個方法,把訊息回傳給 LINE 的 Reply API。 記得,请求的 header 裡面要包含你第一步拿到的 Channel access token 來驗證身份。
步驟三:部署為網路應用程式並設定 Webhook
程式碼寫完後,還不能直接用。你需要把它「部署」成一個網路應用程式,這樣 LINE 的伺服器才能透過網址找到它。在 Apps Script 編輯器右上角,點擊「部署」>「新增部署作業」。 在類型選擇「網頁應用程式」,然後在「誰可以存取」的選項,你必須選擇「任何人」。 這是因為你不會知道 LINE 的伺服器 IP 是什麼,所以必須開放。部署完成後,你會得到一個以 `.exec` 結尾的網址,這就是你的 Webhook URL。
最後一步,回到 LINE Developers 後台,找到你的 Bot,進入 Messaging API 設定頁面,把剛剛複製的 Webhook URL 貼上去,然後開啟「Use webhook」的開關。 按下 Verify 測試一下,如果顯示 Success,就代表你的 Bot 已經跟 Google Apps Script 成功連上線了!
實作範例:一個簡單的關鍵字回覆機器人
光說不練太空泛了,我們直接來看一段程式碼。假設我們的 Google Sheet 長這樣:A 欄是關鍵字,B 欄是回覆。例如 A1 是「你好」,B1 是「你好啊!有什麼我能幫忙的嗎?」;A2 是「營業時間」,B2 是「我們週一到週五 9:00-18:00 營業喔」。
那你的 `doPost(e)` 函式大概會長得像這樣:
function doPost(e) {
// 解析 LINE 傳來的資料
var event = JSON.parse(e.postData.contents).events;
var replyToken = event.replyToken;
var userMessage = event.message.text;
var sourceType = event.source.type; // user, group, or room
// 如果 replyToken 不存在,就直接結束
if (typeof replyToken === 'undefined') {
return;
}
// Google Sheet 的網址
var sheetUrl = '你的 Google Sheet 網址貼在這裡';
var sheet = SpreadsheetApp.openByUrl(sheetUrl).getSheetByName('工作表1');
// 取得所有資料
var data = sheet.getDataRange().getValues();
var replyMessage = '抱歉,我看不懂你的問題。'; // 預設回覆
// 遍歷試算表資料,尋找關鍵字
for (var i = 1; i < data.length; i++) {
if (userMessage === data[i]) {
replyMessage = data[i];
break; // 找到就跳出迴圈
}
}
// 準備回覆給 LINE 的訊息格式
var messages = [{
'type': 'text',
'text': replyMessage,
}];
// 呼叫 LINE Reply API
UrlFetchApp.fetch('https://api.line.me/v2/bot/message/reply', {
'headers': {
'Content-Type': 'application/json; charset=UTF-8',
'Authorization': 'Bearer ' + '你的 Channel Access Token 貼在這裡',
},
'method': 'post',
'payload': JSON.stringify({
'replyToken': replyToken,
'messages': messages,
}),
});
}
把上面的程式碼貼到你的 Apps Script 專案,然後把「你的 Google Sheet 網址」和「你的 Channel Access Token」換成你自己的,部署之後,你的 Bot 就應該會動了。你傳「你好」,它就回「你好啊!...」,是不是很神奇?
串接方式比一比:GAS、第三方平台、還是自架主機?
雖然我們主要讲了 Google Apps Script,但前面也提过,这不是唯一的路。到底该怎么选?我自己是觉得,这没有标准答案,完全看你的需求、预算和技术能力。我整理了一个简单的比较表,给你参考一下。
| 串接方式 | 優點 | 缺點 | 適合誰 |
|---|---|---|---|
| Google Apps Script (GAS) | 免費額度很高,幾乎用不完!跟 Google 生態系整合度一百分。彈性超大,想幹嘛幾乎都能寫出來。 | 還是要寫一點點程式碼啦。除錯 (debug) 比較麻煩,因為 log 不像專業 IDE 那麼好用。執行時間有 6 分鐘限制,太複雜的任務可能會超時。 | 想省錢、不怕動手寫點 code 的個人開發者、行銷小編、中小企業。 |
| 第三方平台 (如 Make/Zapier) | 完全不用寫 code! 介面很直覺,用滑鼠拖拉點選就能完成。超多現成的 App 可以串,不只 LINE 跟 Google Sheet。 | 免費版限制很多,流量一高就要付錢,而且不便宜。 彈性比較低,平台沒提供的功能你就沒辦法做。資料要經過第三方平台,有資安疑慮的人可能會怕怕的。 | 一秒鐘幾十萬上下(開玩笑的)、完全不想碰程式碼、而且預算比較寬裕的行銷或營運團隊。 |
| 自架伺服器 (GCP, AWS...) | 彈性是無限的!效能、流量上限都掌握在自己手裡。可以自己掌控所有資料,安全性最高。 | 超花錢!不只主機要錢,維護也要人力成本。設定超級複雜,從 server、資料庫到網路設定都要自己來,沒專業背景很難搞定。 | 有錢有閒(?)的大型企業、對資安要求極高的金融或醫療產業、或是流量大到 GAS 扛不住的服務。 |
卡關了嗎?常見錯誤與限制
好,我知道,理論很美好,但實際操作起來,八成會遇到一堆鳥事。這裡列出幾個我當初卡關卡很久,後來才搞懂的常見問題,希望能幫你少走點冤枉路。
TypeError: Cannot read property 'postData' of undefined
這個錯誤超經典,十個新手有八個會遇到。 通常有兩個原因:第一,你不是用 POST 方法去測試你的 Webhook URL,而是直接把網址貼到瀏覽器上。瀏覽器直接訪問是 GET 請求,`doPost(e)` 函式裡的 `e` 就會是 undefined,當然就抓不到 `postData`。 第二,你忘了重新部署。在 Apps Script 裡,你每次改完程式碼,都要「儲存」並「重新部署」成一個「新的版本」,你的修改才會生效。只按儲存是沒用的喔!
權限問題:The script does not have permission to perform that action.
這個通常發生在你第一次執行,要去存取 Google Sheet 或其他 Google 服務時。當你點擊執行按鈕或部署時,Google 會跳出一個視窗要求你授權。 你必須同意讓這個 Script 存取你的 Google Sheet 資料。有時候這個授權流程會卡住,或是你沒注意到,就會跳這個錯誤。
Google Apps Script 本身的限制
GAS 不是萬能的。它有一些你需要知道的配額和限制。例如,單次執行的時間最長就是 6 分鐘。如果你要處理的資料太多,讓你的程式跑超過 6 分鐘,它就會被強制中止。另外,像是 `UrlFetchApp` 的每日呼叫次數也有上限(雖然個人帳戶的額度很高,一天有 20,000 次,一般來說很夠用)。但如果你做的是一個超熱門的服務,就要開始考慮這些用量限制了。這也呼應了我前面說的,當規模大到一個程度,可能就要考慮升級到 `Google Sheets API` 或是直接搬到 GCP 等雲端平台。
說到這個,其實 Google 在全球部署的基礎設施很強,但在地化的服務體驗還是有點差別。比如,雖然 Google Cloud 在台灣有資料中心(彰濱工業區),理论上台灣使用者連線速度會比較快。但在使用 Apps Script 這種 serverless 服務時,你其實無法指定你的程式要在哪個機房跑。所以它的延遲表現對台灣用戶來說,可能就不如一個部署在台灣本地主機上的服務穩定。不過,對於 LINE Bot 這種非同步、對延遲沒那麼敏感的應用來說,這點小差異老實說影響不大啦。
希望這些整理對你有幫助。動手做一次,你會發現這比想像中簡單,而且成就感滿滿。你打算用這個功能來解決什麼問題?是想做個客服機器人,還是庫存查詢?在下面留言分享你的點子吧!
