如何在Google Apps脚本中删除每行重复项并按列循环?

时间:2018-09-04 17:23:20

标签: google-apps-script

我有一组数据,每3列按月分类。换句话说,例如A到C列是9月,D到F列是10月,依此类推。我希望获得有关删除每月每一行中重复项的帮助,以便如果A和B和C列中一行的数据与另一行匹配,则该行中的重复单元格将被删除。然后在下个月重复进行此操作(接下来的三列D,E和F)。

到目前为止,我仅设法找到了在特定范围内删除重复行的脚本,但是没有找到如何删除行中重复的单元格并循环每隔几列的脚本。

这是我到目前为止用于删除特定范围内重复行的代码:

function deleteDuplicates() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var source = "Master";
  var sourceSheet = ss.getSheetByName(source);
  var sourceRange = sourceSheet.getRange(3, 1, sourceSheet.getLastRow(), 3)
  var sourceData = sourceRange.getValues();
  var keepData = new Array();
  var deleteCount = 0;

  for(i in sourceData) { 
     var row = sourceData[i];
     var duplicate = false; 
        for(j in keepData) { 
           if(row[0] == keepData[j][0] && 
              row[1] == keepData[j][1] && 
              row[2] == keepData[j][2]) { 
              duplicate = true;  
           }
        }
     if(!duplicate) { 
     keepData.push(row); 
     } 
   }

  sourceRange.clear();
  sourceSheet.getRange(3, 1, keepData.length, 
  keepData[0].length).setValues(keepData);

}

我对脚本编写还很陌生,因此非常感谢您提供有关修改此脚本或新输入的帮助。谢谢。

更新:这是我的Google表格中的示例数据,如果它更清楚的话。 https://docs.google.com/spreadsheets/d/1IDcBlzFj6992RvMXS3TOyqaS5HsSRqjxk5HXsnYrGkA/

2 个答案:

答案 0 :(得分:0)

尝试一下:

可能有很多更简单的方法可以做到这一点。但是我喜欢这个问题,所以这是解决问题的方法。此示例生成的是自己的随机数据,因此您需要先将其取出,然后再在数据集上运行它。但是,如果我正确粘贴了它,并且您正确地复制了它,并制作了Sheet2使其可以工作,那么它应该可以正常运行。如果没有,请准备好自行调试。

顺便说一下,它还有一些无关紧要的注释和结果,以便我弄清楚它是否有效。祝好运。另外,我还没有尝试过,但是如果月份出现在连续的列中,我认为这并不在意。

  function removeDupesInGroups(){
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName('Sheet2');
  generateContent(3,1,100,9);
  var rg=sh.getRange(1,1,sh.getLastRow(),9);
  var vA=rg.getValues();
  var hdr={};
  var dA=[];
  for(var j=0;j<vA[0].length;j++){
    if(!hdr.hasOwnProperty(vA[0][j])){
      hdr[vA[0][j]]=[];
      hdr[vA[0][j]].push(j);
    }else{
      hdr[vA[0][j]].push(j);
    }
  }
  var n=0;
  for(key in hdr){
    var m=key;
    var uA=[];
    for(var i=2;i<vA.length;i++){
      var tA=[];
      for(var j=0;j<vA[i].length;j++){
        var elements=hdr[key].join(',');
        if(hdr[key].indexOf(j)>-1){
          tA.push(vA[i][j]);
        }   
      }
      if(i<vA.length){
        if(!isArrayContained(uA,tA)){
          uA.push(tA);
        }else{
          sh.deleteRow(i - n + 1);
          dA.push([Utilities.formatString('n=%s,i=%s,deleeting row %s,key=%s,group=%s',n,i,i-n+1,key,tA.join('|'))]);
          sh.getRange(1, 10).setValue(Utilities.formatString('n=%s,i=%s,deleeting row %s,group=%s',n,i,i-n+1,tA.join(',')));
          n++;
        }
      }
    }
  }
  var resultrg=sh.getRange(sh.getLastRow()+2,1,dA.length,1).setValues(dA);
}

function isArrayContained(c,t){
  for(var i=0;i<c.length;i++){
    var isEqual=true;
    for(var j=0;j<c[i].length;j++){
      var t1=c[i][j];
      var t2=t[j];
      if(c[i][j]!=t[j]){
        isEqual=false;
        break;
      }
    }
    if(isEqual){
      return true;
    }
  }
  return false;
}

function generateContent(row,col,rows,cols){
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName('Sheet2');
  sh.getDataRange().clearContent();
  sh.getRange(1,1,2,9).setValues([['Jan','Jan','Jan','Feb','Feb','Feb','Mar','Mar','Mar'],['Header','Header','Header','Header','Header','Header','Header','Header','Header']])
  var rg=sh.getRange(row,col,rows,cols);
  var vA=rg.getValues();
  var s="For the Lamb on the Throne will be their Shepard.";
  for(var i=0;i<vA.length;i++){
    for(var j=0;j<vA[i].length;j++){
      vA[i][j]=s.charAt(Math.floor(Math.random() * s.length+1));
    } 
  }
  rg.setValues(vA);
}

答案 1 :(得分:0)

不确定这是否是最有效的方法,但是我尝试对代码进行此修订,并且它可以用于测试数据。这是我使用的最终代码。

function deleteDuplicates() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var source = "Master";
  var sourceSheet = ss.getSheetByName(source);

 for (var a=1; a<=19; a+=3){
  var sourceRange = sourceSheet.getRange(3, a, sourceSheet.getLastRow(), 3)
  var sourceData = sourceRange.getValues();
  var keepData = new Array();
  var deleteCount = 0;

    for(i in sourceData) { 
    var row = sourceData[i];
    var duplicate = false; 
      for(j in keepData) { 
        if(row[0] == keepData[j][0] && 
          row[1] == keepData[j][1] && 
          row[2] == keepData[j][2]) { 
          duplicate = true;  
       }
      }
    if(!duplicate) { 
    keepData.push(row); 
    } 
  }

  sourceRange.clear();
  sourceSheet.getRange(3, a, keepData.length, 
  keepData[0].length).setValues(keepData);

}

它基本上从a列开始,并向其添加3,这将更改源范围并循环直到到达19列。