如何修复Google Chat推送时的Invalid JSON payload错误
问题解决:Google Form推送Google Chat报400错误
错误原因
报错提示Unknown name "content",说明你构建的卡片JSON结构不符合Google Chat Webhook的API规范,大概率是未提供的buildCard函数在组装widgets时出现了结构错误,或是某个表单响应的格式(比如多选的数组)未正确处理。
修正方案
1. 补全符合规范的buildCard函数
替换或添加正确的buildCard函数,确保卡片结构完全匹配Google Chat的要求:
function buildCard(title, emailRespondent, widgets, formUrl) { return { "cardsV2": [ { "cardId": "form-response-card", "card": { "header": { "title": title, "subtitle": "提交者邮箱:" + (emailRespondent || "未提供") }, "sections": [ { "widgets": widgets }, { "widgets": [ { "buttonList": { "buttons": [ { "text": "查看表单响应", "onClick": { "openLink": { "url": formUrl } } } ] } } ] } ] } } ] }; }
2. 处理表单响应的数组格式
如果表单包含多选类问题,item.getResponse()会返回数组,直接传入keyValue的content会导致JSON格式异常,需要将数组转为字符串:
修改循环中的widgets构建代码:
for(var i = 0; i < items.length; i++) { var item = items[i]; var response = item.getResponse(); // 处理数组类型的响应(如多选) var displayResponse = Array.isArray(response) ? response.join("\n") : response; widgets.push({ "keyValue": { "topLabel": item.getItem().getTitle(), "content": displayResponse, "contentMultiline": true } }); }
3. 调试建议
如果仍报错,添加muteHttpExceptions: true获取完整错误信息,方便定位:
var options = { method : "post", contentType : "application/json; charset=UTF-8", payload : JSON.stringify(card), muteHttpExceptions: true // 添加这行 }; var response = UrlFetchApp.fetch(URL_WEBHOOK, options); Logger.log(response.getContentText()); // 查看完整错误日志
完整修正后的脚本
function pushToHangoutsChat(e) { var URL_WEBHOOK = "webhookurlgoeshere"; var form = e.source; var emailRespondent = e.response.getRespondentEmail(); var title = form.getTitle(); var formUrl = form.getSummaryUrl().replace("viewanalytics","edit#responses") var items = e.response.getItemResponses(); var widgets = []; for(var i = 0; i < items.length; i++) { var item = items[i]; var response = item.getResponse(); var displayResponse = Array.isArray(response) ? response.join("\n") : response; widgets.push({ "keyValue": { "topLabel": item.getItem().getTitle(), "content": displayResponse, "contentMultiline": true } }); } var card = buildCard(title, emailRespondent, widgets, formUrl); var options = { method : "post", contentType : "application/json; charset=UTF-8", payload : JSON.stringify(card), muteHttpExceptions: true }; var response = UrlFetchApp.fetch(URL_WEBHOOK, options); Logger.log(response.getContentText()); } function buildCard(title, emailRespondent, widgets, formUrl) { return { "cardsV2": [ { "cardId": "form-response-card", "card": { "header": { "title": title, "subtitle": "提交者邮箱:" + (emailRespondent || "未提供") }, "sections": [ { "widgets": widgets }, { "widgets": [ { "buttonList": { "buttons": [ { "text": "查看表单响应", "onClick": { "openLink": { "url": formUrl } } } ] } } ] } ] } } ] }; }
内容的提问来源于stack exchange,提问作者Scott Stevenson
相关产品推荐
相关产品推荐

