【问题标题】:List all files in a folder, including files in sub folders列出文件夹中的所有文件,包括子文件夹中的文件
【发布时间】:2014-05-20 02:31:36
【问题描述】:

我正在尝试创建一个 Google Apps 脚本,该脚本将允许用户获取文件夹中的所有文件,包括连接到主文件夹的子文件夹中的文件。 (请注意,在我的代码中,我是提供文件夹 ID 的人,这将是主文件夹)

我已经设法从一个文件夹中获取所有文件,但我也希望提取子文件夹中的文件。

请看下面我到目前为止所做的代码。

function onOpen() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var searchMenuEntries = [ {name: "Search in all files", functionName: "search"}];
  //ss.addMenu("Search Document List", searchMenuEntries);
  ss.addMenu("Import Data from Google  Drive",searchMenuEntries);
}

function search()  {
   // Prompt the user for a search term
  var searchTerm = Browser.inputBox("Enter the folder ID of the files that you want to import:");
  //var folder = DocsList.getFolder(searchTerm);
  var folder = DocsList.getFolderById(searchTerm)
  var contents = folder.getFiles();

  var file;
  var data;

  var sheet = SpreadsheetApp.getActiveSheet();
  sheet.clear();

  sheet.appendRow(["FileName","File name (with link)", "Revision Date", "File Type", "DocumentID", "Meta Data"]);

  sheet.appendRow(["StringFilter - Hidden", "StringFilter", "DateFilter", "StringFilter - Hidden","StringFilter - Hidden", "csvFilter - Hidden"]);

  for (var i = 0; i < contents.length; i++) {
    file = contents[i];

    if (file.getFileType() == "SPREADSHEET") {
      continue;
    }

    data = [ 
     file.getName(),
      "<a href= " + file.getUrl() + " target= '_blank'>" + file.getName() + "</a>",
      file.getLastUpdated(),
      file.getFileType(),
      file.getId(),
      file.getDescription()
    ];

    sheet.appendRow(data);
  }
};

现在,有了这段代码,结果会是这样。

但它只会显示主文件夹下的文件,我也想在里面循环并检查是否有子文件夹因此检查里面是否有文件并获取它。

此外,我想添加一个列名“文件夹/子文件夹”,其中我想显示该文件的文件夹名称和该文件的主文件夹(如果适用)请参见下面我手动完成的示例. (例如,主文件夹 = 文件夹 1,子文件夹 = 子文件夹 1)

请指教。

【问题讨论】:

    标签: javascript google-apps-script google-sheets


    【解决方案1】:

    最简单的解决方案(恕我直言)是使用搜索文件夹和子文件夹的递归函数。像这样:

    function search() {
      // Prompt the user for a search term
      var searchTerm = Browser.inputBox("Enter the folder ID of the files that you want to import:");
      var folder = DocsList.getFolderById(searchTerm);
    
      var data = [["FileName","File name (with link)", "Revision Date", "File Type", "DocumentID", "Meta Data", "Folder/Sub-folder"],
                  ["StringFilter - Hidden", "StringFilter", "DateFilter", "StringFilter - Hidden","StringFilter - Hidden", "csvFilter - Hidden",""]
                 ];
      searchFolder(folder, data, "");
    
      var sheet = SpreadsheetApp.getActiveSheet();
      sheet.clear().getRange(1,1,data.length,data[0].length).setValues(data);
    }
    
    function searchFolder(folder, matrix, path) {
      path += folder.getName();
      addFiles(folder.getFiles(), matrix, path);
      path += ',';
      var folders = folder.getFolders();
      for( var i = 0; i < folders.length; ++i )
        searchFolder(folders[i], matrix, path);
    }
    
    function addFiles(files, matrix, path) {
      for (var i = 0; i < files.length; i++) {
        var file = files[i];
    
        if (file.getFileType() == "SPREADSHEET")
          continue;
    
        matrix.push([ 
         file.getName(),
          "<a href= " + file.getUrl() + " target= '_blank'>" + file.getName() + "</a>",
          file.getLastUpdated(),
          file.getFileType(),
          file.getId(),
          file.getDescription(),
          path
        ]);
      }
    }
    

    显然,此函数假定您没有更多文件可以在一次脚本运行中处理(您知道最长执行时间为 6 分钟,对吧?)。如果您需要稍后可以恢复的脚本(自动或手动),则必须使用DriveApp 而不是DocsList。看看this other answer,我在这里展示了如何做到这一点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-01
      • 1970-01-01
      • 2020-07-02
      • 2011-02-24
      • 2017-07-05
      • 2011-05-11
      • 2016-10-25
      • 2016-02-26
      相关资源
      最近更新 更多