You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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:安装触发器

  1. 打开Google Apps Script编辑器
  2. 点击左侧「触发器」图标(时钟形状)
  3. 点击「添加触发器」
  4. 设置:
    • 选择要运行的函数: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:24:02