Google Sheets脚本:如何将重复工单计数追加到二维数组对应行
问题背景
Google Sheets中存储的工单列表原始格式如下:
Work ID Location Start Time Officer Count 123 North 1100 123 North 1100 123 North 1100 222 South 1200 999 North 1400 999 North 1400 333 South 1200
- 规则:每个工单固定分配1名人员
- 需求:统计重复工单的数量,将计数填入每行末尾的
Officer Count列,展示对应工单总共需要的人员数量。例:工单123需配置3人、222需1人、999需2人、333需1人。 - 现存问题:已编写的代码可以输出正确的计数值,但结果顺序与原始二维数组的顺序不匹配,无法直接将计数追加到数组对应行末尾。
原有问题代码如下:
var rowRange = sheet.getRange(2, 1, 7, 3).getValues(); //Create Work Number array (1D array) var oneDArr = rowRange.map(function(row){return row[0];}); //Create object to count number of officers to Work Number var counts = {}; oneDArr.forEach(function(x) { counts[x] = (counts[x] || 0)+1; }); //Create Array from Object var array = []; var array = Object.entries(counts); //Set Values to correct location // sheet.getRange(11, 1, array.length, array[0].length).setValues(array); }
问题根因
原有逻辑通过Object.entries(counts)生成的是去重后的工单键值对数组,长度仅为4,和原始数据的7行长度不匹配,且排列顺序是按Work ID去重后的枚举顺序,和原始表格逐行顺序无法对应,因此不能直接对齐写入。
修正方案
不需要将计数对象转为独立的去重数组,提前完成所有Work ID的计数后,直接遍历原始读取的行数据,逐行从计数对象中取出当前工单对应的总人数,拼接到行尾即可,最终生成的数组顺序、长度和原始数据完全一致,可直接写入表格。
修正后可直接运行的代码:
function fillOfficerCount() { var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); // 读取原始工单数据:第2行开始,共7行,取前3列 var rowRange = sheet.getRange(2, 1, 7, 3).getValues(); // 统计每个Work ID的出现次数(即需要配置的人员总数) var counts = {}; rowRange.forEach(row => { const workId = row[0]; counts[workId] = (counts[workId] || 0) + 1; }); // 逐行拼接计数值,完全保留原始行顺序 const result = rowRange.map(row => { return row.concat(counts[row[0]]); }); // 写入全量数据到原区域(包含新增的Officer Count列) sheet.getRange(2, 1, result.length, 4).setValues(result); }
实现效果
运行后表格Officer Count列会按原始行顺序填入对应计数:
- 前3行Work ID为123,均填入3
- 第4行Work ID为222,填入1
- 第5-6行Work ID为999,均填入2
- 第7行Work ID为333,填入1
内容的提问来源于stack exchange,提问作者Borgher
相关产品推荐
相关产品推荐

