Google应用脚本 - 循环显示电子表格中的行

时间:2016-12-15 14:46:15

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

我正在尝试遍历电子表格中的行,并确定某个特定行是否包含关键字" 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);
  }

}

        }

}

1 个答案:

答案 0 :(得分:2)

您的循环从不使用变量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等,而是一次性获取所有必要数据,处理它,并立即进行批量更改。例如,不是将其放在另一张纸中,而是将其添加到数组中;当循环结束时,将整个数组放在该表中。