You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Discord拒绝我的JSON数据?谷歌表单Webhook提交失败排查

问题分析与修复

核心错误点

  1. 请求头参数拼写错误:UrlFetchApp.fetch的配置选项中,请求头的正确键名是headers(复数),你写的header(单数)会被系统忽略,导致Discord无法识别请求的JSON格式,进而判定消息为空。
  2. 模板对象浅拷贝导致的污染: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 10:45:47