#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 напрямую.