Google Script:如果行中的值存在于另一个工作表中,则删除行

Posted

技术标签:

【中文标题】Google Script:如果行中的值存在于另一个工作表中,则删除行【英文标题】:Google Script: Delete row if a value in it exists in another sheet 【发布时间】:2014-02-25 08:20:22 【问题描述】:

我有一个关于 Google 脚本的问题。我今年 2 月才开始使用 Google Script,所以对它还没有深入的了解。无论如何,我的问题是:

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

这里是Google Doc 查看详细信息。

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


姓名 |地点 |年龄

卡尔 |佛罗里达 | 45

迈克 |佛罗里达 | 41


在第 2 页中:


姓名 |地点 |年龄

迈克 |佛罗里达 | 41


脚本应该删除表 1 中的 Mike Florida 行,因为它在表 2 中有重复的数据。所以基本上,如果表 2 中的数据存在于表 1 中,它应该在表 1 中删除。但棘手的部分是,我只需要比较第 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);
    
  

但是,此代码仅获取特定值,即 Mike。如果 Sheet 2 中存在 Mike 行,Sheet 1 中的行 Mike 也将被删除。我尝试更多地修改代码以比较两个不同工作表中的两个值,但我似乎无法使其工作。

【问题讨论】:

只是一个细节问题:脚本是否也应该检查工作表 1 中的重复项还是不会发生这种情况? 嗨@Sergeinsas,这部分不会发生,因为工作表 1 的内容是独一无二的。我现在能够想出一个几乎与我需要的代码相似的工作代码。但我仍然有一个问题。我更新了我的问题。您可能对将这两个值与我当前的代码进行比较有任何想法:) 【参考方案1】:

您使用的二维数组库的问题是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 但删除最后一行下方每个未使用行中的任何格式...我猜实现起来并不难。

【讨论】:

嗨@Sergeinsas! :) 谢谢这些。我会试一试。如果我有它的工作,我会更新你。 :) 它按预期工作。 :) 我刚刚编辑了代码以满足我需要的输出。非常感谢! :)

以上是关于Google Script:如果行中的值存在于另一个工作表中,则删除行的主要内容,如果未能解决你的问题,请参考以下文章

检查一列中的值是不是存在于另一列中,如果存在,则将另一列中的值复制到新列中

条件 If 语句:如果行中的值包含字符串...设置另一列等于字符串

R:基于一个列的值存在于另一列中,生成虚拟变量

如果行具有匹配的 ID,则将多行中的值合并为一行(单独的单元格)。如果 ID 只存在一次,则为 NULL 值

如果行不存在具有相同的值,如何在 Mysql 中插入行

从一个表中返回不存在于另一个表中的值