我对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也将被删除。我尝试修改代码以比较两个不同工作表中的两个值,但我似乎无法使其工作。
答案 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但删除最后一行下面每个未使用行中的任何格式...我猜不是很难实现。