使用Google Apps Script从API获取父子GTIN层级关系
问题:根据GTIN获取嵌套JSON中的父级GTIN
我使用Google Apps Script处理包含嵌套父子结构的JSON数组(示例为logisticalHierarchies),需要输入一个GTIN参数,返回对应的父级GTIN(例如输入05449000283856,预期得到05449000283863)。但当前脚本仅能获取列表中的第一个父级GTIN,需要解决这个问题。
JSON示例结构
"logisticalHierarchies": [ { "product_key_id": 48232671, "gtin": "05449000696878", "lastRequest": null, "productIdentifier": null, "children": [ { "product_key_id": 48232673, "gtin": "05449000283863", "quantity": 130, "productIdentifier": null, "children": [ { "product_key_id": 48232457, "gtin": "05449000283856", "quantity": 4, "productIdentifier": null, "children": [ { "product_key_id": 48232675, "gtin": "05449000214843", "quantity": 6, "productIdentifier": null, "children": [], "contentOwner_id": 10525, "isMainHierarchyUnit": false } ] } ] } ] } ]
现有脚本代码
var url='https://apis.alkemics.com/public/v1/products?'+params; //Logger.log(url); var content =UrlFetchApp.fetch(url, options); //Logger.log(content); //Logger.log(content.getResponseCode()) if (content.getResponseCode() ==200) { var return =JSON.parse(content.getContentText()); next_page=back.next_page; var data=return.data; for(i=0; i<data.length;i++) { var product=data[i]; // A product in JSON format var childrens = data.map(({logisticalHierarchies}) => logisticalHierarchies.map(o => [o.children?.gtin || ""])); Logger.log(childrens) var line=[ product.gtin, product.logisticalHierarchies[0] != null? product.logisticalHierarchies[0].children[0].gtin: ' ', ]; }
解决方案
要解决这个问题,需要递归遍历嵌套的children结构,因为层级不确定,递归能确保遍历到所有可能的节点。以下是修改后的完整代码:
1. 递归查找父级GTIN的函数
// 递归遍历节点,查找目标GTIN对应的父级GTIN function findParentGtin(node, targetGtin, parentGtin = null) { // 当前节点匹配目标GTIN,返回父级GTIN if (node.gtin === targetGtin) { return parentGtin; } // 存在子节点时,遍历每个子节点继续查找 if (node.children && node.children.length > 0) { for (const child of node.children) { const result = findParentGtin(child, targetGtin, node.gtin); // 找到结果立即返回,终止递归 if (result !== null) { return result; } } } // 未找到匹配节点,返回null return null; }
2. 修改后的主脚本
var url = 'https://apis.alkemics.com/public/v1/products?' + params; var content = UrlFetchApp.fetch(url, options); if (content.getResponseCode() === 200) { // 修正原代码关键字冲突问题:将var return改为returnData var returnData = JSON.parse(content.getContentText()); next_page = returnData.next_page; // 修正原代码的back变量为returnData var data = returnData.data; // 替换为你需要查询的目标GTIN const targetGtin = "05449000283856"; let parentGtin = null; // 遍历所有产品的logisticalHierarchies for (let i = 0; i < data.length; i++) { const product = data[i]; if (product.logisticalHierarchies && product.logisticalHierarchies.length > 0) { // 遍历每个层级节点 for (const hierarchy of product.logisticalHierarchies) { parentGtin = findParentGtin(hierarchy, targetGtin); // 找到结果后终止遍历 if (parentGtin !== null) { break; } } if (parentGtin !== null) { break; } } } // 输出结果到日志 Logger.log(`目标GTIN ${targetGtin} 的父级GTIN:${parentGtin || '未找到匹配项'}`); }
关键修正点
- 原代码中
var return是JavaScript关键字,会导致语法错误,已改为returnData - 原代码仅取第一个层级的第一个子节点,递归函数会遍历所有嵌套层级,确保找到正确的父级
- 找到目标后立即终止遍历,提升执行效率
内容的提问来源于stack exchange,提问作者user19870352
相关产品推荐
相关产品推荐

