Google Apps Script提取唯一值结果不唯一问题求助
解决Google Apps Script统计唯一值次数重复的问题
问题根源
你的代码应该是直接遍历了「Data」工作表L列的所有行,将每个值直接添加到结果数组中,未做去重计数处理,所以最终写入「Summary」的是原始数据的重复值,而非预期的「唯一值+对应次数」格式。
修正后的实现代码
以下是符合需求的代码,同时预留了后续改为通用函数的扩展性:
function countUniqueValues() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const dataSheet = ss.getSheetByName('Data'); const summarySheet = ss.getSheetByName('Summary'); // 获取L列非空数据(默认从第2行开始,假设第1行是表头) const lColumnData = dataSheet.getRange('L2:L').getValues().flat().filter(val => val !== ''); // 用Map统计每个值的出现次数 const countMap = new Map(); lColumnData.forEach(val => { countMap.set(val, (countMap.get(val) || 0) + 1); }); // 转换为数组并按次数降序排序 const sortedResult = Array.from(countMap.entries()).sort((a, b) => b[1] - a[1]); // 清空Summary工作表C、D列原有数据(从第2行开始) summarySheet.getRange('C2:D').clearContent(); // 将结果写入C、D列(C列存唯一值,D列存对应次数) if (sortedResult.length > 0) { summarySheet.getRange(2, 3, sortedResult.length, 2).setValues(sortedResult); } }
通用函数改造(支持任意列)
如果要扩展为可处理任意列的通用函数,只需将目标列名作为参数传入即可:
function countColumnUniqueValues(targetColumn, writeStartCol = 3) { const ss = SpreadsheetApp.getActiveSpreadsheet(); const dataSheet = ss.getSheetByName('Data'); const summarySheet = ss.getSheetByName('Summary'); // 获取目标列非空数据(从第2行开始) const columnData = dataSheet.getRange(`${targetColumn}2:${targetColumn}`).getValues().flat().filter(val => val !== ''); const countMap = new Map(); columnData.forEach(val => { countMap.set(val, (countMap.get(val) || 0) + 1); }); const sortedResult = Array.from(countMap.entries()).sort((a, b) => b[1] - a[1]); // 清空目标写入区域原有数据 summarySheet.getRange(2, writeStartCol, summarySheet.getLastRow() - 1, 2).clearContent(); // 写入统计结果 if (sortedResult.length > 0) { summarySheet.getRange(2, writeStartCol, sortedResult.length, 2).setValues(sortedResult); } } // 调用示例:统计L列,写入C、D列 countColumnUniqueValues('L'); // 调用示例:统计A列,写入E、F列 countColumnUniqueValues('A', 5);
核心逻辑说明
- 用
Map自动处理唯一值统计,避免手动去重的繁琐 flat()将getValues()返回的二维数组转为一维,简化遍历filter(val => val !== '')过滤列中的空单元格sort((a, b) => b[1] - a[1])实现按出现次数降序排序- 写入前清空目标区域,避免旧数据残留
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

