为何Discord拒绝我的JSON数据?谷歌表单Webhook提交失败排查
问题分析与修复
核心错误点
- 请求头参数拼写错误:
UrlFetchApp.fetch的配置选项中,请求头的正确键名是headers(复数),你写的header(单数)会被系统忽略,导致Discord无法识别请求的JSON格式,进而判定消息为空。 - 模板对象浅拷贝导致的污染:
let newMessage = messageTemplate是引用赋值,修改newMessage的内容会直接改变原messageTemplate对象,后续提交时模板状态会异常。
修正后的代码
const messageTemplate = { "content": "Test", "embeds": [{ "color": 10751, "fields": [ { "name": "Question 1", "value": "Option 1" }, { "name": "Question 2", "value": "Test" } ] }] } function onFormSubmission(e) { const formResponse = e.response; const questionResponses = formResponse.getItemResponses(); // 深拷贝模板,避免污染原对象 const newMessage = JSON.parse(JSON.stringify(messageTemplate)); // 清空原有fields,适配表单问题数量变化 newMessage.embeds[0].fields = []; for (let i = 0; i < questionResponses.length; i++) { const questionResponse = questionResponses[i]; const fieldName = questionResponse.getItem().getTitle(); const fieldValue = questionResponse.getResponse(); newMessage.embeds[0].fields.push({ "name": fieldName, "value": fieldValue }); } const requestPayload = JSON.stringify(newMessage); const requestOptions = { // 修正为headers复数形式 headers: { 'Content-Type': 'application/json', }, method: 'POST', payload: requestPayload, muteHttpExceptions: true, }; const response = UrlFetchApp.fetch(webHookURL, requestOptions); Logger.log("POSTed"); Logger.log(response.getContentText()); Logger.log(requestOptions.payload); }
额外优化说明
- 用
JSON.parse(JSON.stringify(messageTemplate))实现深拷贝,确保每次提交都使用初始状态的干净模板。 - 提前清空
fields数组再通过push添加新字段,避免表单问题数量与模板原有字段数量不匹配时,出现残留字段或索引越界问题。 - 变量名改用小驼峰命名,符合JS代码规范,提升可读性。
内容的提问来源于stack exchange,提问作者AllowSleep
相关产品推荐
相关产品推荐

