我正在尝试使用for循环在数据表中查找特定值,并根据该值是否= "Yes“将该行移动到另一个工作表。循环应进一步查找requesttype的值(在本例中为SRM、CC或TM1),并仅将行的某些部分移动到另一个工作表。
因此,for循环应该基于数据表中两个不同列的输入复制行:"All Outputs“
因此,虽然我的代码在运行时通常可以正常工作,但它似乎只对输入了“Yes”的一半行执行函数。
每次我运行脚本时,应该移动的行的一半会被移动,但另一半会留在原始表中。我可以运行代码,直到只剩下一行,在这种情况下,什么也不会发生。
这就是我所拥有的:
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列为"Yes“。这应该定义将为哪些行执行脚本。
第二个if条件定义应该复制行的确切列,并取决于第一列是= SRM、CC还是TM1。
如果有人能帮我弄清楚为什么代码不能对所有行执行,那就太好了。
发布于 2018-10-16 18:38:54
类似的问题也发生在我身上,这似乎也是这里的问题。您正在获取数据范围,并向其添加一个for循环来处理每一行。现在,您正在删除中间的行,但是有一个已定义的数据数组,您已经在其中添加了for循环。因此,当前面的行将被删除时,for循环数组结构将保持不变,但工作表结构将发生变化。例如,假设第二行被删除,并且您的条件在i=5中匹配,但是工作表结构现在将第5行向上移动。
因此,您可以尝试添加要保留在数组中的行,并清除工作表一次,然后在完成复制工作表数据的处理后将该数组一次性添加到工作表中,或尝试在完成处理后从工作表中移除已删除的行以移动到另一个工作表
https://stackoverflow.com/questions/52831664
复制相似问题