Google Apps Script 串接 LINE Bot 完整步驟:免費打造自動回覆機器人

Published on: | Last updated:

今天要來聊聊一個我自己覺得超實用,但好像很多人卡關的主題:怎麼用 Google Apps Script (後面我會簡稱 GAS) 去串接一個 LINE Bot,而且幾乎是免費的。對,你沒聽錯,不用自己架設伺服器,也不用花大錢,就能做出一個可以自動回覆訊息的 LINE 機器人。 這方法特別適合一些小專案、個人用途,或是想先快速驗證想法的人。

老實說,網路上的教學很多,但有些年代久遠,介面都改了;有些又只教了最基本的「你說哈囉、我回哈囉」,沒有提到實際應用會遇到的坑。所以我這篇算是我的草稿兼筆記,把我從頭到尾踩過的雷、想過的方法都記錄下來,希望能幫到大家。

先說結論:為什麼要用 GAS 串 LINE Bot?

簡單講,就是「方便」跟「省錢」。GAS 基本上就是跟著你 Google 帳號的雲端 JavaScript 執行環境,可以直接跟 Google Sheets、Docs、Calendar 這些服務溝通。 你不用管什麼伺服器維護、SSL 憑證,Google 都幫你弄好了。當 LINE 那邊有使用者傳訊息給你,LINE 的伺服器就會透過一個叫做 "Webhook" 的機制,去戳一下你設定好的 GAS 網址。 然後你的 GAS 程式碼就會被觸發,處理完訊息後,再把回覆丟回給 LINE,最後傳到使用者手機上。整個流程非常順暢。

最大的好處是,對於流量不大的應用來說,這幾乎是零成本的。LINE Messaging API 本身就有免費的訊息額度,而 GAS 也有大方的免費額度,對一般開發測試或小型應用來說綽綽有餘。當然,如果你要做的是超高流量的商業應用,那可能還是要考慮專業的雲端主機,但對我們這種 DIY 玩家來說,GAS 絕對是首選。

LINE Bot 與 Google Apps Script 互動流程示意圖
LINE Bot 與 Google Apps Script 互動流程示意圖

怎麼做?完整步驟與要點

好,理論講完了,我們來實際操作一次。我會盡量把步驟拆解得細一點,特別是那些容易卡關的地方。

第一步:建立你的 LINE 機器人 (Messaging API)

這一步是所有工作的起點。你需要先到 LINE Developers Console 去建立一個「供應者 (Provider)」和一個「頻道 (Channel)」。

  1. 登入 LINE Developers Console:用你平常的 LINE 帳號登入就可以了。
  2. 建立 Provider:把它想像成一個開發團隊或公司名稱,隨便取一個你喜歡的就好。
  3. 建立 Channel:這才是你的機器人本體。在建立選項中,請務必選擇「Messaging API」。 填一些基本資料,像是頻道名稱、描述、大頭貼等等。
  4. 取得 Channel Access Token (長期):進入你剛建立好的 Channel,切換到「Messaging API」這個頁籤。往下滑會看到「Channel access token」,點下「Issue」按鈕。 這會產生一長串的亂碼,這就是你機器人的「身份證」,非常重要!絕對不要外洩。等一下寫程式會用到,先把它複製下來存好。

我自己剛開始玩的時候,常常把 LINE Notify 跟 Messaging API 搞混。LINE Notify 比較單純,只能單向推播訊息,而且是免費的。 但如果你想要做到可以跟使用者「對話」、自動回覆,那就一定要用 Messaging API。

第二步:撰寫 Google Apps Script 程式碼

重頭戲來了。打開你的 Google 雲端硬碟,新增一個「Google Apps Script」專案。 如果找不到,可以從「更多」裡面去連結更多應用程式把它加上。

進到編輯器後,你會看到一個 `myFunction` 函式,把它全部刪掉,貼上以下的程式碼。這是一個最基礎的「鸚鵡機器人」,你跟它說什麼,它就回你什麼。


var CHANNEL_ACCESS_TOKEN = '把你剛剛複製的 Channel Access Token 貼在這裡';

function doPost(e) {
  // 解析從 LINE 傳來的資料
  var eventData = JSON.parse(e.postData.contents).events;

  // 取得回覆用的 token
  var replyToken = eventData.replyToken;

  // 如果 replyToken 不存在,就直接結束
  if (typeof replyToken === 'undefined') {
    return;
  }

  // 取得使用者傳來的訊息內容
  var userMessage = eventData.message.text;

  // 設定要回傳的 API 網址
  var url = 'https://api.line.me/v2/bot/message/reply';

  // 使用 Google Apps Script 的 UrlFetchApp 來發送請求
  UrlFetchApp.fetch(url, {
    'headers': {
      'Content-Type': 'application/json; charset=UTF-8',
      'Authorization': 'Bearer ' + CHANNEL_ACCESS_TOKEN,
    },
    'method': 'post',
    'payload': JSON.stringify({
      'replyToken': replyToken,
      'messages': [{
        'type': 'text',
        'text': '你剛剛說了:「' + userMessage + '」',
      }],
    }),
  });

  // 回傳一個成功的 JSON 訊息
  return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON);
}
    

這邊有幾個重點要特別注意:

  • `doPost(e)`: 這個函式名稱是固定的。當 LINE 的 Webhook 送來 POST 請求時,GAS 就會自動執行這個函式。
  • `e.postData.contents`: 這裡面裝了所有 LINE 傳過來的資料,是 JSON 格式,所以需要用 `JSON.parse` 來解析。
  • `replyToken`: 這是用來回覆特定訊息的「鑰匙」,每次請求都會不一樣,而且有時效性。你必須用這個 token 才能把訊息回給正確的人。
  • `UrlFetchApp.fetch`: 這是 GAS 裡用來對外發送網路請求的工具,我們就是用它來呼叫 LINE 的 Reply Message API。
Google Apps Script 編輯器中的 doPost 函式
Google Apps Script 編輯器中的 doPost 函式

第三步:部署為網路應用程式 (Web App)

程式碼寫好後,還不能直接用。你需要把它「部署」成一個公開的網路應用程式,這樣 LINE 的伺服器才找得到它。

  1. 在 GAS 編輯器的右上角,點擊藍色的「部署」按鈕,然後選擇「新增部署作業」。
  2. 在「選取類型」旁邊,點齒輪圖示,選擇「網頁應用程式」。
  3. 在「說明」欄位隨便打個名字,方便你辨識。
  4. 最重要的步驟:在「誰可以存取」這個選項,一定要選擇「任何人」(Anyone)。以前舊版是「任何人,甚至是匿名使用者」(Anyone, even anonymous),總之就是要選權限最開放的那個。 如果選錯,LINE 的 Webhook 會因為權限不足而被擋下來。
  5. 點擊「部署」。GAS 會給你一組「網頁應用程式」的 URL,這就是你的 Webhook 網址!把它複製下來。

啊對了,這邊有個小提醒。每次你修改完程式碼,都必須「重新部署」一次,而且要選擇「管理部署作業」,編輯你現有的部署,然後選擇一個「新版本」。 直接產生一個新的部署會產生新的網址,會很亂。這是我剛開始常犯的錯,一直想說為什麼程式改了都沒反應,結果是忘了重新部署。

第四步:設定 Webhook URL

最後一步!我們回到 LINE Developers Console,在你那個頻道的「Messaging API」設定頁面裡,找到「Webhook settings」。

  1. 把剛剛從 GAS 複製的網址,貼到「Webhook URL」這個欄位裡。
  2. 點擊「Update」或「更新」按鈕。
  3. 底下有個「Use webhook」,記得要把它打開 (切換成啟用狀態)。
  4. 再往下有個「自動回應訊息 (Auto-reply messages)」,建議把它「停用」。 因為我們就是要用 GAS 來處理所有回覆,如果這個還開著,使用者會同時收到 LINE 官方的預設回覆跟我們 Bot 的回覆,會很奇怪。

都設定好之後,可以點一下 Webhook URL 欄位旁邊的「Verify」按鈕。如果你的 GAS 程式碼跟部署都正確,應該會看到一個「Success」的訊息。然後,拿出你的手機,掃描 LINE Developers 後台提供的 QR Code,把你的機器人加為好友,隨便傳個訊息給它試試看吧!

手機上成功收到 LINE Bot 自動回覆的畫面
手機上成功收到 LINE Bot 自動回覆的畫面

常見錯誤與修正

