简体   繁体   English

Google Apps 脚本运行得更快

[英]Google Apps Script run faster

Below I have some code I have running for a spreadsheet.下面我有一些我为电子表格运行的代码。 Right now it takes a min or two to run through the script.现在运行脚本需要一两分钟。 I was wondering if anyone has any suggestions on how to re-work my code to run a little faster.我想知道是否有人对如何重新编写我的代码以更快地运行有任何建议。

What the code does is search on a tab in the sheet called "set up" for check-marked items in a list that I would like included in my "Master Sheet".代码的作用是在工作表中名为“设置”的选项卡上搜索我希望包含在“主工作表”中的列表中的选中标记项目。 Then go to my sheet which contains all of the information that I would like copied and pasted over according to what is check marked on my set-up page.然后 go 到我的工作表,其中包含我想要根据我的设置页面上标记的复选标记复制和粘贴的所有信息。 Then copy and paste those line items to the master sheet.然后将这些行项目复制并粘贴到主表。

function allToMaster(){
  var sss = SpreadsheetApp.getActive();
  var ssAll = sss.getSheetByName("FF All");
  var ssMaster = sss.getSheetByName("FF Master");
  var ssSetup = sss.getSheetByName("FF Setup");

  ssMaster.clear();
  var masterCounter = 2;
  ssAll.getRange("P:P").clear();

  var sourceRange = ssAll.getRange(1,1,1,15);
  sourceRange.copyTo(ssMaster.getRange(1,1));

  //get last row of FF All
  var lastRowAll = ssAll.getLastRow();
  var lastRowMaster = ssMaster.getLastRow();

  ssAll.getRange("P2:P" + lastRowAll).setFormula("=index('FF Setup'!B:B,match(B2,'FF Setup'!C:C,0))");
  ssMaster.setRowHeightsForced(2, 500, 26);

  for (i=2;i<=lastRowAll;i++){
    if (ssAll.getRange(i,1).getBackground() == "#a8d08d"){
      var sourceRange = ssAll.getRange(i,1,1,15);
      sourceRange.copyTo(ssMaster.getRange(masterCounter,1));
      masterCounter++;
    } else if (ssAll.getRange(i,1).getBackground() == "#e2efd9"){
      var sourceRange = ssAll.getRange(i,1,1,15);
      sourceRange.copyTo(ssMaster.getRange(masterCounter,1));
      masterCounter++;
    } else {
      if (ssAll.getRange("P" + i).getValue() == true) {
        var sourceRange = ssAll.getRange(i,1,1,15);
        sourceRange.copyTo(ssMaster.getRange(masterCounter,1));
        ssMaster.setRowHeightsForced(masterCounter, 1, 136);
        masterCounter++;
      }
    }
    
  }
  ssAll.getRange("P:P").clear();

  //Clear Empty Subtitles
  var lastRowMaster = ssMaster.getLastRow();
  for (i=2;i<=lastRowMaster;i++){
    if (ssMaster.getRange(i,1).getBackground() == "#e2efd9"){
      if(ssMaster.getRange((i+1),1).getBackground() == "#e2efd9" || ssMaster.getRange((i+1),1).getBackground() == "#a8d08d"){
        ssMaster.deleteRow(i);
        ssMaster.insertRowAfter(500);
        i=i-1;
      }
    }
  }
  //Clear Empty Titles
  var lastRowMaster = ssMaster.getLastRow();
  for (i=2;i<=lastRowMaster;i++){
    if (ssMaster.getRange(i,1).getBackground() == "#a8d08d"){
      if(ssMaster.getRange((i+1),1).getBackground() == "#a8d08d"){
        ssMaster.deleteRow(i);
        ssMaster.insertRowAfter(500);
        i=i-1;
      }
    }
  }

  //Find the row with "Delivery"
  var deliveryRow = getRowOf("DELIVERY", "FF All", 1);
  var sourceRange = ssAll.getRange(deliveryRow,1,(lastRowAll - deliveryRow + 1),15);
  var masterCounter = ssMaster.getLastRow()
  sourceRange.copyTo(ssMaster.getRange(masterCounter,1));
  masterCounter = masterCounter + lastRowAll - deliveryRow - 2;

  //.setFormula('=SUMA(J264:J275)');
 // ssMaster.getRange(masterCounter, 10).setFormula("=sum(J2:J" + (masterCounter - 1) + ")");
  //ssMaster.getRange(masterCounter, 11).setFormula("=sum(K2:K" + (masterCounter - 1) + ")");
  //ssMaster.getRange(masterCounter, 13).setFormula("=sum(M2:M" + (masterCounter - 1) + ")");
  //ssMaster.getRange(masterCounter, 15).setFormula("=M" + masterCounter + " - K" + masterCounter);

}

function getRowOf(value, sheet, col){
  var dataArr = SpreadsheetApp.getActive().getSheetByName(sheet).getRange(4, col, 3500, 1).getValues();
  for(var j = 0; j < dataArr.length; j ++){
    var currVal = dataArr[j][0];
   if(currVal == value){
     return j+4;
     break;
   }
  }
  return 0;
}

You need to change the loops as they are doing several calls to Class SpreadsheetApp on each iteration.您需要更改循环,因为它们在每次迭代时都会多次调用 Class SpreadsheetApp。

Regarding the first loop,关于第一个循环,

for (i=2;i<=lastRowAll;i++){
    if (ssAll.getRange(i,1).getBackground() == "#a8d08d"){
      var sourceRange = ssAll.getRange(i,1,1,15);
      sourceRange.copyTo(ssMaster.getRange(masterCounter,1));
      masterCounter++;
    } else if (ssAll.getRange(i,1).getBackground() == "#e2efd9"){
      var sourceRange = ssAll.getRange(i,1,1,15);
      sourceRange.copyTo(ssMaster.getRange(masterCounter,1));
      masterCounter++;
    } else {
      if (ssAll.getRange("P" + i).getValue() == true) {
        var sourceRange = ssAll.getRange(i,1,1,15);
        sourceRange.copyTo(ssMaster.getRange(masterCounter,1));
        ssMaster.setRowHeightsForced(masterCounter, 1, 136);
        masterCounter++;
      }
    }
    
  }

Instead of getting the background of one cell at a time ( ssAll.getRange(i,1).getBackground() ), before the loop get the backgrounds of all the cells before the loop, ie而不是一次获取一个单元格的背景( ssAll.getRange(i,1).getBackground() ),在循环之前获取循环之前所有单元格的背景,即

const backgrounds = ssAll.getRange(2,1,lastRowAll).getBackgrounds();

then replace ssAll.getRange(i,1).getBackground() by backgrounds[i-1][0] .然后用backgrounds[i-1][0]替换ssAll.getRange(i,1).getBackground()

Do the something similar about ssAll.getRange("P" + i).getValue() , before the loop get the all values of the P column:在循环获取 P 列的所有值之前,对ssAll.getRange("P" + i).getValue()执行类似的操作:

const values = ssAll.getRange("P" + i + ":P" + lastRowAll).getValues()

then replace ssAll.getRange("P" + i).getValue() by values[i-1][0]`.然后将ssAll.getRange("P" + i).getValue()为 values[i-1][0]`。

It might be also possible to optimize further the first loop depending on if you really need to copy the ranges (besides values, include borders, background, notes, etc.) or if you only need the values.也可以进一步优化第一个循环,具体取决于您是否真的需要复制范围(除了值,包括边框、背景、注释等)或者您是否只需要这些值。

Another option is to use the Advances Sheets Services but this implies to make a completely different implementation.另一种选择是使用Advances Sheets Services,但这意味着要进行完全不同的实施。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM