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

Zapier Code by Zapier处理Shopify订阅捆绑订单时商品数量统计异常

Zapier Code by Zapier处理Shopify订阅捆绑订单时商品数量统计异常

看起来你遇到了Zapier处理Shopify订阅捆绑订单时的数量统计坑——测试时一切正常,但真实订单里除了捆绑包本身,其他商品数量全是0,这确实挺闹心的。我帮你捋捋代码里的问题,以及怎么修复。

问题根源分析

仔细看了你的代码和场景,推测问题出在这几个地方:

  • 输入数据结构不匹配:测试时你构造的meal_name和meal_qty是符合预期的数组/逗号分隔字符串,但真实订单中,AWTOMIC生成的捆绑子商品可能没有通过这两个字段传递,导致names和qtys数组为空,自然无法统计数量。
  • Bundle Items的检测逻辑有局限:当前代码是遍历inputData的所有key来找捆绑商品,但真实订单里的子商品可能不是以这种key形式存在,而是嵌套在Shopify的Line Items的子属性里(比如properties字段)。
  • 字符串拆分的容错性不足:如果真实订单里的meal_name或meal_qty格式不是逗号分隔,拆分后就会得到空数组,直接跳过统计。

修复方案

针对这些问题,我们调整代码,优先从Shopify原生的Line Items数据里提取信息,同时兼容原有的测试逻辑。修改后的代码如下:

/* UPDATED VERSION - 优先从Shopify Line Items提取数据,兼容测试和真实订单 */
//////////////////// 1. master list - Updated with actual Shopify names ////////////////////
const meals = {
    "Peanut Butter Power Balls": 0,
    "Regular Protein - Meal Plan": 0,
    "Overnight Oats": 0,
    "Protein Donuts ( 2 pack )": 0,
    "Chocolate Strawberry Protein Pancakes": 0,
    "Crave Breakfast Sandwich (Gluten Free)": 0,
    "BBQ Chicken Mac N' Cheese": 0,
    "French Onion Chicken - (Gluten Free)": 0,
    "Chipotle Chicken (Gluten Free)": 0,
    "Crave Fil A (Gluten Free)": 0,
    "Turkey Bolognese": 0,
    "Fiesta Turkey Bowl (Gluten Free)": 0,
    "Sweet Chili Turkey Bowl (Gluten Free)": 0,
    "Adobo Braised Beef Bowl - (Gluten Free)": 0,
    "Beef Empanada": 0,
    "Sesame Ginger Beef": 0,
    "Big Mac Bowl (Gluten free)": 0,
    "Asian Crunch Salad": 0,
    "Strawberry Walnut Chicken Salad (GF)": 0,
    "Mediterranean Chicken Hummus Wrap": 0,
    "Grilled Chicken Chimichurri Bowl (GF) (DF) (SF)": 0,
    "Grilled Chicken Caesar Wrap": 0,
    "Beef & Broccoli (GF) (DF) (SF)": 0,
    "Steak & Eggs (GF) (DF) (SF)": 0,
    "Pulled Chicken (GF) (DF) (SF)": 0,
    "Turkey Burger (GF) (DF) (SF)": 0,
    "Grilled Chicken (GF) (DF) (SF)": 0,
    "Chili Lime Turkey (GF) (DF) (SF)": 0
};

//////////////////// 2. 从Shopify Line Items提取所有商品信息 ////////////////////
// 先获取原始的Line Items数据(Zapier里Shopify的New Paid Order会输出line_items数组)
const lineItems = Array.isArray(inputData.line_items) ? inputData.line_items : [];

const unknown = [];

// 遍历每个Line Item
for (const item of lineItems) {
    // 处理主商品(包括捆绑包)
    let title = (item.title || "").trim();
    // 去除末尾的"- Regular"/"- Double"后缀
    title = title.replace(/\s*-\s*(regular|double)$/i, "").trim();
    const qty = parseInt(item.quantity || "0", 10);

    if (meals.hasOwnProperty(title)) {
        meals[title] += qty;
    } else {
        // 如果是捆绑包,检查其包含的子商品(AWTOMIC通常会把子商品放在properties里)
        const properties = item.properties || [];
        for (const prop of properties) {
            // 假设子商品的属性名包含数量+名称,比如"1x Peanut Butter Power Balls",可根据实际调整
            if (prop.name && prop.value) {
                let subTitle = prop.value.trim();
                subTitle = subTitle.replace(/\s*-\s*(regular|double)$/i, "").trim();
                // 从属性名提取数量,比如"1x 餐品"里的1
                const subQty = parseInt(prop.name.match(/\d+/)?.[0] || "1", 10);

                if (meals.hasOwnProperty(subTitle)) {
                    meals[subTitle] += subQty;
                } else {
                    unknown.push(subTitle);
                }
            }
        }
        // 把未匹配到的主捆绑包名称加入unknown
        unknown.push(title);
    }
}

//////////////////// 3. 兼容原有的meal_name/meal_qty输入(用于测试) ////////////////////
// 保留原有逻辑,确保测试时依然可用
const names = Array.isArray(inputData.meal_name) ? inputData.meal_name : (inputData.meal_name || "").split(/\s*,\s*/).filter(Boolean);
const qtys = Array.isArray(inputData.meal_qty) ? inputData.meal_qty : (inputData.meal_qty || "").split(/\s*,\s*/).filter(Boolean);

for (let i = 0; i < names.length; i++) {
    let title = (names[i] || "").trim();
    title = title.replace(/\s*-\s*(regular|double)$/i, "").trim();
    const qty = parseInt(qtys[i] || "0", 10);
    if (meals.hasOwnProperty(title)) {
        meals[title] += qty;
    } else {
        unknown.push(title);
    }
}

//////////////////// 4. return the row ////////////////////
return {
    name: inputData.billing_name || "",
    phone: inputData.billing_phone || "",
    email: inputData.email || "",
    unknown_titles: [...new Set(unknown)], // 去重避免重复条目
    ...meals
};

关键调整点说明

  1. 优先读取Shopify原生line_items数组:真实订单里的所有商品(包括捆绑包的子商品)都会在这个数组里,比依赖meal_name/meal_qty更可靠。
  2. 处理捆绑包的子商品:AWTOMIC通常会把捆绑内的子商品放在Line Item的properties字段里,我们遍历这个字段提取子商品名称和数量。如果你的属性格式不同,可以微调正则表达式适配。
  3. 兼容测试场景:保留了原有的meal_name/meal_qty处理逻辑,确保测试时依然能正常工作。
  4. Unknown列表去重:避免重复添加同一个未知商品名称,让结果更清晰。

验证步骤

  1. 把修改后的代码替换到Zapier的Code by Zapier步骤里。
  2. 找一个之前出现问题的真实订单,用Zapier的“Test with live data”功能重新测试。
  3. 检查Google Sheets里的行,确认所有商品数量都正确统计。

如果还是有问题,建议你在Code步骤里添加日志输出(比如console.log(lineItems)),看看真实订单里的line_items和properties结构是什么样的,再针对性调整子商品的提取逻辑。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.07 10:13:02