You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 19:43:04