Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/216.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
For loop 有没有一种方法可以加速Google脚本中的for循环?_For Loop_Google Apps Script_Google Sheets - Fatal编程技术网

For loop 有没有一种方法可以加速Google脚本中的for循环?

For loop 有没有一种方法可以加速Google脚本中的for循环?,for-loop,google-apps-script,google-sheets,For Loop,Google Apps Script,Google Sheets,我有一个for循环,它正在我的google工作表上工作,但是过滤2100行数据大约需要5分钟。我已经读过关于使用过滤器和去掉for循环的书,但是我对用googlescript编码还相当陌生,还没有弄清楚这方面的语法。非常感谢您的建议 代码如下: function Inspect() {a var sSheet = SpreadsheetApp.getActiveSpreadsheet(); var srcSheet = sSheet.getSheetByName("Inventor

我有一个for循环,它正在我的google工作表上工作,但是过滤2100行数据大约需要5分钟。我已经读过关于使用过滤器和去掉for循环的书,但是我对用googlescript编码还相当陌生,还没有弄清楚这方面的语法。非常感谢您的建议

代码如下:

function Inspect() {a

   var sSheet = SpreadsheetApp.getActiveSpreadsheet();
   var srcSheet = sSheet.getSheetByName("Inventory");
   var tarSheet = sSheet.getSheetByName("Inspections");
   var lastRow = srcSheet.getLastRow();

   for (var i = 2; i <= lastRow; i++) {
var cell = srcSheet.getRange("A" + i);
var val = cell.getValue();
if (val == true) {

  var srcRange = srcSheet.getRange("B" + i + ":I" + i);
  var clrRange = srcSheet.getRange("A" + i);

  var tarRow = tarSheet.getLastRow();
  tarSheet.insertRowAfter(tarRow);
  var tarRange = tarSheet.getRange("A" + (tarRow+1) + ":H" + (tarRow+1));
  var now = new Date();
  var timeRange = tarSheet.getRange("I"+(tarRow+1));
  timeRange.setValue(now);

  srcRange.copyTo(tarRange);
  clrRange.clear();
  //tarRange.activate();
  timeRange.offset(0, 1).activate();
}

}

};  

是的,为了加快速度,您需要首先获取所有值,并将逻辑应用于获得的2D数组而不是单元格,最后使用setValues更新工作表。我会选择这样的方式:

function Inspect() {

  var sSheet = SpreadsheetApp.getActiveSpreadsheet();
  var srcSheet = sSheet.getSheetByName("Inventory");
  var tarSheet = sSheet.getSheetByName("Inspections");
  var srcLastRow = srcSheet.getLastRow();
  var tarLastRow = tarSheet.getLastRow();

  var srcArray = srcSheet.getRange(1,1,srcLastRow,9).getValues();//(A1:I(lastrow))
  var tarArray = tarSheet.getRange(1,1,tarLastRow,9).getValues();//(A1:I(lastrow))

  for (var i = 1; i < srcArray.length; i++) {
    var val = srcArray[i][0];
    if (val == true) {
      var copyValues = srcArray[i].slice(1);//Get all elements from the row excluding first column (srcSheet.getRange("B" + i + ":I" + i);)
      var now = new Date();
      copyValues[8]=now;//set the time on column 9 (array starts at position 0!)

      var tarNewLine = copyValues;
      tarArray.push(tarNewLine);
      //clear values on source (except column A):
      for(var j=1;j<srcArray[i].length;j++){
        srcArray[i][j]="";    
      }
    }    
  } 
  tarSheet.clear();
  tarSheet.getRange(1, 1,tarArray.length,tarArray[0].length).setValues(tarArray);
  srcSheet.clear();
  srcSheet.getRange(1, 1,srcArray.length,srcArray[0].length).setValues(srcArray);
}; 
您无法绕过循环,但应将调用电子表格应用程序的次数降至最低,请参阅 不是for循环,而是那些使代码变慢的调用。相反,请尽可能多地使用阵列。如果循环是嵌套的,那么它们就会成为一个问题——这也是您应该避免的

示例如何在循环之外执行对SpreadsheetApp的大多数调用并使用阵列:

function Inspect() {  
  var sSheet = SpreadsheetApp.getActiveSpreadsheet();
  var srcSheet = sSheet.getSheetByName("Inventory");
  var tarSheet = sSheet.getSheetByName("Inspections");
  var lastRow = srcSheet.getLastRow();  
  var Acolumn =  srcSheet.getRange("A2:A" + lastRow);
  var Avalues = Acolumn.getValues();
  var srcRange = srcSheet.getRange("B2:I" + lastRow);
  var srcValues = srcRange.getValues();
  var array = [];
  var now = new Date();
  for (var i = 0; i < lastRow-1; i++) {  
    var val = Avalues[i][0];
    if (val == true) {
      srcValues[i].push(now);
      array.push(srcValues[i]);
      var clrRange = Acolumn.getCell(i+1, 1);
      clrRange.clear();
    }
  }
  var tarRow = tarSheet.getLastRow();
  tarSheet.insertRowAfter(tarRow);
  if(array.length!=0){
    var tarRange = tarSheet.getRange("A" + (tarRow+1) + ":I" + (tarRow  + array.length));
    tarRange.setValues(array);

  }
};