谷歌表格-删除旧的重复条目,只有当提交少于一天后



基本上是标题所说的-我有一个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来完成清除/写入。

最新更新