使用Google Forms Webhook时请求失败的问题排查求助
解决Google Forms提交后Webhook发送报错400的问题
问题分析
报错提示Cannot send an empty message,说明Webhook接收方未识别到有效消息内容——不是你的payload为空,而是payload的结构不符合接收方的格式要求(比如部分Webhook要求必须包含content或text这类特定顶级字段,而你当前直接把问答作为键值对存入payload,对方无法识别)。
解决步骤
1. 获取完整错误详情,明确接收方格式要求
修改代码添加muteHttpExceptions参数,打印完整服务器响应,确认接收方需要的具体格式:
var POST_URL = "my webhook url"; function onSubmit(e) { var itemResponses = e.response.getItemResponses(); // 直接用事件参数里的响应,更高效 var payload = {}; for (var i = 0; i < itemResponses.length; i++) { var question = itemResponses[i].getItem().getTitle(); var answer = itemResponses[i].getResponse(); payload[question] = answer; } var options = { "method": "post", "contentType": "application/json", "payload": JSON.stringify(payload), "muteHttpExceptions": true // 添加该参数以获取完整错误响应 }; var response = UrlFetchApp.fetch(POST_URL, options); Logger.log(response.getContentText()); // 打印完整响应,查看详细错误提示 };
运行后查看编辑器顶部「查看」→「日志」,就能明确接收方需要的具体数据结构。
2. 调整payload结构适配接收方要求
以Discord、Webex这类常见Webhook为例,它们要求消息内容放在content字段中,你可以把所有问答拼接成易读文本后放入该字段:
var POST_URL = "my webhook url"; function onSubmit(e) { var itemResponses = e.response.getItemResponses(); // 拼接所有问答为格式化文本 var messageContent = itemResponses.map(function(item) { return `${item.getItem().getTitle()}: ${item.getResponse()}`; }).join('\n\n'); // 用换行分隔不同问答 // 按照接收方要求构造payload,此处以需要content字段为例 var payload = { content: messageContent }; var options = { "method": "post", "contentType": "application/json", "payload": JSON.stringify(payload) }; UrlFetchApp.fetch(POST_URL, options); };
如果接收方要求其他格式(比如text字段、嵌套结构),根据日志中的错误提示调整payload即可。
3. 代码优化:用事件参数直接获取当前响应
原代码通过form.getResponses()取最后一个响应,在多人同时提交时可能取到错误数据。直接使用onSubmit事件的e.response参数,能准确获取触发本次提交的响应,可靠性更高。
内容的提问来源于stack exchange,提问作者ColorfulYoshi
相关产品推荐
相关产品推荐

