Список всех файлов на диске Google без превышения максимального времени выполнения - PullRequest
2 голосов
/ 22 января 2020

Я пытаюсь перечислить имя более 10000 изображений на диске Google в листе для рекламы. У меня есть запущенный скрипт, но он останавливается каждые 360 секунд, выдавая ошибку, «превышающую максимальное время выполнения», для которой я нашел другой скрипт, но как неспециалист я не могу использовать оба скрипта вместе. Пожалуйста, помогите или предложите любую другую идею. Заранее благодарю.

за 1) Извлечение Перечислите все файлы на диске Google Здесь

function SDesigns(folderName) {

   var sheet = SpreadsheetApp.getActiveSheet();
   sheet.appendRow(["Name", "URL", "Download", "Date", "Size", "Description", "Image"]);


//change the folder ID below to reflect your folder's ID (look in the URL when you're in your folder)
    var folder = DriveApp.getFolderById("FOLDER_ID");
    var contents = folder.getFiles();

    var cnt = 0;
    var file;

    while (contents.hasNext()) {
        var file = contents.next();
        cnt++;

           data = [
                file.getName(),
                file.getUrl(), 
                "https://docs.google.com/uc?export=download&confirm=no_antivirus&id=" + file.getId(),

             /* file.getDateCreated(),
                file.getSize(),                              
                file.getDescription(),
                "=image(\"https://docs.google.com/uc?export=download&id=" + file.getId() +"\")",  */
            ]; 

            sheet.appendRow(data);



    };
 };

2) за Превышение максимального времени выполнения Я нашел сообщение Здесь

function runMe() {
  var startTime= (new Date()).getTime();

  //do some work here

  var scriptProperties = PropertiesService.getScriptProperties();
  var startRow= scriptProperties.getProperty('start_row');
  for(var ii = startRow; ii <= size; ii++) {
    var currTime = (new Date()).getTime();
    if(currTime - startTime >= MAX_RUNNING_TIME) {
      scriptProperties.setProperty("start_row", ii);
      ScriptApp.newTrigger("runMe")
               .timeBased()
               .at(new Date(currTime+REASONABLE_TIME_TO_WAIT))
               .create();
      break;
    } else {
      doSomeWork();
    }
  }

  //do some more work here

}

1 Ответ

1 голос
/ 22 января 2020

Звонки на любые внешние службы, включая spreadsheetApp, делают ваш код медленным

Чтобы сделать ваш скрипт более эффективным, я рекомендую не добавлять новую строку в каждую for l oop итерация, но вместо этого pu sh данные в двумерный массив и вставка их в свой лист только один раз, после выхода из l oop.

Перепишите свой скрипт следующим образом:

function SDesigns() {
   var sheet = SpreadsheetApp.getActiveSheet();
   sheet.appendRow(["Name", "URL", "Download", "Date", "Size", "Description", "Image"]);
//change the folder ID below to reflect your folder's ID (look in the URL when you're in your folder)
    var folder = DriveApp.getFolderById("FOLDER_ID");
    var contents = folder.getFiles();
    var cnt = 0;
    var file;
    var array = [];
    while (contents.hasNext()) {
        var file = contents.next();
        cnt++;
        data = [
                file.getName(),
                file.getUrl(), 
                "https://docs.google.com/uc?export=download&confirm=no_antivirus&id=" + file.getId(),

             /* file.getDateCreated(),
                file.getSize(),                              
                file.getDescription(),
                "=image(\"https://docs.google.com/uc?export=download&id=" + file.getId() +"\")",  */
            ]; 
        array.push(data);
    };
  sheet.getRange((sheet.getLastRow()+1), 1, array.length, array[0].length).setValues(array); 
 };

Это сделает ваш код примерно в 3 раза быстрее и избавит вас от необходимости обходить максимальное время выполнения.

Для меня для папки, содержащей 110 файлов, время выполнения скрипта составило 3,13 с. Экстраполируя на 10000 изображений, время выполнения не должно превышать 285 с.

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

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