能否以数组的形式对这一列进行迭代(会不会更有效率)?[重复]

问题描述 投票:0回答:1

经过大量的研究和挖掘通过谷歌应用程序脚本的微薄的文档,这是我已经找到了唯一的方式来迭代数据从谷歌表。有没有人知道,如果列可以转换为数组和迭代后更有效?下面的功能工作,但不是非常快。


function Recon(){

  var currentValue;

  var countAdvice = 0;

  var lastValue = null;

  var lastLine;

  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Transactions");

  var rowCount = spreadsheet.getLastRow();

  spreadsheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Dashboard")

  spreadsheet.getRange('D1').setValue(rowCount);

    var spreadsheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Transactions");


  for(var i = rowCount; i>1; i--){


    currentValue = spreadsheet.getRange('G'+i).getValue();


    if( lastValue != null && currentValue == (lastValue*(-1))){

      spreadsheet.getRange('M'+i).setValue('okay');
      spreadsheet.getRange('K'+i).setValue(currentValue);
      spreadsheet.getRange('L'+i).setValue(lastValue);


      spreadsheet.getRange('M'+lastLine).setValue('okay');
      countAdvice++;


    }

    lastValue = currentValue;

    lastLine = i;

}

    spreadsheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Dashboard")


    spreadsheet.getRange('E1').setValue(countAdvice);


}
javascript performance google-apps-script multidimensional-array google-sheets
1个回答
1
投票

每当你调用getRange()时,你都是在做一个HTTP调用,然后必须出去,获取数据,然后解析它。最好的做法是在大型数据集中取一次数据,然后也写一次。

你的代码中还有一些其他问题。

  • 变量spreadsheet正在改变它的引用,一旦它是事务,那么它就是dashboard。与其这样,不如单独创建2个变量,每个表引用一个。
  • 你的for循环是反向的,有什么原因吗?

请看下面的方法,基本可以做到1次取调用,1次写调用。

  var transSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Transactions");  
  var allRows = transSheet.getDataRange().getValues();
  var outputArray = [];

  // run through each row
  allRows.forEach( function(row) {
    var currentValue = row[6]; // column

    // if some condition applies
    if( currentValue == "whatever" ){
      // place values in certain columns in that particular row
      outputArray.push( ["this goes into col K", "this into col L", "this goes into col M" ] )

    } else {
      // place empty values in those columns
      outputArray.push( ["", "", "" ])
    }
  });

  // now the output is ready to be inserted
  var startInsertingAtThisColumn = 7; // G
  var writeOutputToSheet = transSheet.getRange( 1, startInsertingAtThisColumn, outputArray.length, outputArray[0].length ).setValues( outputArray );

引用- getDataRange

© www.soinside.com 2019 - 2024. All rights reserved.