Google Chat Apps Script应用点击卡片按钮偶现请求处理失败错误
问题分析与解决方案
核心原因
Google Chat对Apps Script的同步响应存在严格超时限制(通常在10-30秒区间,受Apps Script冷启动、资源调度影响)。当按钮触发的处理函数执行时间接近或超过该阈值时,Chat会直接判定响应失败,显示“无法处理您的请求”——即便脚本后续能完成任务,同步响应的窗口也已关闭,无法将结果返回至聊天界面。
你日志中的错误也对应了这个核心问题:
code: 3:Chat未收到有效响应或响应超时code: 9:超时导致函数执行中断,或是按钮配置的处理函数名与实际定义不匹配(你的示例代码中按钮action.function写的是test,但实际处理函数是onCardClick,这也是触发该错误的直接原因)code: 13:Chat内部处理超时响应时的异常
解决方案:改用异步响应模式
放弃同步返回结果的方式,改为先返回即时确认,再通过Chat API异步更新消息,彻底规避超时问题。
步骤1:修正函数名匹配问题
先修正按钮的action.function,确保和实际处理函数名一致:
// onMessage函数中的按钮配置修改为: "onClick": { "action": { "function": "onCardClick" // 和你的处理函数名保持一致 } }
步骤2:修改处理函数为异步模式
使用Chat API先发送临时提示,待任务完成后更新消息内容:
function onCardClick(event) { // 提取聊天上下文信息 const messageId = event.message.name; const tempPayload = { text: "正在处理,请稍候..." }; // 先更新原消息为临时提示 updateChatMessage(messageId, tempPayload); // 异步执行耗时任务(避免阻塞同步响应) setTimeout(() => { Utilities.sleep(5000); // 模拟你的耗时任务 const finalPayload = { text: "This is a test Text" }; // 任务完成后更新消息为最终结果 updateChatMessage(messageId, finalPayload); }, 100); // 立即返回空响应,避免Chat判定超时 return { text: "" }; } // 封装Chat API更新消息的函数 function updateChatMessage(messageId, payload) { const apiUrl = `https://chat.googleapis.com/v1/${messageId}`; const options = { method: "PUT", contentType: "application/json", headers: { "Authorization": `Bearer ${ScriptApp.getOAuthToken()}` }, payload: JSON.stringify(payload) }; UrlFetchApp.fetch(apiUrl, options); }
步骤3:配置OAuth权限
修改appsScript.json,添加必要的API权限:
{ "timeZone": "Europe/Lisbon", "exceptionLogging": "STACKDRIVER", "runtimeVersion": "V8", "chat": {}, "oauthScopes": [ "https://www.googleapis.com/auth/chat.messages", "https://www.googleapis.com/auth/script.external_request" ] }
额外优化建议
- 启用详细日志:在函数关键节点添加
console.log(),记录执行时间点,排查是否存在意外延迟。 - 减少冷启动影响:对于高频使用的应用,设置定时触发器定期唤醒脚本,降低冷启动耗时。
- 拆分长任务:如果任务确实需要长时间执行,拆分为多个小步骤,通过多次更新消息反馈进度。
内容的提问来源于stack exchange,提问作者Pedro Gomes
相关产品推荐
相关产品推荐

