簡體   English   中英

GoogleScript - 加速一個簡單的循環

[英]GoogleScript - Speeding up a simple loop

我剛剛開始涉足谷歌表格的 VBA 並編寫了一個腳本,但是,它非常慢,這是由於下面的錯誤還是有辦法加快速度?

此腳本的重點是每天有 3 個工作選項卡和一個母版來保存數據。 設置所有 VLookUps 后,我會將它們復制並粘貼為值,但​​到目前為止,循環速度太慢,甚至無法考慮使用它。

 function autoJ7(){ var masterSheet= SpreadsheetApp.getActive().getSheetByName('New Accounts Q4'); var masterLength = masterSheet.getLastRow(); for(var row = 1; row < masterLength; row++){ var rowPath=masterSheet.getRange(row,8).getValue(); if(rowPath<6) {} else if(rowPath<13) { masterSheet.getRange(row,16,1,1).activate().setFormula("=vlookup(A"+row+",\\'J+7\\'!A:M,13,0)"); Logger.log("Path A"); } else if(rowPath<20) { masterSheet.getRange(row,17,1,1).activate().setFormula("=vlookup(A"+row+",\\'J+14\\'!A:M,13,0)"); Logger.log("Path B"); } else if(rowPath<42) { masterSheet.getRange(row,18,1,2).activate().setFormula("=vlookup($A"+row+",\\'J+21\\'!$A:$M,13,0)"); Logger.log("Path C"); } };

有時使用直接寫入更簡單,因為您不想亂寫那些實際上不屬於流程的公式。 但是這個函數刪除了每個 rowPath 變量的單獨讀取,並且還消除了在宏中大量使用的 activates() 。

function autoJ7() {
  var ss=SpreadsheetApp.getActive();
  var msh=ss.getSheetByName('New Accoounts Q4');
  var mrg=msh.getRange(1,8,msh.getLastRow(),1);
  var mvA=mrg.getValues();
  mvA.forEach(function(r,i){
    var row=i+1;
    if(r[0]<13) {
      msh.getRange(row,16,1,1).setFormula("=vlookup(A"+row+",\'J+7\'!A:M,13,0)");            
      Logger.log("Path A");
    }else if(r[0]<20){
      msh.getRange(row,17,1,1).setFormula("=vlookup(A"+row+",\'J+14\'!A:M,13,0)");
      Logger.log("Path B");
    }else if(r[0]<42){
      msh.getRange(row,18,1,2).setFormula("=vlookup($A"+row+",\'J+21\'!$A:$M,13,0)");    
      Logger.log("Path C");
    }
  });
}

幾種加快速度的方法:

  1. 減少對工作表的調用: a. 盡可能在一次調用中從工作表中獲取所有數據(如此處的情況) b. 在一次調用中將數據或公式發布到工作表。

  2. 如果你有很多 if-else 條件, switch-case可能會更快。 在這種情況下,也許不是。 但我覺得它更優雅。 :-D

以下是我將如何編寫腳本:

function autoJ7() {
  var masterSheet= SpreadsheetApp.getActiveSpreadsheet().getSheetByName('New Accounts Q4');
  var data = masterSheet.getDataRange().getValues(); // Get all the sheet data in one call
  var rowPath, sheetRow; // This avoids defining variables repeatedly inside the loop
  var formulas = []; // Array to hold formulas to be posted back to the Sheet
  for (var row = 0; row < data.length; row++) {
    sheetRow = row + 1; //To adjust for the array being zero-based
    rowPath = data[row][7];
    switch (rowPath) {
      case (rowPath < 6):
        formulas.push(["", "", ""]);
        break;
      case (rowPath < 13):
        formulas.push(["=vlookup(A"+sheetRow+",\'J+7\'!A:M,13,0)", "", ""]);
        break;
      case (rowPath < 20):
        formulas.push(["", "=vlookup(A"+sheetRow+",\'J+14\'!A:M,13,0)", ""]);
        break;
      case (rowPath < 42):
        formulas.push(["", "", "=vlookup($A"+sheetRow+",\'J+21\'!$A:$M,13,0)"]);
    }
  }
  masterSheet.getRange(1, 16, formulas.length, 3).setFormulas(formulas); // Post to sheet in one call
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM