使用脚本在Google Sheets中基于第二列移除重复行
基于第二列移除重复行的修正代码
你的代码核心问题是没有正确获取每行的第二列数据,还存在变量重复声明、行引用错误的问题,以下是修正后的可用代码:
function removeDuplicates() { // 获取目标工作表 var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('sheet1'); // 获取表格所有数据 var data = sheet.getDataRange().getValues(); var newData = []; var seenValues = []; // 存储已出现过的第二列值 // 遍历每一行数据 for (var i = 0; i < data.length; i++) { var currentRow = data[i]; // 获取当前行的第二列数据(数组索引从0开始,第二列对应索引1) var columnBValue = currentRow[1]; var isDuplicate = false; // 检查该值是否已存在 if (seenValues.indexOf(columnBValue) > -1) { isDuplicate = true; } else { seenValues.push(columnBValue); } // 非重复行加入新数据数组 if (!isDuplicate) { newData.push(currentRow); } } // 清空原表并写入去重后的数据 sheet.clearContents(); sheet.getRange(1, 1, newData.length, newData[0].length).setValues(newData); }
关键修改说明:
- 移除重复的
sheet变量声明,统一通过工作表名称定位目标表 - 循环中正确获取当前行
currentRow = data[i],而非固定取第一行第二列 - 提取当前行的第二列值
columnBValue = currentRow[1],以此作为去重判断依据 - 将存储已出现值的数组命名为
seenValues,语义更清晰 - 简化重复判断逻辑,去掉冗余的赋值语句
大数据量优化方案:
如果你的表格有30000行,indexOf的查找效率偏低,建议改用Set提升性能,修改后的版本如下:
function removeDuplicatesWithSet() { var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('sheet1'); var data = sheet.getDataRange().getValues(); var newData = []; var seenValues = new Set(); for (var i = 0; i < data.length; i++) { var currentRow = data[i]; var columnBValue = currentRow[1]; if (!seenValues.has(columnBValue)) { seenValues.add(columnBValue); newData.push(currentRow); } } sheet.clearContents(); sheet.getRange(1, 1, newData.length, newData[0].length).setValues(newData); }
Set的has方法查找时间复杂度为O(1),远快于indexOf的O(n),处理大量数据时运行速度会明显提升。
内容的提问来源于stack exchange,提问作者willian ribeiro
相关产品推荐
相关产品推荐

