如何在产品 Feed 中计算自定义列(无需修改目录)
在 easySales 的 Dynamic feed 中构建计算列——最低价、第二货币价格、可用库存——使用一个特性、一个列和一个 Feed 规则公式。你的产品目录保持不变。
每个运行 Dynamic feed 的商家迟早都会撞上同一道墙:合作伙伴想要一个产品上不存在的列。一个重新定价的合作伙伴想要 min_price 作为底价。一个 B2B 分销商想要 eur_price 与本地货币并存。一个 3PL 想要 available_stock ——物理库存减去已经在未完成订单上预留的部分。这些列不在目录里,把这些数字存到每个产品上不值得,但合作伙伴没有这些列就不接受文件。
这就是 easySales 的 Dynamic feed 计算列 的用武之地。你在 feed 中定义列,写一个简短的公式,easySales 在每次重新生成时计算值。你的产品目录保持干净。任何东西都不会被保存到产品本身上。
商家为什么要构建计算列
「计算列」是一种值在 feed 生成时被计算出来的列——不在任何地方存储。它只为你发布的文件而存在,而且只为它存在。
三种模式反复出现:
- 底价和上限。 重新定价合作伙伴想要你能接受的最低价格。你不想把它作为产品属性来存储(它会因渠道、活动、利润政策而变化)。一个公式在每次导出时从采购价 + 利润推导出它。
- 跨货币 feed。 你本国市场之外的合作伙伴想要他们货币的价格。为每个市场存储平行的价格列不可扩展;动态转换可以。
- 计算可用性。 合作伙伴需要看到真正可订购的,而不是货架上的。
库存 - 预留库存只需要一次列减法。
共同特征:值是其他产品值的函数,每次 feed 重新生成时都会重新计算。把它存储在每个产品上意味着每次输入变化时都要更新每个产品——你不需要的维护负担。
计算列在 easySales 中如何工作
三块部件,每块需要五秒钟工作:
- 一个特性 ——值所在的槽位。你创建它一次,给它命名,并在所有产品上保持空。
- 一个 Dynamic feed 列 ——把特性接入输出文件的接线。
- 一个带公式动作的 Feed 规则 ——在导出时填充槽位的计算。
槽位在你的目录中保持空。规则在导出期间填充它。列在文件中渲染填充的值。三个小部件,每个有一个明确定义的工作。添加规则、重新生成、值出现。删除规则、重新生成、值消失——任何产品都不会改变。
第 1 步:创建特性
打开 目录 → 特性 并创建新特性。给它一个清晰的名字——合作伙伴在文件中期望的名字是个好选择。
例子:最低价、欧元价格、可用库存。
你不需要在任何产品上填写值。整个意义在于这个特性是公式的目的地,而不是真正的产品属性。保存并继续。
几个命名提示:
- 选择六个月后你能认出来的名字。
最低销售价(CN)比min_price_cn_v2好。 - 如果同一个值会在多个 feed 中使用,所有 feed 共用一个特性。计算值的作用域是每个 feed(规则存在于 feed 上),所以同一个特性可以在不同 feed 中保存不同的计算值而不冲突。
- 避免已经有产品数据的特性。如果
电压是真实的目录字段,不要重用它作为计算槽位——选另一个名字。计算值会在内存中覆盖现有的 pivot;你会在 feed 渲染期间失去真实值。
第 2 步:将其添加到 Dynamic feed
打开 Dynamic feed。在列构建器中,添加新行,从列下拉菜单中选择 特性,然后从级联选择器中选择刚创建的特性。
列将在输出文件中渲染。单元格值来自规则为每个产品计算的内容。
如果合作伙伴期望该列有特定名称——min_price 而不是 最低价,price_eur 而不是 欧元价格——使用列旁边的 重命名 字段。重命名的值会出现为 CSV 标题 / JSON 键 / XML 元素名;UI 中的其他部分保留你为自己写的内容。重命名适用于每个 Dynamic feed 列,无论是否计算——只要合作伙伴期望与 easySales 内部使用不同的名字,都用这个字段。
第 3 步:编写计算值的 Feed 规则
切换到同一 feed 上的 Feed 规则 选项卡。添加规则:
- 如果:
总是(或一个条件——见下文)。 - 那么:选择创建的特性作为属性,选择 公式 作为运算符,然后写公式。
公式编辑器有一个芯片调色板,包含你可以使用的变量:
${product.product_sale_price}、${product.product_full_price}——列出价格,不含增值税。${product.product_acquisition_price}——你的成本。${product.product_tax_rate}——产品的增值税税率为整数(例如13、6、19)。除以 100 转换为乘数——1 + ${product.product_tax_rate} / 100对 13% 税率返回1.13,正是你乘以净价得到含税价的乘数。${product.product_characteristic:<名称>}——按名称读取另一个特性(区分大小写)。链式使用很有用:用基础值写一个特性,从下一个特性的公式中引用它。${product.product_meta_field:<键>}——按键读取自定义产品元字段。${product.product_price_group:<id>}——读取此产品的合约价格组价格。${other.currency_rate:FROM:TO}——两个 ISO 货币代码之间的实时汇率(例如CNY:USD、USD:EUR)。round(<表达式>, <小数位>)——将结果四舍五入到固定精度。
运算符:+、-、*、/,括号用于分组。标准算术。
某些列故意不作为公式变量暴露——库存、预留库存、重量 和各种非价格列。要从这些列计算值,请使用 Feed 规则的算术动作运算符(覆盖、减去、乘以、加上)而不是 公式。下面的可用库存配方展示了这种模式。
保存规则。下次重新生成时,它会为每个产品运行,在内存中填充特性,并在文件中渲染值。产品目录从未被触及 ——你的特性页面保持你离开时的空状态。
如果你只想公式应用于某些产品(一个类别、有库存的产品、特定品牌的产品),在 如果 一侧添加条件:基于特性、基于列、基于类别——规则构建器支持的任何东西。
真实世界的配方
重新定价合作伙伴的最低销售价
重新定价合作伙伴需要一个底价——他们不应低于的价格。你不想把它存储在每个产品上(成本或利润政策变化时它会变化),所以你计算它。
- 特性名称:
最低价 - 列重命名:
min_price - 公式:
round(${product.product_acquisition_price} * 1.15, 2)——采购 + 15% 利润。
通过在不同 feed 中编写不同规则来按渠道调整乘数。同一特性、不同公式、不同输出文件。目录从不看到这些。第 3 步中的截图显示了这个规则配置。
跨境合作伙伴的第二货币价格
你的合作伙伴在不同的市场,想要他们货币的价格。easySales 有内置的货币汇率函数,所以你不必维护平行的价格清单。
- 特性名称:
欧元价格 - 列重命名:
price_eur - 公式:
round(${product.product_sale_price} * ${other.currency_rate:CNY:USD}, 2)——将CNY:USD替换为适合你情况的 FROM 和 TO 货币。
汇率每天自动刷新——easySales 从中央汇率源拉取,所以你不必维护平行的表。如果合作伙伴需要合约期内的稳定汇率(而不是实时的),请联系支持,我们会为你的情况找出正确的设置。
可用库存(物理减去预留)
合作伙伴看到你发布的库存;如果是货架上的数字而你有未完成订单,你会超卖。要发布的正确数字是 available-to-promise:物理库存减去未完成订单上预留的。
库存 和 预留库存 不作为公式变量暴露,所以这个配方根本不使用 公式 运算符。相反,你在同一个特性上链接两个算术动作——第一个写基础,第二个调整它。
- 特性名称:
可用库存 - 列重命名:
available_stock - 动作 1:目标 =
可用库存,运算符 = 覆盖为,源 = 列库存。(将特性设置为产品的库存值。) - 动作 2(添加在第一个下方,同一规则):目标 =
可用库存,运算符 = 减去,值源 = 字段,列 =预留库存。(从运行值中减去预留库存列。)
两个动作,一个规则,从上到下。第一个写基础;第二个调整。如果你的履行数学需要固定的安全库存缓冲,可以链接第三个动作(针对字面数字的 加 / 减)。
重命名输出中的任何列
重命名 字段出现在 Dynamic feed 构建器中每列的旁边,不仅仅是计算列。每当合作伙伴期望与 easySales 内部使用不同的名字时使用它——price 而不是 full_price、cost 而不是 sale_price、inventory 而不是 stock。
两点说明:
- 重命名应用于文件输出:CSV 标题、JSON 键和 XML 元素名。UI 中的其他部分继续使用 easySales 的名字,这样你和你的团队不会迷路。
- XML 元素名比 CSV 或 JSON 有更严格的规则。如果你的重命名包含空格或标点,easySales 会自动为 XML 进行清理——
Min 价格 (CNY)在<min_jia_ge_cny_>标签中变为min_jia_ge_cny_。CSV 标题和 JSON 键完全保留你输入的内容。
如果两个列重命名为相同的输出名,feed 构建器会阻止保存并显示哪个冲突。选择一个唯一的名字,它就会保存。
何时不使用计算列
- 真实的产品属性。 如果数据自然属于产品(颜色、尺寸、电压、EAN),使用普通特性并存储它。计算列用于不属于目录的值。
- 每个渠道的类别映射。 如果合作伙伴需要 Google Shopping 类别 ID、Skroutz 代码或任何从你的类别到他们的类别的映射,使用渠道特定的 feed 构建器——它经过预验证,节省你的映射工作。Dynamic feed 是我们没有专用构建器的合作伙伴的开放选项。请参阅 什么是产品 Feed? 了解渠道 feed 入门。
- 静态固定值。 如果每个产品都获得相同的值(
condition: new、availability: in_stock),在普通列上使用 设置为值 动作,而不是合成特性——少一个移动部件。
如果你不确定列应该是计算的、存储的还是固定的,支持可以查看你的具体情况。一旦你勾勒出用例,大多数「计算还是存储?」问题在两分钟内解决。
构建合作伙伴真正想要的列
在 easySales 中打开 Feed → Dynamic,几分钟内提供带有计算列的合作伙伴就绪文件。新来这里?免费试用 easySales 14 天,无需信用卡。