代码之家  ›  专栏  ›  技术社区  ›  DanCue

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

  •  0
  • DanCue  · 技术社区  · 6 年前

    我已经想了一段时间了。我希望能得到一些指导。以下脚本的目的是获取包含子文件夹及其文件的文件夹和文件的完整列表。

    以下是我目前拥有的:

      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个级别,但如果需要的话,希望灵活性进一步提高。

    0 回复  |  直到 6 年前
        1
  •  2
  •   Chris    6 年前

    Recursion 在这种情况下是有益的。下面的代码调用递归方法 recurseFolder() 它以文件夹和数组作为参数。它将文件夹中的所有文件添加到列表中,然后在找到的任何子文件夹上调用自己。

    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;
    }
    

    我不确定输出的格式是否符合您的预期,因此您可能需要对其进行一些处理。 注意:如果在较大的驱动器上运行,则很容易超时。

        2
  •  0
  •   Anton Dementiev    6 年前

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

    函数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使用触发器将此函数安排为再次运行。可以通过在脚本执行之间保存文件迭代器的continuation标记来实现 More on ContinuationToken