通过Google Apps Script调用REST API获取WooCommerce订单元数据键值
问题诊断
原来的代码存在三处核心错误导致无法正确提取meta_data:
- 多余的无效内层循环:代码中
o = params[i]["key"].length属于完全错误的取值,订单对象本身不存在key属性,内层循环毫无意义 - 取值路径错误:WooCommerce返回的meta_data每一项是独立的
{key: xxx, value: xxx}结构,不需要遍历key的下标,直接匹配key后取对应value即可 - 未处理嵌套结构的
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
相关产品推荐
相关产品推荐

