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

标签 javascript google-apps-script google-sheets

我正在尝试创建一个 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);
  }
};

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

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。看看this other answer在这里我展示了如何去做。

关于javascript - 列出文件夹中的所有文件,包括子文件夹中的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23750101/

相关文章:

javascript - 如何向子组件添加事件?

javascript - EpicEditor 文本显示为而不是空格

php - 如何将 .html() 值从 JavaScript 传递到 CodeIgniter Controller ?

arrays - 组合 LEFT、SEARCH 和 REGEXREPLACE

javascript - 使用 JavaScript (node.js) 的任务

javascript - 在 Google Apps 脚本中将文本替换为 HTML

google-apps-script - 如何在配置设置中构建动态下拉菜单?

javascript - 无法在谷歌文档文件中找到函数错误

google-apps-script - 使用 Google Sheet 中的 GmailApp.sendEmail 时如何包含用户 Gmail 签名

r - 将带有公式的Google Spreadsheet导入R