用 Google Apps Script 來作一個 Line Bot 如何

前言

最近看完書領悟到了一點 「要解決財務焦慮的第一步,就是要知道家庭支出」,於是開始研究了一下市面上的可以協作的記帳軟體,但不是要付費就是功能太複雜,最後決定自己開發一個來試試看。

目標與設計

我目前想要的功能很簡單,就是有個介面可以輸入記帳項目,然後可以把交易記錄到 Google Sheet 上就好,反正要整理分析最後人工來作也不會花上太多時間。

想到之前一直想要來玩玩看 Google Apps Script (以下都簡稱 GAS),加上 GAS 又能無縫串接 Google Sheet,正好符合這次的需求。

初步架構就決定是這樣了:

開發過程

全程 Vibe coding 都讓 AI 寫,我只負責測試以及驗收功能,還有設定 Line Channel 這些後台設定而已。

GAS 其實就是一個 PaaS 服務,使用者只需要照自己的業務邏輯撰寫程式碼,後面的執行環境、部屬等等 GAS 都會幫你準備好,讓像我這樣的懶人可以很快的直接看到成果。難怪很多人會拿 GAS 當作軟體工程啟蒙,這比寫爬蟲什麼有趣多了。

要開發 GAS 可以直接在 GAS 的網頁上開發;或是像我一樣在自己的 IDE 上開發完,再利用 clasp 這個 CLI 工具推送到 GAS 上完成部屬,後者的好處是會有一份程式碼在 local,可以使用 IDE 或是 AI 工具協助開發。(相信我你不會想在 IDE 寫完程式碼,然後用複製貼上的方式去網頁版編輯器)

GAS 執行時的運作也很簡單,就是兩個入口:

1
2
3
4
function doGet(e) {}

function doPost(e) {}

我們把需要的 callback 邏輯寫在這兩個函式中,以我的案例要接 Line Messaging API 打過來的請求,大概會長這樣:

1
2
3
4
5
6
7
8
9
10
11
12
13
function doPost(e) {
var contents = JSON.parse(e.postData.contents);
var events = contents.events;

events.forEach(function(event) {
if (event.type === 'message' && event.message.type === 'text') {
var eventId = event.webhookEventId;
...

// do something
}
});
}

要存取 Google Sheet 也很簡單,直接在程式碼中呼叫 SpreadsheetApp.openById(sheetId); 就可以透過 ID 取得,但是要注意後面在部屬的時候要設定執行身分,如果這個 sheet 只有本人可以存取,那執行身分就要設定為本人。

部屬也是非常簡單,只要在網頁上點選右上角的「部屬」按鈕,就能完成部屬了。

部屬成功後會得到一個像這樣的 URL: https://script.google.com/macros/s/AKfycbxOFRfffExrffffsaaa63opssssss-kffsssFRffT5Y-y8hBBBBCCC/exec,這個就是我們服務的對外 URL。是的你沒看錯,連 HTTPS 都幫忙搞定了。

拿到這個後就可以把這個 URL 貼到 Line Channel 上的 webhook 欄位使用。當 Line Message API 接收到特定 Channel 的訊息後就會發送一個請求過來這個 URL。

到這邊其實就算是完成一個簡單的 Line Bot 了。

遇到的問題

在 Line Developer 頁面測試 webhook 都不會過

這個我真的卡了一陣,但最後找到保哥 2025 的貼文,知道Bot 還是能正常回應就不管他了。

沒有 Log 超難 debug!

GAS 在開啟「所有人都能呼叫」時,在執行項目那邊會看不到 log,即使呼叫的人是自己,GAS 也會把 log 隱藏。

有看到社團有人是把 log 寫到另一份 Google sheet,或是乾脆通靈 (?!)。我是為了看 log 把這個專案綁定到我的 GCP 專案中,就可以在 Cloud Logging 上看到 log 了。

執行太慢,超過 Line Messaging API 的 1s timeout 時間

這個是目前唯一沒解決的問題,從 Line Messaging API server 發送過來的請求要在 1s 內回覆 HTTP 200 不然就會被視為失敗,觸發 Line Messaging API 的重試機制,會每隔一段時間重新發送重複的訊息 (記帳 sheet 上會多出一堆相同的紀錄)。

為了解決這個問題我也嘗試把執行時間較久的 callback 改成先建立一個 Time Trigger 在一秒後執行寫入 Google sheet 的操作。但我怎麼樣都無法把執行時間壓在一秒內,最後還是會觸發重試。

另一方面針對重試發過來的請求可以用一個 cache 阻擋他,至少讓重複的資料不要寫入 Google sheet。

這個問題最後還是沒解決,雖然一切都能正常運作,但是看到 log 中有 Line Messaging API 送過來的請求還是會很阿雜。

結論

作為一個全託管服務,GAS 以他親民的使用方式讓很多非工程師也能快速自動化工作,除了 Google Sheet,GAS 也能串接其他 SaaS 服務如 Drive, Forms 甚至是 Big Query 等等,如果工作上都會用到這些服務,GAS 不失為一個自動化的選擇!


用 Google Apps Script 來作一個 Line Bot 如何
https://my-blog.pages.dev/2026-01-10/build-line-bot-with-gas/
Author
Kevin
Posted on
January 10, 2026
Licensed under