在Google Apps Script中从解析后的JSON对象检索指定元素
解决Google Apps Script Webhook无法提取指定JSON字段的问题
问题描述
我有一个绑定到谷歌表格并发布为Web应用的Google Apps Script,它作为Webhook收集数据。目前脚本可将时间戳存入第1列、完整数据包存入第3列,但无法从解析后的JSON对象中检索指定元素。
解析后的对象结构(Logger输出格式)如下:
{processing={acquirer_reference_number=24022122407531018095, acquirer_transaction_id=57631018089}, id=pay_n4m745lnx7uy2tmgx4z26mksi, action_id=act_qqno6t6jctdkzbuk2fu3js71e, response_summary=Approved, metadata={is_supplementary=True, ps_id=9, token=tok_war7hee5nole7d21bknt45dm, transaction=7125, hash=84c478fdfbdb2515d46542adbd6ggd516dc0048fd67, order_id=83245142, sandbox=0}, amount=271.0, processed_on=2022-09-21T13:35:32Z, response_code=10000, currency=USD, reference=2694931}
需要检索以下三个元素并分别存入表格第4、5、6列(元素顺序随机,无法依赖索引):
- amount(值:271.0)
- reference(值:2694931)
- is_supplementary(值:True)
尝试过点表示法和方括号表示法均无效,寻求解决方法。
解决方案
1. 确保正确解析Webhook请求体
首先要确认你是正确接收并解析了Webhook的JSON数据。如果Webhook发送的是标准JSON格式,需要先获取请求体并解析为JavaScript对象:
function doPost(e) { // 解析请求体为JSON对象 const payload = JSON.parse(e.postData.contents); const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); // 获取当前时间戳 const timestamp = new Date(); // 提取目标字段 const amount = payload.amount; const reference = payload.reference; const isSupplementary = payload.metadata.is_supplementary; // 准备要写入的行数据 const rowData = [ timestamp, // 第1列:时间戳 '', // 第2列:留空(根据你的需求调整) JSON.stringify(payload), // 第3列:完整数据包(转为字符串存储) amount, // 第4列:amount reference, // 第5列:reference isSupplementary // 第6列:is_supplementary ]; // 将数据追加到表格末尾 sheet.appendRow(rowData); // 返回Webhook响应(根据需求调整) return ContentService.createTextOutput(JSON.stringify({status: 'success'})).setMimeType(ContentService.MimeType.JSON); }
2. 排查常见问题
- 请求体格式问题:如果Webhook发送的不是
application/json格式,e.postData.contents可能不是标准JSON字符串。可以先打印e.postData.type确认格式,若为application/x-www-form-urlencoded,则需要用e.parameter获取参数。 - 字段不存在的容错处理:如果某些字段可能缺失,建议添加判断避免脚本报错:
const amount = payload.amount || 'N/A'; const reference = payload.reference || 'N/A'; const isSupplementary = payload.metadata?.is_supplementary || false; // 使用可选链操作符处理metadata可能不存在的情况 - Logger输出的格式误导:你提供的是Google Apps Script Logger输出的对象格式,并非标准JSON。实际解析后的对象可以直接通过点表示法访问嵌套字段,比如
payload.metadata.is_supplementary是完全有效的。
3. 验证字段访问
可以在脚本中添加日志验证字段是否正确提取:
Logger.log('Amount: ' + amount); Logger.log('Reference: ' + reference); Logger.log('Is Supplementary: ' + isSupplementary);
执行后查看日志确认字段值是否正确。
内容的提问来源于stack exchange,提问作者RustyTones
相关产品推荐
相关产品推荐

