如何用Apps Script基于单元格值删除重复行(保留最新行)
Google Apps Script:删除指定列重复行(保留最新行)
需求说明
需要删除谷歌表格中指定列(示例为标注“RR/TR No.”的C列)存在重复值的行,保留最下方/最新添加的重复行,删除之前的重复行(如行15与行16重复时,删除行15,保留行16)。
解决方案代码
function removeDuplicateRowsKeepLatest() { // 获取当前活动表格 const ss = SpreadsheetApp.getActiveSpreadsheet(); // 替换为你的目标工作表名称 const sheet = ss.getSheetByName("reporting"); // 获取表头行(假设表头在第1行),定位目标列 const headerRow = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0]; const targetColIndex = headerRow.indexOf("RR/TR No."); if (targetColIndex === -1) { SpreadsheetApp.getUi().alert("未找到标注为'RR/TR No.'的列"); return; } // 获取所有数据行(从第2行到最后一行) const dataRange = sheet.getRange(2, 1, sheet.getLastRow() - 1, sheet.getLastColumn()); const data = dataRange.getValues(); const seenIds = new Set(); const rowsToDelete = []; // 从下往上遍历,优先保留最新行 for (let i = data.length - 1; i >= 0; i--) { const currentId = data[i][targetColIndex]; // 跳过空值(不需要的话可删除此判断) if (!currentId) continue; if (seenIds.has(currentId)) { // 已存在该ID,标记要删除的行号(表格中实际行号是i+2,因为数据从第2行开始) rowsToDelete.push(i + 2); } else { seenIds.add(currentId); } } // 倒序删除行,避免删除后行号偏移 rowsToDelete.sort((a, b) => b - a).forEach(rowNum => { sheet.deleteRow(rowNum); }); SpreadsheetApp.getUi().alert(`已删除${rowsToDelete.length}条重复行`); }
代码说明
- 动态定位列:通过表头查找目标列,不用硬编码列号,适配表头位置变化。
- 从下往上遍历:确保最新的行先被记录,后续遇到的重复行直接标记删除,符合需求。
- 批量删除:先收集所有待删行号,再倒序删除,避免因删除行导致后续行号混乱,同时提升执行效率。
- 空值过滤:自动跳过空的RR/TR No.,如果需要处理空值可删除对应判断。
原复制行代码优化建议
你之前的复制行代码可以简化,减少重复调用getLastRow():
function report() { const ssraw = SpreadsheetApp.getActiveSpreadsheet(); const sheetraw = ssraw.getSheetByName('X'); const data = sheetraw.getRange('A2:P2').getValues(); const ss = SpreadsheetApp.openByUrl('https://docs.google.com/spreadsheets/d/1AwevYEBTQYPGFTco7bnczqSGYgWEK1sU2ojLJhocTpk/edit#gid=1804330717'); const reqsheet = ss.getSheetByName("reporting"); const lastRow = reqsheet.getLastRow(); // 新行默认是空的,无需提前clear,直接赋值即可 reqsheet.getRange(lastRow + 1, 1, 1, 16).setValues(data); }
内容的提问来源于stack exchange,提问作者Anushka
相关产品推荐
相关产品推荐

