根据一列删除重复项并在 google 表中保留最新条目

Remove duplicates based on one column and keep latest entry in google sheets

我正在做一些自动化工作,想通过在第 3 列的基础上进行比较来删除 google sheet 中的重复行。我找到了一个运行完美的代码,但它没有删除 sheet 中的旧条目,而是删除了最新的条目。我想保留最新的副本。

这是我通过 Cooper:

为 appscript 找到的代码
function removeDuplicates() {
  var sh=SpreadsheetApp.getActiveSheet();
  var dt=sh.getDataRange().getValues();
  var uA=[];
  var d=0;
  for(var i=0;i<dt.length;i++) {
    if(uA.indexOf(dt[i][2])==-1) {
      uA.push(dt[i][2]);
    }else{
      sh.deleteRow(i+1-d++);
    }
  }
}

任何人都可以帮助我完成相同工作的代码“删除重复行(保留最新条目删除旧条目)基于列”吗?

I wanted to keep the latest one from the duplicates.开始,当最新的是最后一行时,在你的脚本中,下面的修改怎么样?

修改后的脚本:

function removeDuplicates() {
  var sh = SpreadsheetApp.getActiveSheet();
  var dt = sh.getDataRange().getValues();
  var uA = [];
  for (var i = dt.length - 1; i >= 0; i--) {
    if (uA.indexOf(dt[i][2]) == -1) {
      uA.push(dt[i][2]);
    } else {
      sh.deleteRow(i + 1);
    }
  }
}

我的建议:

function myFunction() {
  var sh = SpreadsheetApp.getActiveSheet();

  // get values of column C
  var col = sh.getDataRange().getValues().map(x => x[2]);

  // get indexes of duplicated values in the column
  var duplicates = col.map((x,i) => 
    col.slice(i+1).includes(x) ? i+1 : '').filter(String); 

  // remove rows by the indexes
  duplicates.reverse().forEach(x => sh.deleteRow(x));
}

之前:

之后:

更新

如果有一些小故障,在每个 deleteRow() 之后添加命令 flush() 是有意义的。代码的最后一行应该是这样的:

  // remove rows by the indexes
  duplicates.reverse().forEach(x => { sh.deleteRow(x); SpreadsheetApp.flush() });