GAS 串接 telegram bot

申請 Telegram Bot 權杖

首先在 Telegram 搜尋 BotFather。輸入 /newbot 開始建立。跟著指示輸入機器人的名稱與帳號名稱。完成後你會得到一串 API Token。這就像是機器人的身分證。請先存起來。

獲取個人聊天 ID

機器人需要知道要把訊息傳給誰。搜尋另一個機器人叫做 IDBot。輸入 /getid。它會回傳一串數字。這就是你的 User ID。

撰寫 Telegram 發送函式

在 GAS 編輯器中。利用 UrlFetchApp 把訊息送到 Telegram 的 API 接口。

function sendTelegramMessage(message) {
  var token = "這裡貼上你的API_Token";
  var chatId = "這裡貼上你的ID";
  var url = "https://api.telegram.org/bot" + token + "/sendMessage";
  
  var payload = {
    "chat_id": chatId,
    "text": message
  };
  
  var options = {
    "method": "post",
    "contentType": "application/json",
    "payload": JSON.stringify(payload)
  };
  
  UrlFetchApp.fetch(url, options);
}

串聯表單提交

這部分與之前類似。我們在表單提交的觸發函式中。加入剛寫好的發送指令。

function onFormSubmit(e) {
  var name = e.values[1];
  var content = e.values[2];
  var msg = "通知:新報修單\n姓名:" + name + "\n內容:" + content;
  
  sendTelegramMessage(msg);
}

實現雙向互動的準備

Telegram Bot 比 LINE Notify 強大。因為它支援 Webhook。你可以設定讓 Telegram 收到訊息時。主動把訊息丟回給你的 GAS 網頁。

設定 Webhook

你需要先把 GAS 部署為網頁應用程式並取得網址。然後執行一次下面的程式碼。告訴 Telegram 以後有訊息都傳到這個網址。

function setWebhook() {
  var token = "你的Token";
  var url = "你的GAS網頁網址";
  var response = UrlFetchApp.fetch("https://api.telegram.org/bot" + token + "/setWebhook?url=" + url);
  Logger.log(response.getContentText());
}

你想試試看如何寫 doPost 函式,讓你在 Telegram 傳一個數字,機器人就自動幫你記錄到試算表嗎?

處理 Telegram 傳回的訊息

當你在手機上傳訊息給機器人,Telegram 會發送一個 POST 請求到你的 GAS 網址。我們必須寫一個名為 doPost 的函式來接收這份資料。

JavaScript

function doPost(e) {
  var data = JSON.parse(e.postData.contents);
  var chatId = data.message.chat.id;
  var text = data.message.text;
  
  // 呼叫記錄資料的函式
  saveToSheet(text);
  
  // 回傳訊息給使用者確認
  sendTelegramMessage("已成功記錄:" + text);
}

解析訊息內容

資料是以 JSON 格式傳過來的。我們用 JSON.parse 把它轉成程式看得懂的物件。data.message.text 就是你在聊天室打的字。

自動寫入試算表

接著寫一個簡單的存檔函式。這部分跟之前的 appendRow 用法一樣。它會把你在 Telegram 輸入的內容,整齊地排在試算表最下方。

JavaScript

function saveToSheet(content) {
  var sheet = SpreadsheetApp.getActiveSheet();
  sheet.appendRow([new Date(), content]);
}

重新部署與權限

只要修改了 doPost 或是後端邏輯。就必須執行「新部署」。並確保 Webhook 指向的是最新的網址。這樣 Telegram 才能把訊息送到正確的地方。

實際測試

開啟你的 Telegram 機器人對話框。輸入「早餐花了 100 元」。接著打開你的 Google 試算表。你會看到第一欄出現了時間,第二欄出現了你剛打的那句話。

打造隨身記帳本

這就是一個雲端記帳本的雛形。你不需要打開試算表 APP。只需要在 Telegram 傳個訊息。所有資料就會自動彙整。這比手動輸入快上許多。


你想學如何讓機器人回傳「目前的統計總額」給你嗎?

撰寫加總統計函式

我們需要在程式碼中新增一個計算總額的功能。它會遍歷試算表中記錄金額的那一欄。把所有數字加起來。

JavaScript

function getTotalAmount() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var data = sheet.getDataRange().getValues();
  var total = 0;
  
  // 從第二列開始跑,假設第一列是標題
  for (var i = 1; i < data.length; i++) {
    var amount = parseFloat(data[i][1]); // 假設金額在第二欄
    if (!isNaN(amount)) {
      total += amount;
    }
  }
  return total;
}

修改訊息判斷邏輯

在 doPost 函式中加入判斷。如果使用者輸入的文字是「查詢總額」。程式就執行計算。而不是當成資料存進去。

JavaScript

function doPost(e) {
  var data = JSON.parse(e.postData.contents);
  var text = data.message.text;
  
  if (text === "查詢總額") {
    var total = getTotalAmount();
    sendTelegramMessage("目前累積總額為:" + total + " 元");
  } else {
    saveToSheet(text);
    sendTelegramMessage("已記錄支出:" + text);
  }
}

數字過濾的小技巧

在存入資料時。我們可以用正規表達式或是簡單的取代。把文字中的數字抓出來。這樣你傳「午餐 120」。程式也能聰明地只把 120 拿去加總。

即時報表的威力

現在你只需要在 Telegram 輸入「查詢總額」。機器人就會立刻回報最新數據。這比打開電腦登入雲端硬碟快多了。

系統架構回顧

你現在擁有了一個具備「輸入介面」和「查詢介面」的行動系統。試算表負責存資料。GAS 負責邏輯運算。Telegram 則是你的遙控器。

