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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 11:54:27