如何将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
相关产品推荐
相关产品推荐

