基于JavaScript的Telegram Bot:如何从Google Sheets向Telegram发消息?
当然可以实现!
你的思路完全可行,我们只需要补充几个关键模块,就能打通「Telegram用户发消息→内容存入Google Sheets→你在表格写回复→机器人自动发回用户」的完整流程。结合你给出的代码,我来一步步帮你完善:
1. 先补全缺失的sendText函数
你代码里调用了sendText(id, answer)但没定义这个核心函数,这是和Telegram API交互的关键。我们用Telegram的sendMessage接口来实现:
const BOT_TOKEN = "你的Telegram机器人Token"; // 替换成你自己的机器人Token const ssId = "你的Google Sheets文档ID"; // 替换成你的表格ID // 向指定Chat ID发送消息的核心函数 function sendText(chatId, text) { const url = `https://api.telegram.org/bot${BOT_TOKEN}/sendMessage`; const payload = { method: "post", contentType: "application/json", payload: JSON.stringify({ chat_id: chatId, text: text }) }; UrlFetchApp.fetch(url, payload); }
2. 实现「表格写回复→自动发送」的监听逻辑
要实现你在单元格写消息就自动回复,我们需要用Google Apps Script的安装型触发器(简单的onEdit因权限限制无法调用外部API),监听表格的编辑事件:
步骤2.1:编写监听函数
假设你的表格结构是:
- A列:时间
- B列:Chat ID(用户的Telegram聊天ID)
- C列:用户名
- D列:用户发送的消息
- E列:你要填写的回复内容
我们写一个函数,当E列被填入内容时,自动抓取同一行的Chat ID,发送消息后可以标记已处理(比如清空E列或在F列加「已发送」标记):
function handleSheetReply(e) { // 只监听E列(第5列)的编辑事件 if (e.range.getColumn() !== 5 || e.value === "") return; const sheet = e.source.getActiveSheet(); const row = e.range.getRow(); const chatId = sheet.getRange(row, 2).getValue(); // 获取同一行的Chat ID(B列) const replyText = e.value; // 获取你填写的回复内容 // 发送消息到Telegram sendText(chatId, replyText); // 可选:标记已发送,比如清空E列内容 sheet.getRange(row, 5).clearContent(); // 或者在F列添加发送状态 sheet.getRange(row, 6).setValue("已发送"); }
步骤2.2:安装触发器
- 打开Google Apps Script编辑器
- 点击左侧「触发器」图标(时钟形状)
- 点击「添加触发器」
- 设置:
- 选择要运行的函数:
handleSheetReply - 选择部署类型:「从电子表格」
- 选择事件类型:「编辑时」
- 保存并授权(需要允许脚本访问你的表格和调用外部API)
- 选择要运行的函数:
3. 整合你的原有代码
把上面的函数和你原有的doPost函数整合,完整代码如下:
const BOT_TOKEN = "你的Telegram机器人Token"; const ssId = "你的Google Sheets文档ID"; function doGet() { return HtmlService.createHtmlOutput("Hi there"); } function doPost(e) { // 处理Telegram发来的消息 const data = JSON.parse(e.postData.contents); const text = data.message.text; const id = data.message.chat.id; const name = `${data.message.chat.first_name} ${data.message.chat.last_name}`; const answer = `Hi, ${name} wait an answer ${text}`; // 回复用户初始提示消息 sendText(id, answer); // 把消息记录存入表格(预留E列用于后续回复) SpreadsheetApp.openById(ssId).getSheets()[0].appendRow([new Date(), id, name, text, ""]); } function sendText(chatId, text) { const url = `https://api.telegram.org/bot${BOT_TOKEN}/sendMessage`; const payload = { method: "post", contentType: "application/json", payload: JSON.stringify({ chat_id: chatId, text: text }) }; UrlFetchApp.fetch(url, payload); } function handleSheetReply(e) { if (e.range.getColumn() !== 5 || e.value === "") return; const sheet = e.source.getActiveSheet(); const row = e.range.getRow(); const chatId = sheet.getRange(row, 2).getValue(); const replyText = e.value; sendText(chatId, replyText); sheet.getRange(row, 5).clearContent(); sheet.getRange(row, 6).setValue("已发送"); }
最后要注意的点
- 确保你的Google Apps Script项目已经部署为Web App,并且Telegram机器人的Webhook已经指向这个Web App的URL(可以用
setWebhook接口设置) - 第一次运行触发器或
sendText函数时,需要授权脚本的权限,按照提示完成即可 - 如果遇到权限问题,检查Web App的部署设置是否选择了「任何人,甚至匿名」访问(因为Telegram的Webhook请求是匿名的)
内容的提问来源于stack exchange,提问作者Timvlpn
相关产品推荐
相关产品推荐

