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 };
关键调整点说明
- 优先读取Shopify原生
line_items数组:真实订单里的所有商品(包括捆绑包的子商品)都会在这个数组里,比依赖meal_name/meal_qty更可靠。 - 处理捆绑包的子商品:AWTOMIC通常会把捆绑内的子商品放在Line Item的
properties字段里,我们遍历这个字段提取子商品名称和数量。如果你的属性格式不同,可以微调正则表达式适配。 - 兼容测试场景:保留了原有的
meal_name/meal_qty处理逻辑,确保测试时依然能正常工作。 - Unknown列表去重:避免重复添加同一个未知商品名称,让结果更清晰。
验证步骤
- 把修改后的代码替换到Zapier的Code by Zapier步骤里。
- 找一个之前出现问题的真实订单,用Zapier的“Test with live data”功能重新测试。
- 检查Google Sheets里的行,确认所有商品数量都正确统计。
如果还是有问题,建议你在Code步骤里添加日志输出(比如console.log(lineItems)),看看真实订单里的line_items和properties结构是什么样的,再针对性调整子商品的提取逻辑。
内容来源于stack exchange
相关产品推荐
相关产品推荐

