由于 Drive API 配额,服务配额以及脚本执行时间的限制6 min
将 Google Drive 文件操作拆分为多个块通常很重要。
我们可以用属性服务储藏continuationToken
for 文件夹迭代器 or 文件迭代器。
这样我们就可以停止我们的脚本,并在下次运行时从我们停止的地方继续。
工作示例(线性迭代器)
// Logs the name of every file in the User's Drive
// this is useful as the script may take more that 5 minutes (max execution time)
var userProperties = PropertiesService.getUserProperties();
var continuationToken = userProperties.getProperty('CONTINUATION_TOKEN');
var start = new Date();
var end = new Date();
var maxTime = 1000*60*4.5; // Max safe time, 4.5 mins
if (continuationToken == null) {
// firt time execution, get all files from Drive
var files = DriveApp.getFiles();
} else {
// not the first time, pick up where we left off
var files = DriveApp.continueFileIterator(continuationToken);
}
while (files.hasNext() && end.getTime() - start.getTime() <= maxTime) {
var file = files.next();
Logger.log(file.getName());
end = new Date();
}
// Save your place by setting the token in your user properties
if(files.hasNext()){
var continuationToken = files.getContinuationToken();
userProperties.setProperty('CONTINUATION_TOKEN', continuationToken);
} else {
// Delete the token
PropertiesService.getUserProperties().deleteProperty('CONTINUATION_TOKEN');
}
问题(递归迭代器)
为了检索文件夹的树状结构并获取其文件,我们必须使用递归函数。像这样的东西:
doFolders(DriveApp.getFolderById('root folder id'));
// recursive iteration
function doFolders(parentFolder) {
var childFolders = parentFolder.getFolders();
while(childFolders.hasNext()) {
var child = childFolders.next();
// do something with folder
// go subfolders
doFolders(child);
}
}
但是,在这种情况下我不知道如何使用continuationToken
.
Question
如何使用ContinuationToken
使用递归文件夹迭代器,当我们需要抛出所有文件夹结构时?
假设
根据名称构建许多标记是否有意义id
每个parent
folder?