GAS开发Telegram Bot doPost报postData未定义错误修复
报错原因
Cannot read property 'postData' of undefined 是Google Apps Script Web开发的常见问题,触发逻辑非常明确:
- 直接在脚本编辑器手动运行
doPost函数时,平台不会传入HTTP请求对应的事件对象,形参search为undefined,读取属性直接报错 - Web应用部署权限配置错误时,Telegram的webhook请求无法被正常处理,也会出现事件对象为空的情况
另外原代码还存在三个隐藏bug:
- 没有判断非文本消息场景,用户发送贴纸、图片、群通知等无
text字段的消息时,会触发二次报错 sendText的replymarkup是可选参数,不传时JSON.stringify(undefined)会导致接口请求异常doPost没有返回合法HTTP响应,Telegram会重复推送同一条消息
修复步骤
1. 替换原有doPost代码
增加空值兜底、字段合法性校验,补全响应返回:
function doPost(search) { // 非法请求直接返回 if (!search || !search.postData) return ContentService.createTextOutput("ok"); const updates = JSON.parse(search.postData.getDataAsString()); // 仅处理带文本的普通消息 if (updates.message && updates.message.text) { const searchResult = SearchIDSheet(updates.message.text); sendText(updates.message.chat.id, searchResult); } // 返回200响应告知Telegram已收到消息,避免重复推送 return ContentService.createTextOutput(JSON.stringify({code:0})); }
2. 替换原有sendText代码
补全可选参数兜底:
function sendText(chatid, text, replymarkup) { const requestData = { method: "post", payload: { method: "sendMessage", chat_id: String(chatid), text: text, parse_mode: "HTML", reply_markup: JSON.stringify(replymarkup || {}) } }; UrlFetchApp.fetch('https://api.telegram.org/bot' + BotToken + '/', requestData); }
3. 正确部署Web应用
重新部署时按以下选项选择,否则webhook无法正常工作:
- 执行身份:选择你自己的账号
- 访问权限:选择「任何人(包括匿名用户)」
部署完成后将生成的Webhook URL配置到Telegram机器人即可,不要手动在编辑器里运行doPost函数——该函数仅能被HTTP请求触发,手动运行不会传入事件对象,必然报错。
如果需要调试逻辑,单独写测试函数模拟事件对象即可:
// 调试专用,正式上线可删除 function test() { const mockEvent = { postData: { getDataAsString: () => JSON.stringify({ message: { chat: {id: 替换为你自己的Telegram chatID}, text: "测试搜索关键词" } }) } }; doPost(mockEvent); }
内容的提问来源于stack exchange,提问作者rodskies
相关产品推荐
相关产品推荐

