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

如何将Telegram Bot内联按钮与Google Sheet对应单元格关联绑定

实现方案

核心逻辑是给内联按钮的callback_data绑定唯一标识(案件编号+对应工作表名),点击后回调携带该标识匹配对应行写入数据。

步骤1:调整内联按钮的callback_data构造

你代码中发送消息时传入的accepted为内联键盘配置,需要修改为每个消息对应唯一的callback值,示例如下:

// 放在sendTelegram函数中if判断内、sendText调用前的位置
// 假设你的案件编号存储在第3列,可替换为你实际的列数
const caseNum = sheet.getRange(row, 3).getValue(); 
// 构造callback数据,格式为 标记前缀|工作表名|案件编号,方便后续解析
const callbackData = `accept|${sheetName}|${caseNum}`;
// 构造内联键盘
const accepted = {
  inline_keyboard: [
    [
      {
        text: "Accepted",
        callback_data: callbackData
      }
    ]
  ]
};

同时修正你原sendTelegram函数的变量顺序问题:你原代码中var ws = sheetName写在了sheetName定义之前,需调整到sheetName赋值之后。

步骤2:修改doPost函数处理回调写入标记

function doPost(e) {
  const contents = JSON.parse(e.postData.contents);
  const SPREADSHEET_ID = "你的表格ID"; // 替换为你实际的表格ID
  // 判断是否为按钮回调事件
  if (contents.callback_query) {
    const callbackQuery = contents.callback_query;
    const callbackData = callbackQuery.data;
    const chatId = callbackQuery.message.chat.id;
    const messageId = callbackQuery.message.message_id;
    const callbackId = callbackQuery.id;

    // 拆分callback数据
    const [action, sheetName, caseNum] = callbackData.split("|");
    if (action === "accept") {
      const spreadsheet = SpreadsheetApp.openById(SPREADSHEET_ID);
      const targetSheet = spreadsheet.getSheetByName(sheetName);
      // 查找案件编号匹配的行,假设案件编号在第3列,替换为你实际的列数
      const caseNumColValues = targetSheet.getRange(2, 3, targetSheet.getLastRow() - 1, 1).getValues();
      for (let i = 0; i < caseNumColValues.length; i++) {
        if (caseNumColValues[i][0] === caseNum) {
          // 匹配到行,第15列写入Accepted,i+2是因为从第2行开始遍历
          targetSheet.getRange(i + 2, 15).setValue("Accepted");
          // 给Telegram回应用户点击,避免按钮一直加载,可自定义提示文本
          answerCallback(callbackId, "已标记为Accepted");
          // 可选:修改原消息移除按钮,提示已处理
          editMessageReplyMarkup(chatId, messageId);
          break;
        }
      }
    }
  }
  // 原有日志逻辑保留
  SpreadsheetApp.openById(SPREADSHEET_ID).getSheetByName("Log").appendRow([contents]);
  return ContentService.createTextOutput(JSON.stringify({status: "ok"})).setMimeType(ContentService.MimeType.JSON);
}

// 新增回调应答函数
function answerCallback(callbackId, text) {
  const data = {
    method: 'post',
    payload: {
      method: 'answerCallbackQuery',
      callback_query_id: callbackId,
      text: text
    }
  };
  UrlFetchApp.fetch('https://api.telegram.org/bot' + token + '/', data);
}

// 可选:新增修改消息键盘函数,处理后移除按钮
function editMessageReplyMarkup(chatId, messageId) {
  const data = {
    method: 'post',
    payload: {
      method: 'editMessageReplyMarkup',
      chat_id: String(chatId),
      message_id: messageId,
      reply_markup: JSON.stringify({inline_keyboard: []})
    }
  };
  UrlFetchApp.fetch('https://api.telegram.org/bot' + token + '/', data);
}

注意事项

  • 替换代码中所有占位的表格ID、token、案件编号所在列数为你实际的配置
  • 每次修改doPost函数后,需要重新部署Web App并选择更新版本,否则修改不会生效
  • 如果你的案件编号是全局唯一的,也可以省略callback_data中的工作表名,遍历所有工作表查找匹配行即可

内容的提问来源于stack exchange,提问作者Brown

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 21:24:00