如何用Apps Script实现谷歌表格产品对应店铺的批量匹配与单单元格展示?
谷歌表格产品-店铺汇总方案(可扩展版)
方案一:使用原生函数实现(无需脚本)
原逐个列判断的函数扩展性差,改用FLATTEN+FILTER+TEXTJOIN组合,自动适配任意数量的店铺列。在产品列表工作表的B2单元格输入以下公式,下拉填充整列即可:
=TEXTJOIN(", ", TRUE, UNIQUE(FILTER(FLATTEN('Base1'!$1:$1), FLATTEN('Base1'!$2:$1000)=A2)))
公式说明
FLATTEN('Base1'!$2:$1000):将店铺表中所有产品单元格展开为一维列表FLATTEN('Base1'!$1:$1):对应展开每个产品所属的店铺名FILTER(...):筛选出当前产品(A2)对应的所有店铺名UNIQUE:自动去除重复的店铺记录(避免同一店铺多次关联同一产品)TEXTJOIN:用逗号+空格将店铺名拼接成单个字符串
只要店铺表保持「首行是店铺名,下方列是对应产品」的结构,新增店铺列时无需修改公式,自动生效。
方案二:使用Google Apps Script实现(适合复杂场景)
如果需要更灵活的逻辑(比如定时更新、自定义格式),可以用脚本批量处理:
- 打开目标表格,点击「扩展程序」→「Apps 脚本」进入编辑器
- 替换默认代码为以下脚本:
function aggregateShopsForProducts() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const productSheet = ss.getSheetByName('产品列表'); const shopSheet = ss.getSheetByName('Base1'); // 读取店铺表数据 const shopData = shopSheet.getDataRange().getValues(); const shopNames = shopData[0]; const productRows = shopData.slice(1); // 构建产品-店铺映射(自动去重) const productShopMap = new Map(); productRows.forEach(row => { row.forEach((product, colIdx) => { if (!product) return; const shop = shopNames[colIdx]; productShopMap.has(product) ? productShopMap.get(product).add(shop) : productShopMap.set(product, new Set([shop])); }); }); // 处理产品列表并写入结果 const productRange = productSheet.getRange('A2:A').getValues().filter(row => row[0]); const results = productRange.map(([product]) => { const shops = productShopMap.get(product) || new Set(); return [Array.from(shops).join(', ')]; }); if (results.length) { productSheet.getRange(2, 2, results.length, 1).setValues(results); } }
- 保存脚本(命名任意,比如
ShopAggregator),首次运行需完成授权验证 - 回到表格,运行脚本即可批量填充B列数据
脚本扩展建议
- 添加触发器:在脚本编辑器的「触发器」页面,设置当表格编辑时自动运行脚本,实现实时更新
- 自定义分隔符:修改
join(', ')中的符号,比如改成join('; ')使用分号分隔
内容的提问来源于stack exchange,提问作者Ivan Isaev
相关产品推荐
相关产品推荐

