Google apps script 遍历Google Drive中的文件夹/子文件夹/文件

Google apps script 遍历Google Drive中的文件夹/子文件夹/文件,google-apps-script,Google Apps Script,我有一个谷歌硬盘结构设置,如下所示: Client A --Project 1 ----Drafts ----Presentations ----Minutes --Project 2 ----Drafts ----Presentations ----Minutes Client B <and so on> 客户端A --项目1 ----草稿 ----介绍 ----会议记录 --项目2 ----草稿 ----介绍 ----会议记录 客户B 我想编写一个脚本,在其中我可以传递项目1

我有一个谷歌硬盘结构设置,如下所示:

Client A
--Project 1
----Drafts
----Presentations
----Minutes
--Project 2
----Drafts
----Presentations
----Minutes
Client B
<and so on>
客户端A
--项目1
----草稿
----介绍
----会议记录
--项目2
----草稿
----介绍
----会议记录
客户B
我想编写一个脚本,在其中我可以传递项目1的ID,它将循环通过三个子文件夹中的每一个子文件夹,并计算文件总数(最终我想计算在一个日期范围内更新的文件数,但需要小步骤!)


我尝试过使用FolderReterator类代码,但这希望您将一组文件夹分配给变量“folders”(它显示了
var folders=DriveApp.getFolders();
,我尝试了
var folders=DriveApp.getFolderById(“”;
),但在我的版本中,这只是一个文件夹,它确实需要文件夹的集合)。如果我有父文件夹的ID,是否有方法将这三个子文件夹分配给该
文件夹
变量?或者有更好的方法循环子文件夹吗?

在DriveApp中可能会出现类似的情况

函数遍历文件夹(文件夹){
var name=folder.getName();
如果(/^(草稿|演示文稿|分钟)$/.test(名称)){
var计数=0;
var files=folder.getFiles();
while(files.hasNext()){
计数++;
}
Logger.log(名称+':'+计数);
}
var subs=folder.getFolders();
while(subs.hasNext()){
traverseFolder(subs.next());
}
}

我们现在也可以访问该网站。也许我会看一个例子,如果有人不尽快发布

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

(此答案不应被选为正确答案,因为主要部分来自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分钟的执行时间限制。在这种情况下,您需要修改它,以便使用该方法提供的标记继续处理较小的文件束。

您犯了一个小错误:
if(files.hasNext()){count++;
不是一个
IF
条件,而是一个
while
循环。我敢肯定你写代码时它是一个打字错误。虽然我对这个想法投了赞成票;-)谢谢。我想我是在尝试
.length
.size()
方法开始,而不是循环。在这种情况下,没有类似的方法可以使用,对吗?是的,while是合适的工具:-)DocsList返回数组,从而允许我们使用array.length而不是DriveApp在for/next循环中循环。非常感谢,Bryan——这太好了,我感谢您花时间!代码运行得非常好nd正是我所需要的。非常感谢你们两位——这真是难以置信……我还没有完全弄明白,但它就像一个符咒,我期待着深入研究并理解它。我很感激。我根据Serge的便条给了Bryan正确的答案,但希望我能给你们两个。这已经奏效了ed很棒,不过现在我正在尝试将所有文件写入Google电子表格,我正在努力使用计数器来跟踪当前电子表格行(因为函数本身调用,所以我跟踪的任何计数器都会重置或修改)…有没有一种方法可以使用/维护全局计数器变量?我可以在函数之外设置它,使其随时间保持其值?作为一种解决方法,现在我只使用日志文件,效果很好--只需要一些更方便用户的东西。谢谢!我不确定我是否理解…var total已经是一个全局计数器了…还有什么其他示例你真的需要吗?由于某种原因,在整个过程中,我的总数始终为0(我在每次迭代和结束时都尝试将其记录下来)。我将再次检查我的代码——也许我遗漏了一些东西。谢谢!