GoogleScript-加速简单循环

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

我刚刚开始涉足Google表格的VBA,并编写了一个脚本,但是它是如此之慢,是由于下面的错误还是有加速的方法?

此脚本的要点是具有3个[[work”选项卡和一个母版,以每天保存数据。设置完所有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"); } };
javascript google-apps-script google-sheets google-sheets-macros
2个回答
0
投票
加快速度的几种方法:

  1. 减少对工作表的呼叫:一种。尽可能在一次调用中从工作表中获取所有数据(如此处所示)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 }


0
投票
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){ 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"); } }); }
© www.soinside.com 2019 - 2024. All rights reserved.