如何使用Apps Script对二维数组中的重复项求和?
实现二维数组的SUMIF式合并(适配Google Sheets)
需求说明
现有如下二维数组,需合并子数组第一个元素的重复项,对第二个元素求和:
const arr1 = [ ["1150-500101-1000005530", 2750.0], ["1150-500101-1000005530", 275.0], ["1150-500101-1000008371", 825.0], ["1150-500101-1000014950", 550.0], ["1150-500101-1000019105", 589.0], ["1150-500101-1000019111", 589.0], ["1150-500101-1000019111", 275.0] ];
期望输出:
const reducedArr1 = [ ["1150-500101-1000005530", 3025.0], ["1150-500101-1000008371", 825.0], ["1150-500101-1000014950", 550.0], ["1150-500101-1000019105", 589.0], ["1150-500101-1000019111", 864.0] ];
数据来自Google Sheet且会动态更新,需要无需硬编码键的通用解决方案,实现类似Excel/SUMIF的功能并将结果写入报表。
通用实现代码(Google Apps Script)
// 核心函数:以子数组第一个元素为键,求和第二个元素 function sumByFirstColumn(arr) { const sumMap = {}; arr.forEach(row => { const key = row[0]; const value = row[1]; sumMap[key] = (sumMap[key] || 0) + value; }); // 将映射对象转回二维数组 return Object.entries(sumMap); } // 示例:从Google Sheet读取数据并处理后写入 function processSheetData() { // 1. 读取源数据(假设源数据在Sheet1,包含表头) const sourceSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1"); const allData = sourceSheet.getDataRange().getValues(); // 跳过表头,取实际数据 const dataToProcess = allData.slice(1); // 2. 合并求和 const summedData = sumByFirstColumn(dataToProcess); // 3. 将结果写入目标工作表(比如Sheet2) const targetSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet2"); targetSheet.clearContents(); // 写入表头(可选) targetSheet.getRange(1, 1).setValue("标识ID"); targetSheet.getRange(1, 2).setValue("累计值"); // 写入合并后的数据 targetSheet.getRange(2, 1, summedData.length, summedData[0].length).setValues(summedData); }
使用说明
- 打开目标Google Sheet,点击「扩展程序」→「Apps Script」
- 粘贴上述代码,保存项目(命名如
SumByFirstColumn) - 首次运行需授权脚本访问权限
- 运行
processSheetData函数,即可自动完成数据合并并写入指定工作表
该方案无需指定固定键,自动适配子数组第一个元素作为分组依据,支持数据动态更新,直接对接Google Sheet的读写操作。
内容的提问来源于stack exchange,提问作者zuter
相关产品推荐
相关产品推荐

