繁体   English   中英

列出文件夹中的所有文件,包括子文件夹中的文件

[英]List all files in a folder, including files in sub folders

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

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

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

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

现在,使用此代码结果将是这样的。

http://i.stack.imgur.com/aFke0.png

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

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

http://i.stack.imgur.com/2fETk.png

请指教。

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

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 看看这个其他答案 ,我展示了如何做到这一点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM