【问题标题】:Iterate Through Folders/Subfolders/Files in Google Drive遍历 Google Drive 中的文件夹/子文件夹/文件
【发布时间】:2014-09-28 11:43:27
【问题描述】:

我有这样的 Google Drive 结构设置:

Client A
--Project 1
----Drafts
----Presentations
----Minutes
--Project 2
----Drafts
----Presentations
----Minutes
Client B
<and so on>

我想编写一个脚本,我可以在其中传递项目 1 的 ID,它将遍历三个子文件夹中的每一个并计算文件总数(最终我想计算在一个日期范围,但小步骤!)。

我尝试使用 Class FolderIterator 代码,但它希望您将一组文件夹分配给变量“文件夹”(它显示 var folders = DriveApp.getFolders(); 并且我尝试了 var folders = DriveApp.getFolderById("&lt;id of Project 1 here&gt;"); 但在我的版本中这只是一个文件夹,它确实需要文件夹的集合)。如果我有父文件夹的 ID,有没有办法将这三个子文件夹分配给 folders 变量?或者有没有更好的方法来遍历子文件夹?

【问题讨论】:

    标签: google-apps-script


    【解决方案1】:

    作为对 Bryan 回答的补充(谢谢,我赞成)我编写了一个测试函数来查看记录器中的结果,并使用适当的参数运行该函数以获得所需的计数。 p>

    (此答案不应被选为正确答案,因为主要部分来自 Bryan P)

    事情是这样的:

        function testTraverse(){
          var originFolder = DriveApp.getFoldersByName('Client A').next(); // use the folder name you want here
          var totalCount = traverseFolder(originFolder,0);
          Logger.log('total files = '+totalCount);// note that if some files are
          // in more than one subfolder the count will count every occurrence of 
          //this file so the total might be > to the sum of intermediate values
        }
    
        function traverseFolder(folder,total) {
          var name = folder.getName();
          var count = 0;
          var files = folder.getFiles();
    
          while (files.hasNext()) {
            count++; 
          Logger.log('fileName ('+count+') in '+name+' is : '+files.next().getName());
    
          }
          Logger.log('\n'+name+' has ' + count+' files\n----------------------\n' );
          var subs = folder.getFolders();
          while (subs.hasNext()) {
            total+=traverseFolder(subs.next(),count);
          }
          return total;
        }
    

    注意,此代码适用于“合理”数量的文件,如果您有很多文件和文件夹,它可能会超过 5 分钟的执行时间限制。在这种情况下,您需要修改它,以便使用该方法提供的令牌处理较小的文件束。

    【讨论】:

    • 非常感谢你们俩——这真是令人难以置信……我还没有完全弄清楚,但它就像一个魅力,我期待着深入研究它并了解这一切。我很感激。我根据 Serge 的笔记给了 Bryan 的正确答案,但希望我能把它给你们两个。
    • 这很好用,虽然现在我正在尝试将所有文​​件写入谷歌电子表格,并且我正在努力使用计数器来跟踪当前电子表格行(因为函数调用本身,我跟踪的任何计数器都会被重置或修改)...有没有办法使用/维护全局计数器变量?我可以在函数之外设置一些东西来保持它的价值吗?现在作为一种解决方法,我只使用日志文件,效果很好——只是想要一些对用户更友好的东西。谢谢!
    • 我不确定我是否理解... var total 已经是一个全局计数器...您还需要什么?
    • 由于某种原因,在整个过程中对我来说总仍然为 0(我尝试在每次迭代和结束时记录它)。我会再次检查我的代码——也许我错过了一些东西。谢谢!
    【解决方案2】:

    使用 DriveApp 可能看起来像这样......

    function traverseFolder(folder) {
      var name = folder.getName();
    
      if ( /^(Drafts|Presentations|Minutes)$/.test(name) ) { 
        var count = 0;
        var files = folder.getFiles();
    
        while ( files.hasNext() ) {
          count++; 
        }
        Logger.log(name + ' : ' + count);
      }
      var subs = folder.getFolders();
    
      while (subs.hasNext()) {
        traverseFolder(subs.next());
      }
    }
    

    我们现在也可以访问Advanced Drive Service。如果有人没有很快发布,也许我会看一个例子。

    【讨论】:

    • 你犯了一个小错误:if ( files.hasNext() ) { count++; 不是IF 条件,而是while 循环。我确定这是您编写代码时的拼写错误。虽然我赞成这个想法;-)
    • 谢谢。认为我正在尝试使用 .length.size() 方法开始而不是循环。在这种情况下没有类似的东西,对吧?
    • 确实,while 是合适的工具 :-) DocsList 返回数组,因此允许我们使用 array.length 而不是 DriveApp 在 for/next 循环中循环。
    • 非常感谢,Bryan -- 这太好了,感谢您抽出宝贵时间!该代码运行良好,完全符合我的需要。
    猜你喜欢
    • 2020-06-30
    • 2023-01-20
    • 2018-12-20
    • 1970-01-01
    • 2017-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多