【发布时间】:2020-06-05 11:49:03
【问题描述】:
我在使用 Google Apps 脚本和 deleteRow() 和 deleteRows() 方法这两个函数时遇到问题。
下面的代码使用字符串匹配测试列中是否存在字符串。如果字符串存在,那么我想做一些事情,在这种情况下,删除我活动工作表中的几行。
问题是它删除了第一行或一行,然后在我下面的代码中似乎没有删除下一行。
我已经能够验证,即使我从最后一行开始到第一行或从第一行到最后一行从工作表的末尾开始工作,也存在同样的问题。
它删除一行,但从不删除多于一行。在我的情况下,不会产生任何错误,只是使用任何一种方法都不会删除行。
var data = ws.getRange("A2:U" + ws.getLastRow()).getValues();
var i = 0;
var W = 23;
var deleted = "DELETED";
var sheetDataAsArr = SpreadsheetApp.getActiveSheet().getDataRange().getValues(); // 2020Members
sheetDataAsArr.forEach(function(row,i) {
// The i is a index
if ( row[W] = 'DELETED' ) {
// DO SOMETHING HERE
Logger.log('EMAIL DELETED ROW row is :' + row[B]); // The email
ws.deleteRow(i+1); // It deleted the record
i--; // Decrement i because record was deleted
}
i++;
});
这个问题很奇怪,我已经能够使用这两个函数进行复制。它不会删除下一行,但我可以看到下一行,因为我显示了正确的电子邮件地址,但没有通过循环第二次执行删除,但也没有产生任何错误消息,只是没有执行第二次删除一个,但删除第一行就好了。
它只允许我删除一行,最多删除一行
var ws = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("2020Members");
The following above works fine now
var myValue = ws.getRange(i+1, W).getValue();
这是 W 列中工作表中的值,并且 if 现在也有效!
无论我是从最后一行到第一行但不是标题,它仍然只允许我删除一行并在下一行停止,所以如果我从第一行到最后一个或从最后一个到第一个遍历工作表不会让我只删除一行并停止。
在进行第二次删除之前我需要sleep 或flush 吗?
上面的第二个代码示例我什至尝试使用ws.deleteRows(i+1,1); 并发生同样的问题。
The following above works fine now
var myValue = ws.getRange(i+1, W).getValue();
This is the value in the sheet in the W column and the if works now also !
【问题讨论】:
-
在进行第二次删除之前我是否需要睡觉或冲洗一些东西?
-
你知道JS没有
=比较运算符吧?你所做的是写了一个 总是 通过的if(true)声明。接下来,i--什么都不做,因为forEachworks 不是这样。此外,row[U]将始终为true或始终为false(要么不保持循环,要么与U一起做某事)。一旦你处理了上述问题,问题就应该消失了 -
对不起,我对应用程序脚本不熟悉,有点生疏!请解释 ?我确实知道 row[U] 在我的情况下是真还是假 iit 是在该列中选中的复选框!
-
GAS 是 JavaScript 之上的一个便利层,所以它下面是普通的旧 JS。请阅读
foEach和comparison。并删除外部范围i- 它是pointless。好吧,你可以忽略关于row[U]的声明——它并不总是真/假。 -
是的,它有效,但它也一直有效(因为赋值返回分配的值,即
DELETED,它是真实的,它总是评估为真)。至于您的问题-从您提供的代码来看,它应该删除ws表中从1到sheetDataAsArr.length的所有行。由于您可能在选中的复选框与在 colW中设置的DELETED之间存在相关性,因此您会看到正确的结果(如果这就是您的意思 - 但您的嵌套if肯定不会进行任何比较)跨度>
标签: javascript arrays google-apps-script google-sheets