根据一列删除重复项并在 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() });
我正在做一些自动化工作,想通过在第 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() });