NOTES | 技術筆記

Google 試算表自動發 LINE 通知怎麼做?LINE Notify 停用後,改用 Apps Script+Messaging API

LINE Notify 已在 2025 年 3 月 31 日結束服務,原本「試算表有新資料就發 LINE」的做法要改用 LINE 官方帳號的 Messaging API。這篇說明要準備什麼、Apps Script 推播寫法、每天定時發送,以及額度與金鑰要注意的地方。

重點摘要

  • LINE Notify 已在 2025 年 3 月 31 日結束服務,舊的 notify-api.line.me 寫法不能再用。
  • 替代做法是 LINE 官方帳號+Messaging API:試算表裡的 Apps Script 呼叫推播 API,把訊息送給已加官方帳號好友的人。
  • 需要三樣東西:LINE 官方帳號(申請免費)、Channel access token、收訊人的 user ID。
  • 定時發送用 Apps Script 的時間驅動觸發條件,不用另外租主機。
  • 主動推播有每月額度,超過要付費;多筆提醒合併成一則送,比較省。

和 LINE Notify 差在哪

LINE Notify 是「發給自己或群組」的通知服務,拿一組權杖就能送。Messaging API 則是以官方帳號的身分發訊息,所以:

LINE Notify(已停用) Messaging API
發送者 LINE Notify 官方帳號 你自己的 LINE 官方帳號
收訊人 綁定的個人或群組 加了你官方帳號好友的人(用 user ID 指定)
金鑰 個人權杖 Channel access token
費用 免費 主動推播有每月免費則數,超過依方案計費

好處是訊息來自自己的品牌帳號,也能做按鈕、卡片;代價是要多一步取得收訊人的 user ID。

要準備的三樣東西

  1. LINE 官方帳號,並啟用 Messaging API:在 LINE Official Account Manager 建立帳號後,到設定裡啟用 Messaging API,會建立一個對應的 channel。
  2. Channel access token:在 LINE Developers Console 該 channel 的 Messaging API 分頁發行。這組金鑰等於帳號的發訊權限,不要貼在試算表儲存格或公開的程式碼裡。
  3. 收訊人的 user ID:只發給自己的話,Developers Console 的 Basic settings 分頁就有「Your user ID」。要發給別人,對方要先加官方帳號好友,再從 webhook 收到的事件裡取得 source.userId。user ID 是一串 U 開頭的字,不是 LINE ID。

Apps Script:推播一則文字訊息

在試算表選「擴充功能 → Apps Script」,貼上:

// 金鑰放在「專案設定 → 指令碼屬性」,不寫在程式碼裡
const props = PropertiesService.getScriptProperties();
const TOKEN = props.getProperty('LINE_CHANNEL_ACCESS_TOKEN');
const TO = props.getProperty('LINE_USER_ID');

function pushLine(text) {
  const res = UrlFetchApp.fetch('https://api.line.me/v2/bot/message/push', {
    method: 'post',
    contentType: 'application/json',
    headers: { Authorization: 'Bearer ' + TOKEN },
    payload: JSON.stringify({
      to: TO,
      messages: [{ type: 'text', text: text }],
    }),
    muteHttpExceptions: true,
  });
  if (res.getResponseCode() !== 200) {
    // 常見原因:token 錯、user ID 錯、對方封鎖了官方帳號、額度用完
    console.error(res.getResponseCode() + ' ' + res.getContentText());
  }
}

muteHttpExceptions: true 讓失敗時不直接丟例外,而是把 LINE 回的錯誤訊息印在執行紀錄裡,除錯時比較好找原因。

每天早上把「今天到期」整理成一則送出

假設工作表「待辦」的 A 欄是日期、B 欄是事項:

function sendTodayDigest() {
  const sheet = SpreadsheetApp.getActive().getSheetByName('待辦');
  const rows = sheet.getDataRange().getValues().slice(1); // 跳過標題列
  const today = Utilities.formatDate(new Date(), 'Asia/Taipei', 'yyyy-MM-dd');
  const items = rows
    .filter(r => r[0] instanceof Date &&
      Utilities.formatDate(r[0], 'Asia/Taipei', 'yyyy-MM-dd') === today)
    .map(r => '・' + r[1]);
  if (items.length === 0) return; // 沒事就不發,省額度
  pushLine('今天到期(' + items.length + ' 項)\n' + items.join('\n'));
}

// 執行一次就好:建立每天 8 點左右的觸發條件
function createDailyTrigger() {
  ScriptApp.newTrigger('sendTodayDigest')
    .timeBased().everyDays(1).atHour(8).create();
}

時間驅動觸發條件只能指定「幾點到幾點之間」,不會剛好整點,這對提醒類的用途通常沒關係。專案的時區要在「專案設定」裡設成台北,不然日期比對會差一天。

容易踩到的地方

  • 額度:主動推播(push、multicast、broadcast)算在官方帳號的每月訊息則數裡;回覆使用者傳來的訊息(reply)不算。免費則數與加購價格依 LINE 官方帳號方案而定,以官方方案頁為準。所以排程提醒盡量合併成一則,沒有內容就不發。
  • 對方要先加好友:沒加好友、或封鎖了官方帳號,推播會失敗。
  • 發給群組:要把官方帳號邀進群組,從 webhook 事件取得 groupId,to 改填 groupId。
  • 金鑰外流:試算表分享給別人時,指令碼屬性不會顯示在儲存格裡,但有編輯權限的人仍能進 Apps Script 看到。要給多人編輯的試算表,金鑰最好放在另一個只有自己能編輯的專案。
  • 「有新資料就發」:用「提交表單時」或「編輯時」的可安裝觸發條件呼叫 pushLine。要注意同一列被改好幾次會重複發,可以在旁邊加一欄「已通知」做記號。

延伸

資料來源:LINE Developers:Messaging API 傳送訊息、Messaging API reference、Google Apps Script:可安裝的觸發條件。整理日期 2026-11-10。

← 回到技術筆記

你的情況也類似?

加 LINE 最快。說說你現在怎麼做、想變成什麼樣子,
我回你可行的做法和需要釐清的問題。

加 LINE 聊一聊 →

或寫信:ted@tedshen.link