說真的,第一次設定通常不會這麼順利。我自己就遇過各種千奇百怪的問題。這邊整理幾個最常見的,如果你卡關了,可以先從這邊檢查起:

  • Bot 沒反應:最大宗的原因是 Webhook URL 權限設定錯誤。請回去 GAS 部署設定,確認「誰可以存取」是設為「任何人」。 另一個可能是你改了程式碼但忘了重新部署成新版本。
  • 收到回覆,但內容是空的或不對:這通常是 `doPost` 函式裡解析 JSON 資料出錯。你可以用 `console.log(e.postData.contents);` 把收到的原始資料印出來看看。 在 GAS 編輯器左邊的「執行項目」可以看到 log 紀錄。很多時候可能是訊息類型不是文字 (例如使用者傳了貼圖),但你的程式碼沒有處理,`eventData.message.text` 就會是 `undefined`,然後就出錯了。
  • 串接 Google Sheets 讀寫失敗:這通常是授權問題。第一次執行需要存取 Google Sheets 的程式碼時,你需要手動在 GAS 編輯器裡執行一次,它會跳出一個視窗,要求你授權這個指令碼存取你的試算表。很多人都是部署後就放著,結果程式在雲端執行時因為沒被授權過,就直接失敗了。

GAS vs. 傳統主機,哪個好?

這個問題其實沒有標準答案,看你的需求。我做了一張簡單的比較表,用我自己的理解跟口吻來說明。

比較項目 Google Apps Script (GAS) 傳統雲端主機 (例如 Heroku, AWS Lambda)
建置成本 幾乎是零。LINE 跟 Google 的免費額度對小專案來說很夠用了。 通常有免費方案,但功能或時數受限。流量一上來,就要開始算錢了。
維護難度 超級低。不用管作業系統、不用管伺服器更新,Google 全包了。 需要自己處理環境設定、依賴套件管理、系統安全更新,比較花心力。
執行效能 反應速度還行,但不是最快的。有時候冷啟動會稍微慢一點點。 效能通常比較好,可以選擇的機器規格也多,反應速度可以調校到非常快。
功能彈性 受限於 GAS 的環境。例如,它用的 JavaScript 版本比較舊 (雖然現在有改善),能用的外部函式庫也有限制。 極高。你可以用任何你喜歡的語言 (Python, Node.js, Go...),安裝任何你需要的套件,自由度最大。
適合情境 個人專案、公司內部小工具 (例如回報每日進度)、串接 Google 生態系服務 (像讀寫試算表、寄 Gmail)。 需要大量運算、高流量的商業級應用、需要使用特定程式語言或函式庫的複雜 Bot。

還能做什麼?從 Google Sheets 讀取資料回覆

學會了鸚鵡機器人,下一步當然就是讓它變聰明一點!最常見的應用就是串接 Google Sheets 當作簡易資料庫。 比如說,你可以做一個關鍵字回覆機器人:使用者傳「A」,機器人就去試算表裡找 A 對應的回覆,然後傳回去。

這個概念在很多日本的教學文章中也很流行,他們稱之為スプレッドシート (Spreadsheet) 驅動的 Bot。 實現起來也很簡單,你只需要在你的 `doPost` 函式裡加上讀取試算表的程式碼:


// ... 前面的程式碼省略 ...

function doPost(e) {
  // ... 解析 LINE 資料的程式碼省略 ...

  var userMessage = eventData.message.text;

  // 打開你的 Google Sheet
  var sheet = SpreadsheetApp.openById('你的試算表ID').getSheetByName('工作表1');
  
  // 取得所有資料範圍
  var dataRange = sheet.getDataRange();
  var values = dataRange.getValues();
  
  var replyText = '抱歉,我看不懂你在說什麼。'; // 預設回覆

  // 遍歷每一行,尋找關鍵字
  for (var i = 1; i < values.length; i++) { // 從第二行開始,避開標題
    if (values[i] == userMessage) { // 假設第一欄是關鍵字
      replyText = values[i]; // 第二欄是回覆內容
      break;
    }
  }

  // ... 後面呼叫 LINE Reply API 的程式碼,只是把 text 換成 replyText ...
}
    

你看,串接試算表就這麼幾行程式碼,是不是很簡單? 用這個基礎,你就可以延伸出各種應用,像是簡易的問答資料庫、活動報名系統、甚至是待辦事項記錄等等。老實說,光是 GAS 搭配 Google Sheets,就已經能解決生活和工作上 80% 的自動化小需求了。

好了,這篇草稿就先到這邊。希望這些步驟和心得對你有幫助。動手做一個自己的 LINE Bot 真的很有趣,而且成就感滿滿。你第一個想做的 LINE Bot 功能是什麼?是每天自動報天氣,還是記錄待辦事項?在下面留言分享你的創意吧!

Related to this topic:

Comments

撥打專線 LINE免費通話