Работа с большими папками в скрипте приложений

#google-apps-script

#google-apps-script

Вопрос:

У меня есть папка с более чем 50 000 файлов в ней, и она настолько велика, что даже получение всех идентификаторов файлов вызывает 6-минутный тайм-аут. На самом деле он настолько велик, что я даже не могу сосчитать количество файлов. Это скрипт, который я создал для подсчета файлов. Прошу прощения, если он не запускается. Я изменил его, разместив здесь, чтобы его было легче читать.

   //This requires the Drive API To be turned on in the Advanced Google Services

  function (folder){
    var allDriveFiles = folder.getFiles();
    var query = 'trashed = false and "'   folder.getId()  '" in parents';
    
    var counter =0;
    var pageToken
    do {
      var filesInFolder = Drive.Files.list({q: query,maxResults: 100, pageToken: pageToken});
      counter  = filesInFolder.items.length;  
      pageToken = filesInFolder.nextPageToken;
      Logger.log('filesInFolder: '   counter);
    } while (pageToken);

    Logger.log('filesInFolder: '   counter);

  }
 

Первый Logger.log присутствует, потому что время ожидания всегда истекает до достижения второго. По тайм-ауту получается около 13000 файлов.

Итак, вопросы тогда:

  • Есть ли лучший способ подсчета файлов в папке?
  • Если я хочу работать с огромной папкой и хочу удалить определенные файлы, есть ли достойный способ сделать это? В настоящее время я создал вторую папку и либо удаляю файл, если это необходимо, либо перемещаю текущий файл во вторую папку. Таким образом, я медленно очищаю огромную папку, удаляя ненужные файлы по ходу работы или перемещая файлы, которые я хочу сохранить, в другую папку. Когда я достигаю 6 минут, я перезапускаю файл и продолжаю. Кстати, это удивительно медленно. Я сижу здесь уже 4 часа, и работа выполнена только частично.

Ответ №1:

Существует 2 варианта оптимизации, которые значительно ускорят отображение списка файлов в папке. Первый — просто увеличить значение maxResults . Ограничение Google для API версии v2 составляет 1000. Это не задокументировано, но имеет смысл, поскольку оно соответствует API v3, у которого есть документированный предел. Обратите внимание, что вы, вероятно, не получите 1000 результатов на страницу (я обнаружил, что ограничен примерно 460), если вы не используете 2-ю оптимизацию.

Вторая оптимизация позволит вам достичь предела в 1000 файлов на страницу и ускорит возврат запросов. Используйте fields опцию, чтобы ограничить количество полей, включенных в ответ, только теми, которые вам действительно нужны.

 function countFiles(folderId){
  let query = 'trashed = false and "'   folderId  '" in parents';
  
  let count = 0;
  let pageToken;
  do {
    const resp = Drive.Files.list({
      maxResults: 10000, // huge number meaning "as many as possible"
      pageToken: pageToken,
      q: query,
      fields: 'items/id,nextPageToken', // get as few fields as possible
    });
    Logger.log("got %d items", resp.items.length);
    count  = resp.items.length;
    pageToken = resp.nextPageToken;
  } while(pageToken);

  return count;
}
 

Ответ №2:

Скрипт приложений имеет свои ограничения.

В зависимости от типа вашей учетной записи максимальное время выполнения вашего скрипта может быть:

  • 6 минут — если вы используете один из следующих типов учетных записей: учетная запись пользователя, бесплатная версия Google Workspace, Базовая версия Google Workspace;
  • 30 минут — если вы используете учетную запись Google Workspace Business / Enterprise / Education;

Однако, поскольку вы хотите получить такое большое количество файлов и уже используете сервис Drive Advanced, лучшим решением будет использовать сам Drive API.

Решение состоит в том, чтобы начать с Drive API v3 Node.js Начните с быстрого запуска здесь, а затем адаптируйте его к вашим потребностям.

Ссылка

Комментарии:

1. Ale13, вы говорите, использовать внешний сервер с API для устранения тайм-аутов скрипта?

2. Вместо использования скрипта приложений вы можете использовать Node.js и вызовите Drive API напрямую.