优化脚本 运行 收集大量电子表格选项卡信息的时间

Optimizing Script run time gathering large volume of spreadsheet tab information

我希望有人可能对我在下面编写的 Google Apps 脚本的策略有替代建议,以帮助它在超时前完成 运行ning。我有一个很长的 Spreadsheet 列表(大约 200 个),每个列表中有 20-100 个 sheets/tabs。我正在尝试遍历整个 spreadsheets 列表以收集有关每个人的信息 sheet(总共约 8,000)但不幸的是 运行 一次完成很慢 运行.

提前感谢您的任何建议

function getListofTabs(urlName) {
 var ssRecipeTable = SpreadsheetApp.openByUrl(urlName); 
 
 
 var tabs = ssRecipeTable.getSheets(); 
   for(var i=0;i<tabs.length;i++){
     sheetName = tabs[i].getName();
     sheetID = tabs[i].getSheetId(); 
     sheetURL = tabs[i].getParent().getId(); 
     //Logger.log(sheetName,sheetID,sheetURL); 
     dataList.appendRow(['=HYPERLINK("https://docs.google.com/spreadsheets/d/'+tabs[i].getParent().getId()+'/edit#gid='+tabs[i].getSheetId()+'","'+tabs[i].getName()+'")',tabs[i].getName(),tabs[i].getParent().getId(),tabs[i].getSheetId()]); 
 }
}

//Function to feed getListofTabs function with list of all recipe workbooks
function getArray(){
  
  //Temp location for active tests
  var recipeDataSS = SpreadsheetApp.getActiveSpreadsheet(); 
  
  //List of all Recipe workbooks from master Tested Recipe folder
  var listofWorkbooks = recipeDataSS.getSheetByName('ListofWorkbooks'); 
  
  //Location for data input sheet for Plx Upload
  var dataList = recipeDataSS.getSheetByName('Spreadsheets2');
  
  //gets list of workbooks urls, loops through until the end
  var dataRecipe = listofWorkbooks.getDataRange().getValues(); 
  for(var x=0; x<dataRecipe.length; x++)
  {
    var urlName = dataRecipe[x][0]; 
    getListofTabs(urlName); 
  }}```

You should get rid of appendRow() in the for loop.

为此,您需要在 for 循环之前创建一个空数组,然后 push() 将新值放入该数组。然后在 for 循环之后,使用 setValues() 将值添加到 sheet。这样,您调用 setValues() 一次,而不是调用 appendRow() tabs.length

例如,函数 getListofTabs(urlName) 可以替换为:

function getListofTabs(urlName) {

 var ssRecipeTable = SpreadsheetApp.openByUrl(urlName); 
 
 var dat = []

 var tabs = ssRecipeTable.getSheets(); 
   for(var i=0;i<tabs.length;i++){
     sheetName = tabs[i].getName();
     sheetID = tabs[i].getSheetId(); 
     sheetURL = tabs[i].getParent().getId(); 
     //Logger.log(sheetName,sheetID,sheetURL); 
     dat.push(['=HYPERLINK("https://docs.google.com/spreadsheets/d/'+tabs[i].getParent().getId()+'/edit#gid='+tabs[i].getSheetId()+'","'+tabs[i].getName()+'")',tabs[i].getName(),tabs[i].getParent().getId(),tabs[i].getSheetId()]); 
 }

dataList.getRange(dataList.getLastRow()+1,1,dat.length,dat[0].length).setValues(dat);

}

写GAS时请仔细阅读best practices