Оптимизация времени выполнения скрипта, собирающего большой объем информации о вкладках электронной таблицы - PullRequest
1 голос
/ 05 августа 2020

Я надеюсь, что у кого-то может быть альтернативное предложение стратегии для сценария Google Apps, который я написал ниже, чтобы помочь ему завершить sh запуск до истечения времени ожидания. У меня есть длинный список электронных таблиц (около 200), каждая из которых содержит от 20 до 100 отдельных листов / вкладок. Я пытаюсь l oop просмотреть весь список электронных таблиц, чтобы собрать информацию о каждом отдельном листе (всего около 8000), но, к сожалению, он работает слишком медленно, чтобы завершить за один прогон.

Заранее спасибо за любые предложения

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); 
  }}```

1 Ответ

2 голосов
/ 05 августа 2020

Вы должны избавиться от appendRow () в for l oop.

Для этого вам нужно создать пустой массив перед для l oop, а затем pu sh () новые значения в этом массиве. Затем после l oop используйте setValues ​​() , чтобы добавить значения на лист. Таким образом, вы вызываете 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.

...