从零搭建跨境电商自动选品入库系统:n8n 联动 AI 与 Google Sheets 避坑全实录

在跨境电商的日常运营中,选品和铺货是最耗费精力的环节。作为一个热衷于 Self-Hosted(自托管)的 HomeLab 玩家,我最近彻底跑通了一套全自动跨境选品与上架流水线

该系统实现了:浏览器一键触发 – Webhook 接收 – 大模型 AI 洗稿翻译 – 多图拆分与商城草稿批量上传 – 自动化落库存档

在这条“通车”之路上,我踩过了诸如跨节点数据“失忆”、JSON 被格式撑破、跨国电商平台前端汇率渲染欺骗等诸多硬核深坑。本文将毫无保留地把全套方案和核心避坑代码分享出来,帮你少走弯路。

🚀 系统核心架构与业务流

整套自动化方案完全基于开源工作流引擎 n8n 搭建,核心流程如下:

[浏览器一键书签 (JavaScript)] 
       │ (抓取前端展示价格与URL)
       ▼
[n8n Webhook 接收端] 
       │
       ├─► [AI 大模型/JavaScript 节点] (自动翻译洗稿、提取商品核心卖点)
       ├─► [Split Out & Aggregate 节点] (多图循环下载、上传至商城后端)
       │
       ▼
[一键生成商城草稿] ──► [Google Sheets 选品审核表落库]
2026 07 03 174708

🛠️ 核心节点配置与防弹级代码实现

1. 浏览器前端书签(Bookmarklet)的“所见即所得”强化

痛点重现:很多跨境电商平台(如亚马逊)在切换货币(如将日元/美元切换为人民币 CNY)时,玩的是“前端视觉魔术”。底层 HTML 源码里的 Meta 数据依然是原始货币价格。如果书签脚本只传 URL 让后端重新爬取,AI 提取到的永远是原始货币,汇率天天在变,极难管理。

终极解决方案:直接把书签升级为“带摄像头的搬运工”,点击时直接扒下浏览器前端已经渲染好的、你肉眼看到的那个 CNY 价格,连同 URL 拼接发给 Webhook。

强化版一键抓取书签代码(新建浏览器书签,在网址栏填入以下单行代码)

JavaScript

javascript:(function(){var currentUrl=window.location.href;var priceEl=document.querySelector('.a-price .a-offscreen')||document.querySelector('#priceblock_ourprice')||document.querySelector('.a-color-price');var priceVal=priceEl?priceEl.innerText.replace(/[^0-9.]/g,''):'0';var webhookUrl='https://你的n8n域名.com/webhook/amazon-draft?url='+encodeURIComponent(currentUrl)+'&price='+priceVal;fetch(webhookUrl,{mode:'no-cors'}).then(()=>alert('🚀 链接及前端显示价格 (¥'+priceVal+') 已发送至 n8n!')).catch(err=>alert('⚠️ 发送失败,请检查 n8n 状态。'));})();

2. 跨节点数据“失忆”与可选链防崩技术

痛点重现:在 n8n 中,当商品数据经过 Split Out(拆分多图进行下载/上传)和 Aggregate(将多图重新打包成数组)后,工作流的“数据血统”会发生丢失。此时如果直接使用 $('节点名').item.json.xxx 去读取最初的标题、价格,n8n 极易返回 undefined。由于去掉了花括号外面的双引号,undefined 会直接撑破整个系统的 JSON 结构,导致全线崩溃。

终极解决方案:在接口的 JSON Body 里直接采用 “JavaScript 原生对象” + “.first() 强行置顶” + “?. 可选链防崩” 的防弹级写法。

💡 商城草稿节点 核心 Body 配置

无需再去头疼哪里该加双引号、哪里该去掉了!全盘交给 n8n 的表达式引擎,它会自动把格式转为标准后端所需的 JSON:

{{
{
  "cate_id": [1], 
  "store_name": $('Code in JavaScript').first()?.json?.title || "未知商品",
  "image": $('Aggregate').first()?.json?.crmeb_images?.[0] || "", 
  "slider_image": $('Aggregate').first()?.json?.crmeb_images || [],
  "price": Number($('Webhook').first()?.json?.query?.price || 0),
  "stock": 999,
  "cost": 0,
  "ot_price": Number($('Webhook').first()?.json?.query?.price || 0),
  "is_show": 0,
  "is_hot": 0,
  "is_benefit": 0,
  "is_best": 0,
  "is_new": 0,
  "is_postage": 0,
  "is_good": 0,
  "spec_type": 0,
  "mer_use": 0,
  "coupon_ids": [], 
  "label_id": [],
  "command_word": "",
  "items": [{ "value": "规格", "detail": ["默认"] }],
  "attrs": [
    {
      "pic": $('Aggregate').first()?.json?.crmeb_images?.[0] || "",
      "price": Number($('Webhook').first()?.json?.query?.price || 0),
      "cost": 0,
      "ot_price": Number($('Webhook').first()?.json?.query?.price || 0),
      "stock": 999,
      "weight": 0,
      "volume": 0,
      "bar_code": "",
      "detail": { "规格": "默认" }
    }
  ],
  "description": Array.isArray($('Code in JavaScript').first()?.json?.description) ? $('Code in JavaScript').first()?.json?.description.join('<br><br>') : ($('Code in JavaScript').first()?.json?.description || "暂无详情")
}
}}

3. Google Sheets 团队协作选品表配置与时间轴加入

将数据落库到本地私有云(如私有表格 API)时容易遭遇封闭生态的阻碍,回归到原生的 Google Sheets 节点是极佳的选择。使用 OAuth2 凭据 绑定你自己的 Google 账号,能完美绕过服务账号复杂的权限分享步骤。

在表格中追加数据时,开启 fx 表达式模式,填入以下映射代码,并加入自动时区格式化

表格列名n8n 表达式代码(防弹版本)
商品标题`{{ $(‘Code in JavaScript’).first()?.json?.title
人民币价格`{{ Number($(‘Webhook’).first()?.json?.query?.price
核心卖点`{{ Array.isArray($(‘Code in JavaScript’).first()?.json?.description) ? $(‘Code in JavaScript’).first()?.json?.description.join(‘\n’) : ($(‘Code in JavaScript’).first()?.json?.description
原始链接`{{ $(‘Webhook’).first()?.json?.query?.url
商城主图`{{ $(‘Aggregate’).first()?.json?.crmeb_images?.[0]
采集时间{{ $now.setZone('Asia/Shanghai').toFormat('yyyy-MM-dd HH:mm:ss') }}

🔥 协作小贴士:配置完成后,直接在谷歌表格右上角点击“共享”,将你同事的 Gmail 邮箱添加为“编辑者 (Editor)”。这样她就可以在微信或手机端随时协同审核、修改价格,而不会对后端的自动采集产生任何干扰。

🏆 填坑心得与 HomeLab 总结

  1. 别跟不开放的本地应用底层 API 死磕:本地私有表格接口文档如果模糊不清、缺乏独立鉴权,果断转向生态完善的中间件(如 Google Sheets 节点或原生的 MySQL/MariaDB 节点),能省下大量调试网关和 Cookie 的宝贵时间。
  2. 防弹代码(Optional Chaining)是硬道理:大模型每次吐出的 JSON 字段可能并不稳定(有时是数组,有时是纯文本)。如果不加 ?.Array.isArray() 的类型判断以及 || 的默认保底,只要有一条商品数据缺失了字段,整条自动化流水线就会全线崩溃。
  3. 数据记得定时备份:流水线跑通后,千万记得点击 n8n 界面右上角的 ... -> Download 导出 JSON。对于 Docker 用户,定期对挂载的 .n8n/database.sqlite 文件进行冷备份,就是给全套自动化成果买的“终身保险”。

这套选品系统运行两周以来,数据抓取准确率稳定在 100%。如果你也在用 n8n 优化自己的电商供应链或自媒体工作流,欢迎在评论区一起交流更多极客玩法!

Leave a Comment