Список всех файлов и папок на диске Google - PullRequest
0 голосов
/ 27 февраля 2019

Я уже некоторое время пытаюсь понять это.Я надеюсь, что смогу получить некоторые рекомендации по этому вопросу.Цель следующего сценария - получить полный список папок и файлов с вложенными папками и включенными в них файлами.

Вот что у меня в данный момент есть:

  var counter = 0

  var files = folder.getFiles();  
  var subfolders = folder.getFolders();
  var folderPath = folder.getName();

  while (subfolders.hasNext()){   
    subfolder = subfolders.next(); 
    var row = [];
    //row.push(subfolder.getName(),'',subfolder.getId(),subfolder.getUrl(),subfolder.getSize(),subfolder.getDateCreated(),subfolder.getLastUpdated());
    //list.push(row); 
    if(counter > 0){
      var files = subfolder.getFiles();
    }

    while (files.hasNext()){
      file = files.next();
      var vals = file.getUrl();
      var row = [];
      if(counter == 0){
        row.push(folder.getName(),file.getName(),file.getId(),file.getUrl(),file.getSize(),file.getDateCreated(),file.getLastUpdated())
      }else{
        row.push(folderPath + '/' + subfolder.getName(),file.getName(),file.getId(),file.getUrl(),file.getSize(),file.getDateCreated(),file.getLastUpdated())        
      }
      list.push(row);    
    }
    counter = counter + 1
  }

В настоящее время он получает папкуимена и имена файлов для текущей папки и ее подпапки.Это не идет дальше, чем это.Я застрял, пытаясь понять, как заставить цикл продолжаться до тех пор, пока не останется больше подпапок.

Это не очень большой диск.Есть менее 10 уровней, но хотелось бы, чтобы гибкость пошла дальше, если это необходимо.

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

Вам нужна функция, которая будет рекурсивно перемещаться по структуре папок, а это означает, что если она попадет в подпапку в папке, она снова вызовет себя, передав эту папку в качестве нового родителя.

function listFolders (parentFolderId) {

var sourceFolder = DriveApp.getFolderById(parentFolderId) || DriveApp.getRootFolder();

  var folders = sourceFolder.getFolders();

  var files = sourceFolder.getFiles();

  while (files.hasNext()) {

    var file = files.next();              
    //Do something
  }

  while (folders.hasNext()) {
    var folder = folders.next();         
    listFolders(folder.getId());

  }

}

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

0 голосов
/ 27 февраля 2019

Рекурсия выгодна в этом случае.Приведенный ниже код вызывает рекурсивный метод recurseFolder(), который принимает в качестве параметра Folder и Array.Он добавляет все файлы в папке в список, а затем вызывает себя во всех найденных подпапках.

function test(){
  var root = DriveApp.getRootFolder();
  var list = [];

  var list = recurseFolder(root, list);
  Logger.log(JSON.stringify(list));

  //This is just how I am testing the outputed list. You can do what you need.
  var sheet = SpreadsheetApp.getActiveSheet();
  list.forEach(function (row){
   sheet.appendRow(row); 
  });
}

function recurseFolder(folder, list){
  var files = folder.getFiles();  
  var subfolders = folder.getFolders();

  while (files.hasNext()){ //add all the files to our list first.
    var file = files.next();
    var row = [];
    Logger.log("File: " + folder.getName());
    row.push(folder.getName(),file.getName(),file.getId(),file.getUrl(),file.getSize(),file.getDateCreated(),file.getLastUpdated())
    list.push(row);
  }


  while (subfolders.hasNext()){   //Recurse through child folders.
    subfolder = subfolders.next(); 
    Logger.log("Folder: " + subfolder.getName());
    list = recurseFolder(subfolder, list); //Past the original list in so it stays a 2D Array suitible for inserting into a range.
  }

  return list;
}

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

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