【问题标题】:List all files and folder in google drive列出谷歌驱动器中的所有文件和文件夹
【发布时间】:2019-07-21 13:44:24
【问题描述】:

我一直在尝试解决这个问题。我希望我能得到一些指导。以下脚本的目的是获取包含子文件夹及其文件的文件夹和文件的完整列表。

这是我目前拥有的:

  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 个关卡,但如果需要,希望能更灵活地走得更远。

【问题讨论】:

标签: google-apps-script


【解决方案1】:

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

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

【讨论】:

  • 运行此程序时出现错误。它说The number of columns in the data does not match the number of columns in the range. The data has 14 but the range has 7. (line 40, file "Code")。为什么是 14?
  • 此错误与我发布的代码无关。之后您是否尝试将列表插入到电子表格中?
  • 是的。这是代码。 detailsSht.getRange(1,1,list.length,list[0].length).setValues(list);
  • 好的,现在它正在数组中创建数组,必须对其进行修改以很好地适应电子表格。我可以帮忙解决一下
  • 好的。我正在尽我最大的努力将你所拥有的与我所拥有的结合起来。我将不得不对数组中的数组进行更多研究。
【解决方案2】:

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

函数 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());

  }

}

请注意,如果您的 Drive 中有大量文件,此函数仍会超时,在这种情况下,您需要使用 PropertiesService 存储应用程序的状态,并通过 ScriptApp 使用触发器安排该函数再次运行。您可以通过在脚本执行之间保存文件迭代器的延续令牌来实现此目的 More on ContinuationToken

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-15
    • 1970-01-01
    • 1970-01-01
    • 2019-11-13
    • 1970-01-01
    相关资源
    最近更新 更多