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 语句:如果行中的值包含字符串...设置另一列等于字符串