列出Google驱动器中的所有文件和文件夹

时间:2019-02-27 18:28:09

标签: google-apps-script

我已经尝试了一段时间了。我希望我能对此有所指导。以下脚本的目的是获取包含子文件夹及其文件的文件夹和文件的完整列表。

这是我目前拥有的:

  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 :(得分:2)

Recursion在这种情况下是有益的。下面的代码调用递归方法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;
}

我不确定输出的格式是否符合您的预期,因此您可能需要稍微玩一下。 注意:如果在较大的驱动器上运行,它很容易超时。

答案 1 :(得分:0)

您需要一个函数,该函数将递归浏览文件夹结构,这意味着,如果它运行到文件夹的子文件夹中,它将再次调用自身,并将该文件夹作为新的父文件夹传递。

函数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使用触发器安排该功能再次运行。您可以通过在脚本执行之间为文件迭代器保存延续令牌来实现此目的 More on ContinuationToken