移动行循环在谷歌脚本中不起作用

时间:2018-03-12 13:30:42

标签: google-apps-script google-sheets

我有一个谷歌应用程序令我感到沮丧。它基本上是对副本行脚本的修改,现在可以循环遍历该值的特定列。如果该列中的值大于要监视的值,我希望该行移动到下一个工作表。在这种情况下为3。

我已经最好地修改了它但却不明白为什么它没有执行。任何人都可以帮助我筛选代码并找出我错过的内容吗?

function moveAllRightRows(){
//this script is supposed to move every row in Sheet1 to Sheet2 
//if the value in a cell is greater than 3

  var columnNumberToWatch = 9; //column where value will be filled
  var valueToWatch = 3; //integer that determines trigger value
  var sheetNameToMoveTheRowTo = "Sheet2";      

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("Sheet1");
  var row = 1;
  var len = sheet.getRange(1 , columnNumberToWatch, sheet.getLastRow() - 1).length; 
  var range = sheet.getRange(row,9,sheet.getLastRow()-1,1); //get column 9 from row 1 to the end

  for (row ; row <len ; row++){

  if (range.getValue() > valueToWatch) { //if the value in the column is greater than 3

  var targetSheet = ss.getSheetByName(sheetNameToMoveTheRowTo);
  var targetRange = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
  sheet.getRange(row, 1, 1, sheet.getLastColumn()).moveTo(targetRange);
  sheet.deleteRow(row);


  }
}
}

1 个答案:

答案 0 :(得分:0)

我相信你的剧本错误:

  • 长度属性只能在数组/字符串上调用,而不能在对象上调用。
  • range.getValue()仅返回给定范围内的左上角单元格。因此,您不是循环遍历列中的所有单元格,而只是遍历给定列中的第一个单元格。因此,通过循环的每次迭代(行++),只检查第一个单元格(单元格I1),是否大于3.使用getValues()代替。
  • 删除行会导致行号发生变化。如果第4行被删除,第5行将成为第4行。因此,为避免混淆,我们反转循环并执行自下而上的方法(从最后一行开始)。
  • 更好的选择是获取数组和setValues()而不是moveTo()

修改要点:

尝试修改

    var len = sheet.getRange(1 , columnNumberToWatch, sheet.getLastRow() - 1).length; 
    var range = sheet.getRange(row,9,sheet.getLastRow()-1,1); //get column 9 from row 1 to the end
    for (row ; row <len ; row++){
      if (range.getValue() > valueToWatch) { //if the value in the column is greater than 3
      var targetSheet = ss.getSheetByName(sheetNameToMoveTheRowTo);
      var  targetRange = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
      sheet.getRange(row, 1, 1, sheet.getLastColumn()).moveTo(targetRange);
      sheet.deleteRow(row);

 var range = sheet.getRange(row,9,sheet.getLastRow(),1).getValues(); //get  Values of column 9 from row 1 to the end
 var len = range.length;
 var targetSheet = ss.getSheetByName(sheetNameToMoveTheRowTo);
 for (row=len; row> 0 ; row--){
  if (range[row-1][0]> valueToWatch) { //if the value in the column is greater than 3
      var targetRange = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
      sheet.getRange(row, 1, 1,sheet.getLastColumn()).moveTo(targetRange);
      sheet.deleteRow(row);
     }}