如何自动合并3个工作表订单数据至Google Sheets主表并同步新记录
解决方案:Google Sheets多平台订单自动增量同步到主表
核心思路
要实现增量同步,关键是通过唯一订单ID区分已同步和新增订单。假设所有平台工作表(ebay/etsy/amazon)和主表"GI Orders"都包含唯一标识订单的列(比如订单号列),我们用这个列来判断订单是否已存在于主表,避免重复插入。
实现脚本(Google Apps Script)
打开你的Google Sheet,点击「扩展程序」→「Apps Script」,粘贴以下代码:
// 配置常量,根据实际列结构调整 const MAIN_SHEET_NAME = "GI Orders"; const SOURCE_SHEET_NAMES = ["ebay", "etsy", "amazon"]; // 唯一订单ID所在的列索引(从0开始,比如B列填1,C列填2) const ORDER_ID_COLUMN_INDEX = 1; // 主表中订单数据开始的列(D列对应索引3) const MAIN_DATA_START_COLUMN = 3; function syncOrders() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const mainSheet = ss.getSheetByName(MAIN_SHEET_NAME); // 获取主表中已存在的所有订单ID,存入Set用于快速查重 const mainOrderIds = new Set(); const mainDataRange = mainSheet.getRange(2, MAIN_DATA_START_COLUMN + ORDER_ID_COLUMN_INDEX, mainSheet.getLastRow() - 1, 1); const mainOrderIdValues = mainDataRange.getValues(); mainOrderIdValues.forEach(row => { if (row[0]) mainOrderIds.add(row[0].toString()); }); // 遍历所有数据源表,同步增量订单 SOURCE_SHEET_NAMES.forEach(sheetName => { const sourceSheet = ss.getSheetByName(sheetName); if (!sourceSheet) return; // 获取数据源表的所有订单数据(跳过表头) const sourceLastRow = sourceSheet.getLastRow(); if (sourceLastRow <= 1) return; // 无数据行 const sourceDataRange = sourceSheet.getRange(2, 1, sourceLastRow - 1, sourceSheet.getLastColumn()); const sourceData = sourceDataRange.getValues(); // 筛选出未同步的订单行 const newOrders = sourceData.filter(row => { const orderId = row[ORDER_ID_COLUMN_INDEX]?.toString(); return orderId && !mainOrderIds.has(orderId); }); // 将新增订单插入主表底部(D列及以后) if (newOrders.length > 0) { const insertRow = mainSheet.getLastRow() + 1; mainSheet.getRange(insertRow, MAIN_DATA_START_COLUMN + 1, newOrders.length, newOrders[0].length).setValues(newOrders); // 可选:在数据源表标记已同步(比如新增"同步状态"列,这里假设是最后一列) // const statusColumn = sourceSheet.getLastColumn() + 1; // sourceSheet.getRange(2, statusColumn, sourceLastRow - 1, 1).setValue("已同步"); } }); }
脚本配置说明
ORDER_ID_COLUMN_INDEX:修改为你实际的唯一订单ID列索引(比如订单ID在B列,填1,因为JavaScript数组从0开始计数)。MAIN_DATA_START_COLUMN:主表中订单数据开始的列,D列对应3,无需修改,除非你的主表结构变更。
自动同步设置
方式1:固定间隔同步(推荐)
设置每小时自动执行脚本:
- 在Apps Script编辑器中,点击左侧「触发器」图标(时钟形状)。
- 点击「添加触发器」:
- 选择函数:
syncOrders - 选择事件源:「时间驱动」
- 选择类型:「小时计时器」,间隔选「每小时」
- 选择函数:
- 保存并授权脚本权限。
方式2:新增行时自动触发
如果需要实时同步,可设置onChange触发器(需额外判断插入行操作),但稳定性略低于时间驱动:
在脚本中添加以下函数,再按上述步骤添加触发器(事件源选「从电子表格」,事件类型选「更改」):
function onSheetChange(e) { if (e.changeType === "INSERT_ROW" && SOURCE_SHEET_NAMES.includes(e.source.getActiveSheet().getName())) { syncOrders(); } }
注意事项
- 确保所有平台工作表和主表的列结构完全一致,否则同步的数据会错位。
- 唯一订单ID必须全局唯一(不同平台的订单ID不能重复),如果存在重复风险,可在ID前拼接平台标识(比如
ebay-12345)。 - 主表A-C列的人工维护数据不会被脚本修改,脚本仅在D列及以后插入新增订单数据。
- 首次运行脚本时,会同步所有未在主表中的历史订单,之后仅同步增量。
内容的提问来源于stack exchange,提问作者TD Media
相关产品推荐
相关产品推荐

