Google脚本:如果其中的值存在于多个工作表中,则删除行

时间:2014-11-03 10:43:54

标签: google-apps-script google-sheets

我在question个月之前发布了关于删除一行的信息,如果其中的一个值存在于另一个工作表中。

这是我上一篇文章中接受的答案。

function deleteRowInSheet1() { 
  var s1 = SpreadsheetApp.openById("SS_ID").getSheetByName('Sheet1');
  var s2 = SpreadsheetApp.openById("SS_ID").getSheetByName('Sheet2'); 
  var values1 = s1.getDataRange().getValues();
  var values2 = s2.getDataRange().getValues();
  var resultArray = [];
  for(var n in values1){
    var keep = true
    for(var p in values2){
      if( values1[n][0] == values2[p][0] && values1[n][1] == values2[p][1]){
        keep=false ; break ;
      }
    }
    if(keep){ resultArray.push(values1[n])};
  }
  s1.clear()
  s1.getRange(1,1,resultArray.length,resultArray[0].length).setValues(resultArray);
}

现在,我的问题是,如果有超过1张要比较的话。假设我有4张。

Sheet 1中:

NAME | PLACE | AGE

卡尔|佛罗里达| 45

迈克|佛罗里达| 41

Suzy |佛罗里达州

表2:

NAME | PLACE | AGE

迈克|佛罗里达| 41

表3:

NAME | PLACE | AGE

迈克|佛罗里达| 41

第4页:

NAME | PLACE | AGE

迈克|佛罗里达| 41

脚本应删除Sheet 2到4中的Mike Florida行,因为它在Sheet 1中有重复数据。第1列和第2列再次是比较4张中所有数据的基础,因为值是唯一的。我试图修改已回答的脚本,但我似乎无法让它运行。我理解逻辑,但不确定我错过了哪一部分:

这是我的代码:

function deleteRowInSheets1to3() { 
      var s1 = SpreadsheetApp.openById("SS_ID").getSheetByName('Sheet1'); //this is the basis of all sheets. values to be compared is column 2
      var s2 = SpreadsheetApp.openById("SS_ID").getSheetByName('Sheet2');  
      var s3 = SpreadsheetApp.openById("SS_ID").getSheetByName('Sheet3');
      var s4 = SpreadsheetApp.openById("SS_ID").getSheetByName('Sheet4'); 

      var values1 = s1.getDataRange().getValues();
      var values2 = s2.getDataRange().getValues();
      var values3 = s3.getDataRange().getValues();
      var values4 = s4.getDataRange().getValues();

      var resultArray = [];
      for(var n in values1){
        var keep = true
        for(var p in values2){
          if( values1[n][0] == values2[p][0] && values1[n][1] == values2[p][1]){
            keep=false ; break ;
          }

          for(var q in values3){
            if( values1[n][0] == values3[q][0] && values1[n][1] == values3[q][1]){
              keep=false ; break ;
            }

            for(var r in values4){
              if( values1[n][0] == values4[r][0] && values1[n][1] == values4[r][1]){
                keep=false ; break ;
              }
            }  
          }  
        }
        if(keep){ resultArray.push(values1[n])};
      }
      s1.clear()
      s1.getRange(1,1,resultArray.length,resultArray[0].length).setValues(resultArray);
    }

非常感谢您的建议! :)

1 个答案:

答案 0 :(得分:1)

我认为我们几乎有同样的情况。这是一个可能重复的问题。请参阅此post

提供的答案如下(不是我的代码):

function removeDupsInOtherSheets() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s1 = ss.getSheetByName("Sheet1").getDataRange().getValues();  
  var s2 = ss.getSheetByName("Sheet2").getDataRange().getValues(); 
  var s3 = ss.getSheetByName("Sheet3").getDataRange().getValues();  
  // iterate s3 and check in s1 & s2 if duplicate values exist
  var nS1 = [];
  var nS2 = [];
  var s3Col1 = [];// data in column1 of sheet3
  for(var n in s3){
    s3Col1.push(s3[n][0]);
  }
  for(var n in s1){ // iterate sheet1 and test col 1 vs col 1 in sheet3
    var noDup1 = checkForDup(s1[n],s3Col1)
    if(noDup1){nS1.push(noDup1)};// if not present in sheet3 then keep
  } 
  for(var n in s2){  // iterate sheet2 and test col 1 vs col 1 in sheet3
    var noDup2 = checkForDup(s2[n],s3Col1)
    if(noDup2){nS2.push(noDup2)};// if not present in sheet3 then keep
  }
  Logger.log(nS1);// view result
  Logger.log(nS2);
  ss.getSheetByName("Sheet1").getDataRange().clear();// clear and update sheets
  ss.getSheetByName("Sheet2").getDataRange().clear();
  ss.getSheetByName("Sheet1").getRange(1,1,nS1.length,nS1[0].length).setValues(nS1);
  ss.getSheetByName("Sheet2").getRange(1,1,nS2.length,nS2[0].length).setValues(nS2);
}

function checkForDup(item,s){
  Logger.log(s+' = '+item[0]+'  ?')
    if(s.indexOf(item[0])>-1){
      return null;
    }
  return item;
}

希望这有帮助。