Google Apps脚本-将基于for循环匹配的数据范围移动到value =“ Yes”

时间:2018-10-16 08:58:19

标签: google-apps-script google-sheets

我正在尝试使用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。

如果有人可以帮助我弄清楚为什么不对所有行都执行该代码的原因,那就太好了。

Example sheet

1 个答案:

答案 0 :(得分:0)

我发生了类似的问题,这似乎也是这里的问题。 您正在获取数据范围并向其添加for循环以处理每一行。现在,您要删除之间的行,但是有一个定义的数据数组,其中添加了for循环。因此,当前几行将被删除时,for循环数组的结构将保持不变,但工作表结构将作为示例进行更改,以考虑第二行已删除并且您的条件在i = 5处匹配,但工作表结构现在将具有第5行向上移动。

因此,您可以尝试添加行以保留在数组中,并清除工作表一次,然后在完成复制工作表数据的处理后一次将该数组添加到工作表中,或者尝试删除已删除的行完成处理后从工作表移至另一工作表