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

通过Google Apps Script调用REST API获取WooCommerce订单元数据键值

问题诊断

原来的代码存在三处核心错误导致无法正确提取meta_data:

  1. 多余的无效内层循环:代码中o = params[i]["key"].length属于完全错误的取值,订单对象本身不存在key属性,内层循环毫无意义
  2. 取值路径错误:WooCommerce返回的meta_data每一项是独立的{key: xxx, value: xxx}结构,不需要遍历key的下标,直接匹配key后取对应value即可
  3. 未处理嵌套结构的seguimiento字段:该字段的value是JSON格式字符串,需要先解析才能提取内部的transportista/codigo/fecha三个属性
修正后的完整代码
function start_syncv2() {
    var sheet_name = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Pedidos2');
    fetch_orders(sheet_name)
}

function fetch_orders(sheet_name) {
    var ajustesSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Ajustes');
    var ck = ajustesSheet.getRange("C10").getValue();
    var cs = ajustesSheet.getRange("C11").getValue();
    var website = ajustesSheet.getRange("C9").getValue();
    var manualDate = ajustesSheet.getRange("C12").getValue(); 
    var m = new Date(manualDate).toISOString();
    var surl = website + "/wp-json/wc/v2/orders?consumer_key=" + ck + "&consumer_secret=" + cs + "&after=" + m + "&per_page=100"; 

    var options = {
        "method": "GET",
        "Content-Type": "application/x-www-form-urlencoded;charset=UTF-8",
        "muteHttpExceptions": true,
    };

    var result = UrlFetchApp.fetch(surl, options);
    // 请求失败直接终止执行
    if (result.getResponseCode() != 200) {
        Logger.log("请求失败,错误码:" + result.getResponseCode());
        return;
    }
    var params = JSON.parse(result.getContentText());
    var temp = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheet_name);
    var arrayLength = params.length;

    for (var i = 0; i < arrayLength; i++) {
        var container = [];
        // 初始化所有要提取的变量
        var numFactura = "";
        var fechaFactura = "";
        var fechaEnvio = "";
        var mensajeria = "";
        var numSeguimiento = "";
        var seg_transportista = "";
        var seg_codigo = "";
        var seg_fecha = "";

        var metaList = params[i]["meta_data"];
        // 遍历meta_data匹配目标字段
        for (var h = 0; h < metaList.length; h++) {
            var currentKey = metaList[h]["key"];
            var currentValue = metaList[h]["value"];
            switch(currentKey) {
                case "_wcpdf_invoice_number":
                    numFactura = currentValue;
                    break;
                case "_wcpdf_invoice_date_formatted":
                    fechaFactura = currentValue;
                    break;
                case "_wccf_of_fecha_envio":
                    fechaEnvio = currentValue;
                    break;
                case "_wccf_of_empresa_mensajeria":
                    mensajeria = currentValue;
                    break;
                case "_wccf_of_numseguimiento_pedido":
                    numSeguimiento = currentValue;
                    break;
                case "seguimiento":
                    // 解析seguimiento的JSON结构
                    if(currentValue) {
                        try {
                            var segObj = JSON.parse(currentValue);
                            seg_transportista = segObj.transportista || "";
                            seg_codigo = segObj.codigo || "";
                            seg_fecha = segObj.fecha || "";
                        } catch(e) {
                            Logger.log("seguimiento字段解析失败:" + e.toString());
                        }
                    }
                    break;
            }                   
        }

        // 按顺序把字段加入数组
        container.push(numFactura);
        container.push(fechaFactura);
        container.push(fechaEnvio);
        container.push(mensajeria);
        container.push(numSeguimiento);
        container.push(seg_transportista);
        container.push(seg_codigo);
        container.push(seg_fecha);
        container.push(params[i]["number"]); // Nº Pedido
        container.push(params[i]["date_created"]);  // Fecha pedido
        container.push(params[i]["status"]); // Estado del pedido
        container.push(params[i]["billing"]["first_name"] + " " + params[i]["billing"]["last_name"]);  // 客户姓名
        container.push(params[i]["billing"]["email"]);  // 邮箱
        container.push(params[i]["subtotal"]); // 小计

        temp.appendRow(container);
    }
    // 全量同步完成后再去重,避免循环内重复执行浪费性能
    removeDuplicates(sheet_name);
}
修改说明
  • 移除了无效的内层循环,改用switch直接匹配meta_data的key值,逻辑更清晰,执行效率更高
  • 新增了seguimiento字段的解析逻辑,增加了异常捕获避免字段格式错误导致脚本中断
  • 调整了去重逻辑的位置,从循环内移到循环结束后,大幅提升大批量订单同步时的运行速度
  • 新增了请求失败的判断逻辑,避免接口报错时脚本抛出未捕获异常

内容的提问来源于stack exchange,提问作者Nerea

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 15:36:02