使用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
相关产品推荐
相关产品推荐

