优化脚本 运行 收集大量电子表格选项卡信息的时间
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
我希望有人可能对我在下面编写的 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