Конечно, есть место для улучшений (например, он просто проверяет имя папки, чтобы увидеть, является ли оно резюме против перезапуска), но этого, скорее всего, будет достаточно для 95% людей, которым необходимо рекурсивно выполнять итерацию в папке с токенами продолжения.
квот Drive API,Квоты на услуги и ограничение времени выполнения скрипта6 min
часто очень важно разделять манипуляции с файлами на Google Диске на куски.
Мы можем использоватьPropertiesService хранитьcontinuationToken
заFolderIterator или жеFileIterator, Таким образом, мы можем остановить наш сценарий и при следующем запуске продолжить с того места, где остановились.
// 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
.
Как пользоватьсяContinuationToken
с рекурсивным итератором папок, когда нам нужно бросить всю структуру папок?
Имеет ли смысл создавать множество токенов с именем на основеid
каждогоparent
папка?