Google脚本:如果其中的值存在于另一个工作表中,请删除该行

时间:2014-02-25 08:20:23

标签: javascript google-apps-script google-sheets

我对Google Scripting有疑问。我刚刚在今年二月开始使用Google Script,所以我还没有深入了解它。无论如何我的问题是:

如果某行的某些值存在于另一张表格中,我可以删除该行吗?我尝试了几个我在互联网上找到的概念,但是我无法想出一个有效的功能。

这是详细视图的Google Doc

例如,在Sheet 1中,我有两行:


NAME | PLACE | AGE

卡尔|佛罗里达| 45

迈克|佛罗里达| 41


在表2中:


NAME | PLACE | AGE

迈克|佛罗里达| 41


脚本应该删除Sheet 1中的Mike Florida行,因为它在Sheet 2中有重复的数据。所以基本上,如果Sheet 1中的数据存在于Sheet 1中,它应该在Sheet 1中删除。但是棘手的部分是,I必须仅比较第1列和第2列。第3列并不重要。如果工作表2中的第1列和第2列在工作表1中具有相同的确切值,则应在工作表1中将其删除,并且工作表2中的数据应保留。

我在Google网站上尝试了此tutorial,但我仍然无法比较两张图并删除重复的数据。

非常感谢你。任何帮助/想法/建议将不胜感激。 :)

+++++++++

我现在想出了一个代码并使用了2D Arrays Library。

function deleteRowInSheet1() { 
   var s1 = SpreadsheetApp.openById("COPY SPREADSHEET ID HERE").getSheetByName('Sheet1');
   var s2 = SpreadsheetApp.openById("COPY SPREADSHEET ID HERE").getSheetByName('Sheet2'); 
   var values1 = s1.getDataRange().getValues();
   var values2 = s2.getDataRange().getValues();
  // Check if Mike exists in SS1.
  if (ArrayLib.find(values2, 0, 'Mike') != -1) {
    for( var row = values1.length -1; row >= 0; --row ) {
      if (values1[row][0] == 'Mike')
      s1.deleteRow(parseInt(row)+1);
    }
  }
}

但是,这段代码只能获得迈克的特定价值。如果工作表2中存在行Mike,则工作表1中的行Mike也将被删除。我尝试修改代码以比较两个不同工作表中的两个值,但我似乎无法使其工作。

1 个答案:

答案 0 :(得分:3)

您使用的2D数组库的问题是find方法返回与其在数组中的位置相对应的整数,在这种情况下,这对您来说并不是真正有用的信息。 我建议在两个数组中循环(这非常快)并使用布尔值来确定我们是否保留(或不保留)sheet1中的值。 这是我用于测试的代码,它似乎按预期工作。

function deleteRowInSheet1() { 
  var s1 = SpreadsheetApp.openById("1RxtFWZJRWxgW-zUM6S-dvZ0yFe-G2DGJFWI3gAt-1T0").getSheetByName('Sheet1');
  var s2 = SpreadsheetApp.openById("1RxtFWZJRWxgW-zUM6S-dvZ0yFe-G2DGJFWI3gAt-1T0").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);
}

正如您所看到的,我删除整个工作表以使用新数据阵列重建它,但这样做我松开了可能存在的任何格式。如果这对您来说是一个问题,那么您将不得不使用clearContents()See doc here但删除最后一行下面每个未使用行中的任何格式...我猜不是很难实现。