Оптимизация папок и создание GDo c с использованием скрипта Google - PullRequest
1 голос
/ 16 апреля 2020

Я хочу создать несколько папок (a, b, c) в каждом подпапке A (A.1, A.2, A.3), которые будут находиться в папке A, а затем создать несколько GDoc в папке b. .

Каталог на Google Диске:

output

Код:

  //get the values from two cols.
  var chapters = currSheet.getRange("B2:B").getValues();
  var subChapters = currSheet.getRange("C2:C").getValues();

  //get the count of Chapter and the SubChapters and calls the getSubFoldersM() for subFolder and GDoc creation.
  var count = 1;
  var length = subChapters.length;
  console.log("Chapter: " + chapters[0]);
  var ParentFolder = getFolder.createFolder("Chapter "+chapters[0]);
  getSubFoldersM(ParentFolder, subChapters[i] ,count,link);

  var lastchaptersValue = chapters[0];
  for (i = 0; i < length; i++) 
  {
    if (subChapters[i] === subChapters[i + 1]) 
    {
      count++;
      continue;
    }
    else 
    {
      if ( chapters[i] != lastchaptersValue ) 
      {
        console.log("Chapter: " + chapters[i]);
        var ParentFolder = getFolder.createFolder("Chapter "+chapters[i]);
      }
      lastchaptersValue = chapters[i];
    }
    console.log(subChapters[i], count);
    getSubFoldersM(ParentFolder, subChapters[i] ,count,link);
    count = 1;
  }  

  //function for creation of Subfolders and GDocs Creation
  function getSubFoldersM(rootFolder,uniqueChapter,finalCount,rootName){
    var subFolder = rootFolder.createFolder("Chapter "+uniqueChapter);
      subFolder.createFolder("Spreadsheet Links"); 
      subFolder.createFolder("Images"); 
      var solutionFolder = subFolder.createFolder("Solutions");

      var name = subFolder.getName();
      for (var i=0;i<finalCount;i++)
      { 
        var doc = DocumentApp.create(rootName+'_'+name+''+columnToLetterM(i+1)+'_EL'),
            docFile = DriveApp.getFileById( doc.getId() );
        solutionFolder.addFile( docFile );
        DriveApp.getRootFolder().removeFile(docFile);
      }
  }

Это просто кусок кода, который получает мне мой необходимый каталог. Но это занимает много времени, так как есть почти 10 тыс. Данных. Грубо говоря, 9,5 тыс. Строк данных заняли 5 минут, чтобы создать все папки и GDocs. Кроме того, я использую folderIterator() каждый раз в другом для l oop, что, как мне говорят, занимает много времени.

Как сделать этот код более эффективным по времени?

1 Ответ

2 голосов
/ 16 апреля 2020

Возможной оптимизацией вашего кода является пакетирование запросов вместо выполнения вызова API при каждом выполнении l oop.

Замечания:

Обратите внимание, что для этого есть некоторые значения ограничения :

Вы ограничены 1000 звонками в одном пакетном запросе. Если вам нужно сделать больше вызовов, используйте несколько пакетных запросов.

Итак, вам придется разделить процесс l oop на порции по 1000 запросов максимум.

Подход:

Идея состоит в том, чтобы создать запрос Drive API для создания нового файла в папке желаний. Этот запрос может быть сохранен в массиве для каждого чанка. После этого вы сможете сразу передать все эти запросы с помощью операции пакетного вызова, что значительно сократит нагрузку на сеть и обработку.

К сожалению, в скрипте Apps нет такой поддержки.

  • Рассмотрите возможность перехода на собственное решение на Java, Python или другом языке. Вы можете найти документацию о том, как начать с ними здесь ;
  • Если вы хотите придерживаться скрипта Apps, есть очень хорошее объяснение того, как пакетные запросы в этом StackOverflow ответ . Если вы предпочитаете, вы можете использовать пользовательскую библиотеку скриптов приложений для выполнения пакетных запросов, здесь - это ссылка
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...