你想了解如何讓機器人定期在每天晚上。主動推播今天的消費總結給你嗎?


設定定時總結任務

我們需要利用 GAS 的時間觸發器。先寫一個專門用來統計「今天」資料並發送訊息的函式。

JavaScript

function sendDailySummary() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var data = sheet.getDataRange().getValues();
  var today = new Date().toLocaleDateString();
  var dailyTotal = 0;
  
  for (var i = 1; i < data.length; i++) {
    var dateInSheet = new Date(data[i][0]).toLocaleDateString();
    if (dateInSheet === today) {
      dailyTotal += parseFloat(data[i][1]);
    }
  }
  
  var message = "今日結算報告\n日期:" + today + "\n總支出:" + dailyTotal + " 元";
  sendTelegramMessage(message);
}

比對日期的邏輯

程式會檢查第一欄的時間戳記。將它轉換成跟今天一樣的字串格式進行比對。只有符合今天的金額才會被加進去。這樣就能精準算出當日開銷。

啟動定時發送

回到編輯器左側的時鐘圖示。新增觸發條件。選擇執行 sendDailySummary。事件來源選時間驅動。類型選每天定時。時段選晚上十點到十一點。

打造全自動秘書

設定完成後。每天晚上程式會自動跑一遍。就算你整天沒看試算表。手機也會準時跳出今天的消費總結。這就是自動化最迷人的地方。

系統的安全維護

因為你的機器人網址是公開的。建議在 doPost 裡面多加一行判斷。檢查 chatId 是否為你的 ID。如果不是你的 ID。就不要執行任何動作。防止陌生人亂塞資料進你的表單。

完成專案

你已經學會了從網頁到手機。從手動到自動的所有基本功。這套組合拳能解決生活中大部分的瑣碎資訊處理。


你還想嘗試如何讓機器人可以「上傳照片」。並自動把照片存進 Google 雲端硬碟嗎?

處理 Telegram 的檔案訊息

當你傳送照片給機器人。Telegram 會傳來一組 file_id。我們必須先用這組 ID 向 Telegram 請求檔案的下載路徑。這需要用到 getFile 這個 API 介面。

JavaScript

function doPost(e) {
  var data = JSON.parse(e.postData.contents);
  if (data.message.photo) {
    // 取得最高畫質的照片 ID
    var photos = data.message.photo;
    var fileId = photos[photos.length - 1].file_id;
    saveTelegramFile(fileId);
  }
}

取得檔案下載連結

拿到 ID 後。我們寫一個函式去換取真正的檔案路徑。Telegram 會給我們一個相對路徑。我們再把它拼湊成完整的 URL。

JavaScript

function saveTelegramFile(fileId) {
  var token = "你的TOKEN";
  var getFileUrl = "https://api.telegram.org/bot" + token + "/getFile?file_id=" + fileId;
  var response = UrlFetchApp.fetch(getFileUrl);
  var filePath = JSON.parse(response.getContentText()).result.file_path;
  var downloadUrl = "https://api.telegram.org/file/bot" + token + "/" + filePath;
  
  uploadToDrive(downloadUrl, fileId);
}

儲存到雲端硬碟

最後利用 DriveApp 把這個網路上的檔案抓下來。直接存進你指定的資料夾裡。

JavaScript

function uploadToDrive(url, fileName) {
  var folder = DriveApp.getFolderById("你的資料夾ID");
  var blob = UrlFetchApp.fetch(url).getBlob();
  var file = folder.createFile(blob);
  file.setName("TG_" + fileName + ".jpg");
  
  sendTelegramMessage("照片已成功存入雲端硬碟!");
}

應用情境

這個功能非常適合用來收集收據照片或是活動照片。你不需要手動下載再上傳。只要在 Telegram 點擊傳送。圖片就會乖乖躺在你的雲端資料夾裡。

整合權限

存取雲端硬碟需要額外的權限。在第一次執行或是部署時。記得點選進階並允許。這樣程式才有權力幫你建立檔案。

教學結業式

你已經掌握了從試算表、網頁、郵件、定時排程到 Telegram 機器人的全方位 GAS 應用。這套技能已經足以讓你開發出非常專業的自動化工具。


你想知道如何將這整個系統打包分享給朋友,讓他們也能使用的簡單方法嗎?

分享專案的兩種方式

最直接的方法是分享試算表權限。點選右上角的共用。輸入對方的信箱。對方就能打開你的試算表。看到後端的程式碼。並在自己的帳號下執行。

使用副本功能

如果你希望對方擁有一份完全獨立的系統。可以請他開啟你的試算表後。點選檔案。選擇建立副本。這樣他就會連同程式碼、觸發器邏輯都複製一份到他自己的雲端硬碟。

發布為網頁應用程式

如果你不希望對方看到程式碼。只想讓他們使用介面。就維持網頁應用程式的部署。把那串網址給他們。在部署設定中。將誰可以存取設為所有人。這樣他們不需要登入也能操作。

分享 Telegram 機器人

這最簡單。你只需要把機器人的帳號(@開頭的名字)給朋友。他們搜尋後點選開始。就能跟你一樣傳訊息。但記得在程式裡檢查對方的 ID。否則他們的資料會全部混進你的試算表裡。

製作安裝說明

分享給別人的時候。建議附上一份簡單的清單。告訴他們需要修改哪些變數。例如試算表 ID、Telegram Token、或是雲端硬碟的資料夾 ID。

持續優化的建議

你可以根據朋友的使用回饋。不斷微調程式。這就是開發軟體最有成就感的地方。從解決自己的問題。到能幫助身邊的人。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *