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

使用AppScript自动发送Google Sheets数据到Google Chat报400错排查

Google Apps Script 推送Google Chat报400 INVALID_ARGUMENT问题排查

问题根因

报Invalid JSON payload received. Unexpected token. [object Object]以及后续参数错误,一共三个核心问题:

  • 工具函数误用了Apps Script保留名doGet:doGet/doPost是Apps Script部署Web App时的内置入口函数,作为普通函数手动调用时容易出现上下文异常,导致返回值不符合预期,甚至直接返回对象而非序列化后的字符串。当UrlFetchApp拿到对象类型的payload时,会默认调用对象的toString()方法转成字符串,输出结果就是[object Object],完全不符合JSON格式要求,直接触发解析错误。
  • Google Chat消息接口payload结构不符合要求:Chat的消息API不接受顶层为数组的请求体,必须按照官方要求的结构构造,纯文本消息需要顶层包含text字段,卡片消息需要包含cards/cardsV2字段,直接传入表格数据数组即使JSON格式合法,也会触发参数校验失败。
  • Webhook URL存在拼写错误:你贴的URL最后token段为%2l,%是URL转义前缀,后面必须跟两位十六进制字符(0-9/a-f/A-F),小写l不属于合法十六进制字符,会导致鉴权或路由失败。

修复方案

  • 把数据提取函数从doGet重命名为普通函数名(比如getSheetRecords),避开保留字冲突。
  • 提取表格数据后,按照Chat API要求构造消息体,把表格记录拼成易读的文本内容,包裹在text字段下,再统一做JSON序列化。
  • 重新复制完整的Google Chat Webhook URL,替换掉拼写错误的地址,确保鉴权参数完整正确。
  • 发送请求时确认payload是序列化后的JSON字符串,contentType保持为application/json。

修复后可运行代码

// 提取表格指定范围数据,避开doGet保留名
function getSheetRecords() {
  const ss = SpreadsheetApp.openById("替换成你自己的表格ID");
  const sheet = ss.getSheetByName('sample');
  const lastRow = sheet.getLastRow();
  const lastCol = sheet.getLastColumn();
  // 处理只有表头无数据的边界情况
  if (lastRow < 2) return [];
  const rows = sheet.getRange(2, 1, lastRow - 1, lastCol).getValues();
  const recordList = [];
  for (let i = 0; i < rows.length; i++) {
    const row = rows[i];
    recordList.push({
      Id: row[0],
      Name: row[1]
    });
  }
  return recordList;
}

function sendDataToChat() {
  // 替换成你重新复制的正确Webhook地址
  const webhookUrl = "https://chat.googleapis.com/v1/spaces/替换成你的空间ID/messages?key=替换成你的key&token=替换成正确的token";
  const records = getSheetRecords();
  // 把记录拼成易读的文本格式
  let textContent = "📊 每日表格数据同步:\n";
  if (records.length === 0) {
    textContent += "今日无新增数据";
  } else {
    records.forEach((item, index) => {
      textContent += `${index+1}. ID: ${item.Id},名称: ${item.Name}\n`;
    });
  }
  // 按照Chat API要求构造payload
  const payload = JSON.stringify({
    text: textContent
  });
  const options = {
    muteHttpExceptions: true,
    method: 'POST',
    contentType: 'application/json',
    payload: payload
  };
  const response = UrlFetchApp.fetch(webhookUrl, options);
  Logger.log(response.getContentText());
}

额外说明

  • 如果需要发送更美观的卡片消息,可以把payload里的text字段替换为cardsV2字段,按照卡片语法构造内容即可。
  • 配置每日自动发送时,只需要在Apps Script编辑器左侧的「触发器」菜单里,给sendDataToChat函数设置每日指定时间运行的时间驱动触发器即可,不需要部署Web App。

内容的提问来源于stack exchange,提问作者Milind Mishra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 18:54:22