Сценарий Google App continuefolderiteration не продолжается с последней папки, а перезапускается постоянно - PullRequest
0 голосов
/ 24 января 2020

Я пытаюсь найти конкретную 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 с рекурсивным итератором папок , но я не понимаю термин рекурсивный.

Было бы здорово, если бы кто-то мог объяснить, как работает маркер с продолжением. Это просто отслеживает последнюю папку и возобновляет оттуда? или он фактически берет весь список папок и дает позицию?

Повторяю, основная проблема заключается в том, что токен создается и извлекается, но каким-то образом скрипт не возобновляет работу из последней проверенной папки.

Любые откровенные отзывы о других частях скрипта приветствуются ^^ и заранее благодарим вас! :)

Ответы [ 2 ]

0 голосов
/ 05 февраля 2020

Проверив мой скрипт, я понял, что произошла ошибка, когда я объявил переменную allFolders дважды, еще один раз перед этим фрагментом скрипта, и скрипт теперь работает как надо после удаления первого объявления allFolders.

Поэтому в размещенном здесь сценарии не было ничего плохого.

0 голосов
/ 24 января 2020
  1. Существуют ограничения времени выполнения скрипта
    • обычный пользователь : 6 минут
    • Бизнес / Предприятие / Образование : 30 минут

Краткий обзор подробной статьи по Квоты для Служб Google


Посмотрите на угрозу Stackoverflow Скрипт Google Apps: Как использовать ContinuationToken с рекурсивным итератором папок , он имеет сходство с вашим вопросом
Рекурсивная функция - это функция, которая вызывает себя

Вот небольшой пример функции, которая возвращает основание в степень экспоненты

function pow(a, b) {
  if (b === 1) { return a } 
  else { return a * pow(a, b - 1) }
}
console.log(pow(3, 3)) // same as 3 * 3 * 3 = 27

PS Это всего лишь пример, используйте Math.pow () вместо


Это проясняет ваши проблемы?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...