Google 6 分钟后脚本超时
Google Script timeout after 6 min
我想列出团队云端硬盘(超过 3000 个文件夹)中存在的所有文件夹名称及其文件夹 ID。我正在使用 speedsheet 和 运行 以下脚本中的代码-
function listFilesInFolder(folderName) {
var sheet = SpreadsheetApp.getActiveSheet();
sheet.appendRow(['Name','File-Id']);
//change the folder ID below to reflect your folder's ID (look in the URL when you're in your folder)
var folder = DriveApp.getFolderById('folder ID');
var contents = folder.getFolders();
var cnt = 0;
var folder;
while (contents.hasNext()) {
var folder = contents.next();
cnt++;
data = [
folder.getName(),
folder.getId(),
];
sheet.appendRow(data);
};
}
但是这是超出最大执行时间的错误,默认情况下是 6 分钟。
我尝试从脚本应用程序添加触发器,但触发后它从头开始,脚本仍然在 6 分钟后结束。
如何添加从离开的地方开始的触发器?
答案:
此脚本的缓慢部分是对 sheet.appendRow()
的重复调用。您可以通过将结果推送到数组并在循环结束时设置值来加快速度,而不是在 while
循环的每次迭代中附加一行。
更多信息:
使用 built-in 服务(例如 SpreadsheetApp
)时,在短 space 时间内对 sheet 进行大量更改时,速度通常会很慢。您可以通过尽可能减少对 built-in Apps 脚本服务的调用次数来解决这个问题,完全依靠 JavaScript 来进行处理。
代码更改:
function listFilesInFolder(folderName) {
const sheet = SpreadsheetApp.getActiveSheet()
//change the folder ID below to reflect your folder's ID (look in the URL when you're in your folder)
let folder = DriveApp.getFolderById('')
let contents = folder.getFolders()
let cnt = 0
let data = [['Name','File-Id']]
while (contents.hasNext()) {
folder = contents.next()
cnt++
data.push([
folder.getName(),
folder.getId(),
])
}
sheet.insertRows(sheet.getMaxRows(), data.length)
sheet.getRange(2, 1, data.length, 2).setValues(data)
}
代码改动:
data
声明为使用 header 行初始化的数组,而不是直接将其附加到 sheet
- 在循环的每次迭代中,当前文件夹的名称和 ID 作为新的数据行附加到
data
数组。
- 在遍历所有文件夹后,sheet 中的行数增加了
data
中的行数,以免出现越界错误
data
中的所有行都使用 setValues()
添加到 sheet。
在我的测试环境中,我进行了以下设置:
- 包含 3424 个文件夹的驱动器文件夹
在 while 循环中使用 appendRow()
方法,执行耗时 1105.256 秒(或 18 分钟)
在循环外使用push()
和.setValues()
方法,执行耗时4.478秒。
参考文献:
我想列出团队云端硬盘(超过 3000 个文件夹)中存在的所有文件夹名称及其文件夹 ID。我正在使用 speedsheet 和 运行 以下脚本中的代码-
function listFilesInFolder(folderName) {
var sheet = SpreadsheetApp.getActiveSheet();
sheet.appendRow(['Name','File-Id']);
//change the folder ID below to reflect your folder's ID (look in the URL when you're in your folder)
var folder = DriveApp.getFolderById('folder ID');
var contents = folder.getFolders();
var cnt = 0;
var folder;
while (contents.hasNext()) {
var folder = contents.next();
cnt++;
data = [
folder.getName(),
folder.getId(),
];
sheet.appendRow(data);
};
}
但是这是超出最大执行时间的错误,默认情况下是 6 分钟。
我尝试从脚本应用程序添加触发器,但触发后它从头开始,脚本仍然在 6 分钟后结束。
如何添加从离开的地方开始的触发器?
答案:
此脚本的缓慢部分是对 sheet.appendRow()
的重复调用。您可以通过将结果推送到数组并在循环结束时设置值来加快速度,而不是在 while
循环的每次迭代中附加一行。
更多信息:
使用 built-in 服务(例如 SpreadsheetApp
)时,在短 space 时间内对 sheet 进行大量更改时,速度通常会很慢。您可以通过尽可能减少对 built-in Apps 脚本服务的调用次数来解决这个问题,完全依靠 JavaScript 来进行处理。
代码更改:
function listFilesInFolder(folderName) {
const sheet = SpreadsheetApp.getActiveSheet()
//change the folder ID below to reflect your folder's ID (look in the URL when you're in your folder)
let folder = DriveApp.getFolderById('')
let contents = folder.getFolders()
let cnt = 0
let data = [['Name','File-Id']]
while (contents.hasNext()) {
folder = contents.next()
cnt++
data.push([
folder.getName(),
folder.getId(),
])
}
sheet.insertRows(sheet.getMaxRows(), data.length)
sheet.getRange(2, 1, data.length, 2).setValues(data)
}
代码改动:
data
声明为使用 header 行初始化的数组,而不是直接将其附加到 sheet- 在循环的每次迭代中,当前文件夹的名称和 ID 作为新的数据行附加到
data
数组。 - 在遍历所有文件夹后,sheet 中的行数增加了
data
中的行数,以免出现越界错误 data
中的所有行都使用setValues()
添加到 sheet。
在我的测试环境中,我进行了以下设置:
- 包含 3424 个文件夹的驱动器文件夹
在 while 循环中使用 appendRow()
方法,执行耗时 1105.256 秒(或 18 分钟)
在循环外使用push()
和.setValues()
方法,执行耗时4.478秒。