Я пытаюсь найти конкретную c электронную таблицу (цель) в каждой папке (A). Эти папки находятся в папке (B), которые в свою очередь находятся в папке (C). Текущий скрипт у меня есть папка (C) и поиск по каждой (B) папке (A), а затем электронная таблица. Однако из-за большого количества папок (B) я поместил знак продолжения на уровне папок (A), чтобы отслеживать, какая папка (B) была найдена [или, по крайней мере, я считаю, что это то, что я делаю]. У меня проблема в том, что сценарий всегда возобновляется из одной и той же первой папки (B) вместо продолжения из последней папки (B), в которой был произведен поиск.
Папка (C) = baseFolder
Папка (B) = studentFolder
Папка (A) = AssessmentFolder
Spreadsheet (Target) = любая электронная таблица, которая содержит заданный ключ поиска
Ниже приведены фрагменты сценария что я использую.
if (continuationToken == null) {
// firt time execution, get all files from Drive
var allFolders = baseFolder.getFolders();
var Tokenalert = ui.alert('There is no token');
}
else {
// not the first time, pick up where we left off
var allFolders = DriveApp.continueFolderIterator(continuationToken);
}
while (allFolders.hasNext() && end.getTime() - start.getTime() <= maxTime) {
i++;
var studentFolder = allFolders.next();
var AssessmentFolder = studentFolder.getFoldersByName("02 Assessment");
if (AssessmentFolder.hasNext() == true){
Logger.log(studentFolder.getName());
progress.getRange(i,1).setValue(studentFolder.getName());
AssessmentFolder = AssessmentFolder.next();
if (AssessmentFolder.searchFiles(checkcode).hasNext() == true){
var filetochange = AssessmentFolder.searchFiles(checkcode);
var editfile = filetochange.next();
progress.getRange(i,2).setValue(editfile);
Logger.log(editfile);var fileid = editfile.getId();
var editss = SpreadsheetApp.openById(fileid);
Logger.log(editss.getName());
progress.getRange(i,3).setValue(fileid);
var editsheet = editss.getSheetByName(sheettoedit);
// remove protection from the sheet mentioned
// Protect the active sheet except B2:C5, then remove all other users from the list of editors.
var protection = editsheet.protect().setDescription('Test');
if (protectrange != 0) {
var unprotected = editsheet.getRange(protectrange);
}
if (protectrange2 != 0) {
var unprotected2 = editsheet.getRange(protectrange2);
}
else {
unprotected2 = unprotected;
}
if (protectrange3 != 0) {
var unprotected3 = editsheet.getRange(protectrange3);
}
else {
unprotected3 = unprotected2;
}
protection.setUnprotectedRanges([unprotected, unprotected2]);
// Ensure the current user is an editor before removing others. Otherwise, if the user's edit
// permission comes from a group, the script throws an exception upon removing the group.
var me = Session.getEffectiveUser();
protection.addEditor(me);
protection.removeEditors(protection.getEditors());
if (protection.canDomainEdit()) {
protection.setDomainEdit(false);
}
progress.getRange(i,4).setValue("complete");
}
else {
progress.getRange(i,4).setValue("fail");
}
}
end = new Date()
}
// Save your place by setting the token in your user properties
if(allFolders.hasNext()){
var continuationToken = allFolders.getContinuationToken();
userProperties.setProperty('CONTINUATION_TOKEN', continuationToken);
progress.getRange(1,6).setValue(continuationToken);
} else {
i++;
progress.getRange(i,1).setValue("Completed")
// Delete the token
PropertiesService.getUserProperties().deleteProperty('CONTINUATION_TOKEN');
ss.deleteSheet("Progress");
var Completionalert = ui.alert('completed');
}
Прошу прощения за мой грязный код, поскольку я новичок в кодировании.
Я проверил, маркер продолжения сохранен и получен. Я также позаботился о том, чтобы сценарий не заканчивался преждевременно до сохранения токена. Единственная проблема, о которой я могу думать, это то, что либо способ ввода токена снова неверен, либо хранится неверный токен. Но я не уверен в этом. Я попытался сохранить токен на уровне B и уровне A, но это не имеет смысла и не работает.
Кроме того, я прочитал следующее:
https://developers.google.com/apps-script/reference/drive/folder-iterator Однако это не очень помогло, поскольку показывает только, как получить токен.
Сценарий Google Apps: как использовать ContinuationToken с рекурсивным итератором папок , но я не понимаю термин рекурсивный.
Было бы здорово, если бы кто-то мог объяснить, как работает маркер с продолжением. Это просто отслеживает последнюю папку и возобновляет оттуда? или он фактически берет весь список папок и дает позицию?
Повторяю, основная проблема заключается в том, что токен создается и извлекается, но каким-то образом скрипт не возобновляет работу из последней проверенной папки.
Любые откровенные отзывы о других частях скрипта приветствуются ^^ и заранее благодарим вас! :)