【发布时间】:2018-10-16 08:58:18
【问题描述】:
我正在尝试使用 for 循环在数据表中查找某些值,并且根据该值是否为 =“是”,它将将该行移动到另一张表。循环应进一步查找 requesttype 的值(在本例中为 SRM、CC 或 TM1),并仅将行的某些部分移动到另一个工作表。
因此,for 循环应根据数据表中两个不同列的输入复制行:“所有输出”
因此,虽然我的代码在运行时通常可以正常工作,但它似乎只对输入“是”的行的一半执行该函数。
每次我运行脚本时,应该移动一半的行,移动,但另一半留在原始工作表中。我可以运行代码直到只剩下一行,在这种情况下什么都不会发生。
这是我所拥有的:
function myonEdit2() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = SpreadsheetApp.getActiveSheet();
var range = sheet.getActiveCell();
var sheetNameToWatch = "Open Requests";
var columnNumberToWatch = 38;
var watchColumn = 2;
var valueToWatch = "Yes";
var datarange = sheet.getRange(9, 2, 900, 36).getValues();
var sheetNameToMoveTheRowTo = "Closed Requests"
for (i = 0; i < datarange.length -1; i++) {
if (datarange[i][35] == "Yes") {
var targetSheet = ss.getSheetByName(sheetNameToMoveTheRowTo);
if (datarange[i][0] == "SRM") {
var targetRange3 = targetSheet.getRange(targetSheet.getLastRow() + 1, 2);
sheet.getRange(i, 2, 1, 8).moveTo(targetRange3);
sheet.deleteRow(rowstart + i);
}
else if (datarange[i][0] == "GC") {
var targetRange3 = targetSheet.getRange(targetSheet.getLastRow() + 1, 2);
sheet.getRange(i, 2, 1, 8).moveTo(targetRange3);
sheet.deleteRow(i);
}
else if (datarange[i][0] == "TM1") {
var targetRange4 = targetSheet.getRange(targetSheet.getLastRow() + 1, 2, 1, 6);
sheet.getRange(i, 2, 1, 6).moveTo(targetRange4);
var targetRange5 = targetSheet.getRange(targetSheet.getLastRow(), 10, 1, 1)
sheet.getRange(i, 13, 1, 1).copyTo(targetRange5)
sheet.deleteRow(i);
}
}
}
正如我所说,代码工作正常,但它并没有针对它应该执行的所有行执行。
从上面可以看出,我将 for 循环范围定义为表所在的完整数据表。然后我创建第一个(主)if 条件,即数据范围的第 36 列为“是”。这应该定义脚本将针对哪些行执行。
第二个 if 条件定义了应该复制行的哪些确切列,并取决于第一列是 = SRM、CC 还是 TM1。
如果有人能帮我弄清楚为什么代码不能对所有行都执行,那就太好了。
【问题讨论】:
-
如前所述,您正在向前迭代并改变被迭代的底层范围,而不补偿所述突变。
-
感谢您的回答。但是我不确定如何补偿突变。我知道如果我需要通过
for (i = lastrow; i>9,i--)进行反向迭代但是,当我运行它时,即使我尝试只运行删除行部分,它仍然会和以前一样。 -
确保您在问题中显示的代码反映了您的尝试并描述了这些尝试的结果。还要了解 JavaScript
Array元素索引和Range行号和列号之间的区别
标签: google-apps-script google-sheets