如何用Google Apps Script实现双条件(水果+区域)的SUMIF批量汇总?
谷歌表格双条件分组汇总的Google Apps Script修改方案
需求说明
需要基于谷歌表格中**A列(水果)和C列(区域)双条件,对D列(销量)**进行分组求和,生成按「水果+区域」维度汇总的结果。现有仅支持单条件(仅按水果)汇总的代码,需修改为支持双条件汇总。
原单条件汇总代码
function myFunction() { const srcSheetName = "Sheet1"; // 设置源工作表名称 const dstSheetName = "Sheet2"; // 设置目标工作表名称 const ss = SpreadsheetApp.getActiveSpreadsheet(); const srcSheet = ss.getSheetByName(srcSheetName); const dstSheet = ss.getSheetByName(dstSheetName); const values = srcSheet.getRange(2, 1, srcSheet.getLastRow() - 1, 4).getValues(); const res = [...values.reduce((m, [a,,, b]) => m.set(a, m.has(a) ? m.get(a) + b : b), new Map())]; dstSheet.getRange(1, 1, res.length, res[0].length).setValues(res); }
修改后的双条件汇总代码
function myFunction() { const srcSheetName = "Sheet1"; // 设置源工作表名称 const dstSheetName = "Sheet2"; // 设置目标工作表名称 const ss = SpreadsheetApp.getActiveSpreadsheet(); const srcSheet = ss.getSheetByName(srcSheetName); const dstSheet = ss.getSheetByName(dstSheetName); // 获取A-D列的数据(从第2行开始,跳过表头) const values = srcSheet.getRange(2, 1, srcSheet.getLastRow() - 1, 4).getValues(); // 用复合键(水果+分隔符+区域)作为Map的键,累加对应销量 const sumMap = values.reduce((map, [fruit, , region, sales]) => { // 用|作为分隔符,避免水果/区域名称包含下划线导致键冲突 const key = `${fruit}|${region}`; map.set(key, (map.get(key) || 0) + sales); return map; }, new Map()); // 将Map转换为二维数组:拆分复合键为水果、区域列,加上销量列 const result = [...sumMap.entries()].map(([key, totalSales]) => { const [fruit, region] = key.split('|'); return [fruit, region, totalSales]; }); // 清空目标表原有内容并写入结果(可选:若需要保留表头可调整) dstSheet.clearContents(); // 写入表头(如果需要的话) dstSheet.getRange(1, 1, 1, 3).setValues([["水果", "区域", "总销量"]]); // 写入汇总数据 dstSheet.getRange(2, 1, result.length, 3).setValues(result); }
关键修改点
- 复合键设计:将「水果+区域」拼接成唯一字符串作为Map的键(用
|作为分隔符,避免名称含特殊字符导致冲突),确保双条件组合的唯一性 - 数据提取调整:从原数组中提取
fruit(A列)、region(C列)、sales(D列)三个字段,替代原单条件的仅水果和销量 - 结果格式转换:将Map的复合键拆分为水果、区域两列,加上总销量组成三维数组,匹配目标表的列结构
- 可选优化:增加了表头写入和目标表清空操作,让输出结果更规范
内容的提问来源于stack exchange,提问作者Dustin
相关产品推荐
相关产品推荐

