基本上是标题所说的-我有一个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);
}
你的标题和描述似乎相互矛盾。根据你之前的问题,我假设描述是正确的,你想删除旧的副本,只有在第二个副本提交前不到24小时。
首先,您在进入第一个if
块时立即设置duplicate=true
,这是您不想要的。为了只删除较老的,将第二个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
来完成清除/写入。