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

Google Script调用CRM接口解析JSON写表格异常及子实体获取问题

解决Google Script调用CRM接口的问题:部分接口无数据+获取子实体

一、先排查接口返回的JSON结构差异

你碰到的这种“部分接口能拿title,另一部分拿不到body”的问题,我之前帮很多开发者排查过,大概率是不同接口返回的JSON字段结构不一致。举两个常见的差异场景:

  • 能正常工作的接口,title可能是顶层直接返回的字段:{ "title": "xxx", ... }
  • 无法获取数据的接口,body可能嵌套在子对象里(比如{ "content": { "body": "xxx" }, ... }),或者字段名大小写和你写的不一致(比如接口返回的是Body而非body)

快速调试方法

在脚本里加入日志打印,把接口返回的完整JSON结构输出来,对比能工作和不能工作的接口差异:

function fetchCRMData() {
  const targetUrl = "你的CRM接口URL";
  const response = UrlFetchApp.fetch(targetUrl);
  const data = JSON.parse(response.getContentText());
  
  // 打印格式化后的完整JSON,方便查看结构
  Logger.log(JSON.stringify(data, null, 2));
  
  // 优化后的写入逻辑:先判断字段是否存在再处理
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  if (data.body) {
    sheet.appendRow([data.body]);
  } else if (data.content?.body) { // 兼容嵌套结构的情况
    sheet.appendRow([data.content.body]);
  } else {
    sheet.appendRow(["未获取到body字段"]);
  }
}

运行后,去脚本编辑器的「查看」→「日志」里查看完整的JSON结构,就能一眼看出body字段的实际位置了。

二、获取子实体数据(比如From中的ID)

同样要先确认子实体的结构,接口返回通常有两种情况,对应不同的获取方式:

情况1:From是单个对象

如果接口返回是这种结构:

{
  "title": "客户反馈",
  "from": {
    "id": "CRM-12345",
    "name": "Robert"
  }
}

获取From的ID可以这么写:

// 用可选链操作符?.避免子对象为空时报错
const fromId = data.from?.id;
sheet.appendRow([data.title, fromId]);

情况2:From是数组(支持多个发送方)

如果接口返回是数组结构:

{
  "title": "团队协作任务",
  "from": [
    { "id": "CRM-12345", "name": "Robert" },
    { "id": "CRM-67890", "name": "Alice" }
  ]
}

可以获取第一个From的ID,或者遍历所有子实体写入多行:

// 获取第一个From的ID
const firstFromId = data.from?.[0]?.id;
sheet.appendRow([data.title, firstFromId]);

// 遍历所有From,逐条写入表格
data.from?.forEach(item => {
  sheet.appendRow([data.title, item.id, item.name]);
});

三、通用优化建议

  • 添加错误捕获:用try-catch包裹接口调用逻辑,避免单个接口失败导致整个脚本崩溃:
function fetchCRMData() {
  try {
    const targetUrl = "你的CRM接口URL";
    const response = UrlFetchApp.fetch(targetUrl);
    const data = JSON.parse(response.getContentText());
    
    // 你的数据处理和写入逻辑...
    
  } catch (error) {
    Logger.log("接口调用失败:" + error.message);
    const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
    sheet.appendRow(["接口调用失败:" + error.message]);
  }
}
  • 始终判断字段存在性:不管是顶层字段还是子实体字段,用?.可选链或者if判断后再使用,避免因字段缺失导致的脚本报错。

内容的提问来源于stack exchange,提问作者Robert William Millard

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:33:47