基本上标题是什么 - 我有一张Google表格,由Google表格提供支持。我们喜欢执行以下操作的脚本: 如果当天提交了重复条目,请删除旧条目 如果超过24小时后提交了重复条目,请在表格中留下这两个条目。
以下是我所获得的内容,它会删除最新的条目,无论何时提交:
function removeDuplicates() {
var sheet = SpreadsheetApp.getActiveSheet();
var data = sheet.getDataRange().getValues();
var newData = new Array();
for(i in data){
var row = data[i];
var duplicate = false;
for(j in newData){
//If Column E in the old entry matches Column E in the new entry
if(row[4] == newData[j][4]){
//Pull New Timestamp and Old Timestamp
var newTime = Date.parse(newData[j][1]);
var oldTime = Date.parse(row[1]);
if (newTime-oldTime<(1000*60*60*24) && newTime>oldTime) duplicate=true; // number is milliseconds in 24 hours
}
}
if(!duplicate){
newData.push(row);
}
}
sheet.clearContents();
sheet.getRange(1, 1, newData.length, newData[0].length).setValues(newData);
}
答案 0 :(得分:0)
您的标题和描述似乎相互矛盾。基于your previous question我假设说明正确,并且您希望仅在第二次复制之前不到24小时提交时删除较旧的副本。
首先,您在输入第一个duplicate=true
区块后立即设置if
,这是您不想要的。要仅删除两者中的较旧,请将第二个if
条件更改为
if (newTime-oldTime<(1000*60*60*24) && newTime>oldTime) duplicate=true;
这应该注意删除最新的条目,因为当时间是您要比较的两个中较小的一个时,您只会将该行标记为重复。
修改强>
您可以采用不同的方法并尝试删除重复的行,而不是将非重复行添加到新数组中。那怎么样:
var sheet = SpreadsheetApp.getActiveSheet();
var data = sheet.getDataRange.getValues();
var nRows = data.length;
for (var i=0; i<nRows; i++){
var time1 = Date.parse(data[i][4]); // Time to which you will compare the others
for (var j=0; i<nRows; j++){
var time2 = Date.parse(data[j][4]); // Time to compare to the first time
if (time1>time2 && time1-time2<(1000*60*60*24)){ // time 2 is older by less than 24 hours
data.splice(j,1); // Remove older item
j--; // Decrement j so it does the same row since you removed one
nRows--; // Now have one fewer rows in data
}
}
}
这样你就可以修改一个数组,而不是创建第二个数组。您可以使用data
代替newData
完成清除/写入。