【问题标题】:Google app script - looping through the rows in a spreadsheet谷歌应用脚​​本 - 遍历电子表格中的行
【发布时间】:2017-05-01 05:17:02
【问题描述】:

我正在尝试遍历电子表格中的行并确定特定行是否具有关键字“hello”并将整行移动到新电子表格中。

我尝试了以下代码。该代码适用于第一行,但不会循环并在第一行之后停止。将范围选择扩展到“C1:E32”没有帮助。

function Edit(e) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var activatedSheetName = ss.getActiveSheet().getName();
  var ActiveSheet = ss.getSheetByName("ActiveSheet"); // source sheet
  var MoveDatatoThisSheet = ss.getSheetByName("MoveDatatoThisSheet"); //    target sheet
  var re = new RegExp(/(Hello)/i);
  var startRow = 1;
  var endRow = ss.getLastRow();
  var getRange = ss.getDataRange();
  var getRow = getRange.getRow();

  for (var ree = startRow; ree <= endRow; ree++) {
    // if the value in column D is "Approved", move the row to target sheet
    cellValue = ss.getRange("C1:E1");
    if (cellValue.getValue().match(re)) {
      // insert a new row at the second row of the target sheet
      MoveDatatoThisSheet.insertRows(2, 1);
      // move the entire source row to the second row of target sheet
      var rangeToMove = ActiveSheet.getRange(/*startRow*/ getRow, /*startColumn*/ 1, /*numRows*/ 1, /*numColumns*/ ActiveSheet.getMaxColumns());
      rangeToMove.moveTo(MoveDatatoThisSheet.getRange("A2"));
      // add date and time of when approved to target row in column E
      MoveDatatoThisSheet.getRange("E2").setValue(Date());
      // delete row from source sheet
      ActiveSheet.deleteRow(cellValue, 1);
    }
  }
}

【问题讨论】:

标签: javascript arrays for-loop google-apps-script google-sheets


【解决方案1】:

你的循环从不使用变量ree,它只使用cellValue = ss.getRange("C1:E1")

另一个问题是删除移动了被删除的行下的行,可能导致后续操作对错误的行进行操作。当您遍历一组行时,删除其中一些行时,要自下而上,而不是自上而下。

for (var ree = endRow; ree >= startRow; ree--) {   
  var rangeToCheck = ss.getRange(ree, 3, 1, 3); // 3 columns starting with column 3, so C-E range 
  if (rangeToCheck.getValues()[0].join().match(re)) {   // joining values before checking the expression
    MoveDatatoThisSheet.insertRows(2,1);
    var rangeToMove = ActiveSheet.getRange(/*startRow*/ getRow, /*startColumn*/ 1, /*numRows*/ 1, /*numColumns*/ ActiveSheet.getMaxColumns());
    rangeToMove.moveTo(MoveDatatoThisSheet.getRange("A2"));
    // add date and time of when approved to target row in column E
    MoveDatatoThisSheet.getRange("E2").setValue(Date());
    // delete row from source sheet
    ActiveSheet.deleteRow(ree);
  }
}

如果目标是只检查 D 列(比如说),代码会稍微简化

  var rangeToCheck = ss.getRange(ree, 4); //  column D in row ree
  if (rangeToCheck.getValue().match(re)) {   // joining values before checking the expression

性能

作为Google recommends,应该避免多次调用 getValues / setValues 等,而是一次获取所有必要的数据,对其进行处理,然后一次进行批量更改。例如,不要将其放在另一张纸上,而是将其添加到数组中;当循环结束时,将整个数组放在该表中。

【讨论】:

  • 您应该注意,这种方法对于任何大量行都可能非常慢,因为您在循环的每次迭代中都会调用电子表格服务。
猜你喜欢
  • 1970-01-01
  • 2012-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多