申請 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。
持續優化的建議
你可以根據朋友的使用回饋。不斷微調程式。這就是開發軟體最有成就感的地方。從解決自己的問題。到能幫助身邊的人。