我正在尝试使用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循环范围定义为该表所在的完整数据表。然后,如果条件即数据范围的第36列为“是”,则创建第一个(主)条件。这应该定义脚本将针对哪些行执行。
第二个if条件定义应复制该行的确切列,并取决于第一列是= SRM,CC还是TM1。
如果有人可以帮助我弄清楚为什么不对所有行都执行该代码的原因,那就太好了。
答案 0 :(得分:0)
我发生了类似的问题,这似乎也是这里的问题。 您正在获取数据范围并向其添加for循环以处理每一行。现在,您要删除之间的行,但是有一个定义的数据数组,其中添加了for循环。因此,当前几行将被删除时,for循环数组的结构将保持不变,但工作表结构将作为示例进行更改,以考虑第二行已删除并且您的条件在i = 5处匹配,但工作表结构现在将具有第5行向上移动。
因此,您可以尝试添加行以保留在数组中,并清除工作表一次,然后在完成复制工作表数据的处理后一次将该数组添加到工作表中,或者尝试删除已删除的行完成处理后从工作表移至另一工作表