如何使用应用脚本在Google电子表格中检索和存储文件和文件夹结构?

时间:2019-03-29 13:54:17

标签: google-apps-script google-sheets

我知道之前曾有人问过这个问题,但我想在这个问题上做得更深一些。我已经将此应用程序脚本代码在线上获取,并且正在Google电子表格中使用它来扫描文件夹列表。

简而言之,我有一个(共享的)文件夹结构,最有可能超过1000个子文件夹,其中包含子子文件夹,看起来像这样:

主文件夹

  • 文件夹1

    • 文件1.1
    • 子文件夹1.A
      • SUBFILE 1.A.2
      • SUBFILE 1.A.3
  • 文件夹2

    • 文件2.1
    • 子文件夹2.A
      • SUBFILE 2.A.2
      • SUBFILE 2.A.3
  • 文件夹3

    • 文件3.1
    • 子文件夹3.A
      • SUBFILE 3.A.2
      • 子文件3.A.3 ...

我正在尝试修复2件事: 1)我的功能在运行时明显中断,因为文件夹和文件太多。我不认为这是由于电子表格中行数的限制。因此,理想情况下,我将必须在主文件夹中手动批处理200个文件夹,运行该函数,然后重新进行迭代。是否有任何提示如何避免这种情况,以及如何潜在地将临时结果转储到第一个电子表格中,如果存在缓存问题,则创建一个新的电子表格?

2)我无法检索子文件夹的详细信息及其包含的文件的详细信息。任何人都可以帮助修改代码以更深入地了解文件夹层次结构吗?我这里需要某种循环功能吗?

使用下面提供的代码,我已经使用和测试了几次,我只能检索文件夹1,2、3和文件1.1、2.1、3.1 ...,但不能检索子文件夹或子文件。

修复此功能,将节省我数周的手工工作。欢迎任何帮助。在此先感谢您的帮助。

function getAndListFilesInFolder() {
  var arr,f,file,folderName,subFolders,id,mainFolder,name,own,sh,thisSubFolder,url;

  sh = SpreadsheetApp.getActiveSpreadsheet().getSheets()[0];
  sh.getRange(1, 1, 100, 10).clear({contentsOnly: true})

  id = "FOLDER ID HERE";
  arr = [["FILE NAME", "URLs", "OWNER","FOLDER"]];


  mainFolder = DriveApp.getFolderById(id);
  subFolders = mainFolder.getFolders();
  folderName = mainFolder.getName();

  f = mainFolder.getFiles();

  while (f.hasNext()) {
    file = f.next();
    name = file.getName()
    url = file.getUrl()
    own = file.getOwner().getName()

    arr.push([name, url, own, folderName]);
  };

  while (subFolders.hasNext()) {
    thisSubFolder = subFolders.next();
    f = thisSubFolder.getFiles();
    folderName = thisSubFolder.getName();

    while (f.hasNext()) {
      file = f.next();
      name = file.getName()
      url = file.getUrl()
      own = file.getOwner().getName()

      arr.push([name, url, own,folderName]);  
    };
  };

  sh.getRange(1,1, arr.length, arr[0].length).setValues(arr);
  sh.getRange(2,1, arr.length, arr[0].length).sort(1);


  //var second = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet2")
  //second.activate()
}

1 个答案:

答案 0 :(得分:0)

之所以看不到任何子文件夹,是因为您实际上并没有在任何时候将它们添加到数组(arr)中。

您真正需要的是编写一个递归函数,该函数接收一个文件夹并返回自身以及数组中文件的详细信息。遇到文件夹时,会将那个文件夹传递回相同的功能。

研究递归和递归函数。

这是一个可以扩展的简短示例,由于我将其写在脑海中,因此需要进行一些调整:

ComboWidget