如何在Google Sheets中生成排序后仍不可变的自动SKU?
Google Sheets 生成不可变自动递增SKU解决方案
问题根源
你当前使用的=if($B2<>"",$B2 & TEXT(COUNTIF($B$2:$B2,$B2),"-0000"),"")公式依赖相对范围$B$2:$B2做动态计数,表格排序时行的相对位置变化会触发公式重算,导致SKU和对应商品的绑定关系错乱。
方案1:使用Apps Script自动生成固化SKU(推荐)
这个方案生成的SKU是静态文本值,排序、新增行都不会发生变更,完全符合需求:
操作步骤:
- 打开你的表格,点击顶部菜单栏「扩展程序」-「Apps Script」,清空默认代码,粘贴以下代码:
function generateFixedSKU(e) { const sheet = e.source.getActiveSheet(); const targetColumn = 2; // B列为商品名称列,对应列号2 const skuColumn = 1; // A列为SKU列,对应列号1 const editedRow = e.range.getRow(); // 仅当B列新增/修改内容、且对应A列无SKU时触发生成 if (e.range.getColumn() == targetColumn && editedRow >= 2 && sheet.getRange(editedRow, skuColumn).getValue() == "") { const productName = e.value; // 统计当前该商品已有的SKU数量 const allSKUs = sheet.getRange(2, skuColumn, sheet.getLastRow() - 1, 1).getValues().flat(); const matchCount = allSKUs.filter(sku => sku.startsWith(productName + "-")).length; const newSKU = productName + "-" + String(matchCount + 1).padStart(4, '0'); // 写入SKU到A列,是静态文本不会再变动 sheet.getRange(editedRow, skuColumn).setValue(newSKU); } }
- 保存代码,项目名可自定义填写,然后添加触发器:点击左侧闹钟图标「触发器」-「添加触发器」,选择要运行的函数为
generateFixedSKU,事件来源选择「电子表格」,事件类型选择「编辑」,保存并按提示授权权限即可。
- 效果说明:后续只要你在B列输入新的商品名称,脚本会自动在A列生成对应SKU,写入后就是纯文本,排序、修改其他列内容都不会变更SKU,新增行也会自动生成新的SKU。
方案2:公式方案(需开启迭代计算)
如果你不想使用脚本,可以通过开启迭代计算实现SKU生成后自动锁死:
- 点击顶部菜单栏「文件」-「设置」-「计算」,把「迭代计算」的开关打开,最大迭代次数设为1,保存设置。
- A2单元格输入以下公式,然后下拉填充到所有需要的行:
=IF(B2="","",IF(A2="",B2&TEXT(COUNTIFS(B$2:B2,B2,A$2:A2,"<>"),"-0000"),A2))
- 注意事项:
- 公式生成SKU后会自动保留已生成的值,不会因为排序重算变更,但如果清空A列单元格会重新触发计算
- 新增行时只需要把公式下拉到新行即可
内容的提问来源于stack exchange,提问作者Michael Swarts
相关产品推荐
相关产品推荐

