DriveApp.getFolders() 未按预期工作

DriveApp.getFolders() not working as expected

我有一个 Google 表格应用程序脚本(运行宁作为表格下的脚本)应该 return 我的 Google 驱动器中的所有文件夹, 但是,以下代码陷入无限循环,并且只显示驱动器中 3 个文件夹中的 1 个 - 一遍又一遍。

 //this doesn't work -only shows 1 folder and repeats indefinitely
function getMyFolders() {
  var f;
   while (DriveApp.getFolders().hasNext()) {
    f = DriveApp.getFolders().next();
    console.log("f: " +f.getName());
  }
}

代码 return 只是我的一个文件夹的名称(hasNext() 显然不起作用或 Google Apps 脚本中存在错误 - 因为 while 条件永远不会为假(我 运行 它持续了几分钟,它从未停止过!)

这可能是安全问题吗?这只是我 运行 遇到的问题之一。另一个是3个文件夹是同一个父文件夹的子文件夹。不确定为什么 getFolders() 不 return 只是父级(这样更有意义)。

尝试将此作为您的功能,而不是 return 仅父文件夹!

function getMyFolders() {
  let folders = DriveApp.getFolders();
  while (folders.hasNext()) {
    console.log("f: " +folders.next().getName());
  }
}

如果您还需要子文件夹,则需要使用递归。你熟悉这个概念吗?如果有帮助,很高兴用这些信息更新我的答案。

解释:

您在每次迭代中都调用了 DriveApp.getFolders();,因此 hasNext() 总是检索相同的项目(迭代器中的第一个文件夹)。因此,你有一个无限循环。

获取我的所有文件

function getAllMyFiles(folder=DriveApp.getRootFolder()) {
  const ss = SpreadsheetApp.getActive();
  const sh = ss.getSheetByName('Sheet0');
  let files = folder.getFiles();
  while(files.hasNext()) {
    let file = files.next()
    sh.appendRow([file.getName(),file.getId()]);
  }
  let sfldrs = folder.getFolders();
  while(sfldrs.hasNext()) {
    let sfldr = sfldrs.next();
    getAllMyFiles(sfldr)
  }
}

我重写了 Cooper 的答案以获取给定父项下的所有文件夹。 在我的例子中,父文件夹称为“Gill”。

function getAllMyFolders(folder=DriveApp.getFoldersByName("Gill").next()) {
      let sfldrs = folder.getFolders();
      while(sfldrs.hasNext()) {
        let sfldr = sfldrs.next();
        console.log("folder name: " +sfldr.getName());
        getAllMyFolders(sfldr)
      }
    }

好的 - 我试过这段代码,发现递归是完全没有必要的,所以这里的代码将 return 所有级别的所有文件夹,然后你可以使用 getParents()[=12= 测试级别]

function getMyFolders() {
  let folders = DriveApp.getFolders();
  while (folders.hasNext()) {
    let folder = folders.next();
    Logger.log(folder.getName() + ", Parent Folder: " + folder.getParents().next().getName());
  }
}

我有一种预感,使用递归函数是错误的方法(它看起来很糟糕而且增加了不必要的开销)但我很困惑为什么,我在这个问题上的第一次尝试没有奏效。答案是我的代码编写方式 - 显然,您只需将 DriveApp.getFolders() 分配给一个变量一次。简单地将其放入不止一次,似乎可以将其重置。也就是说,检查 DriveApp.getFolders().hasNext() 然后检查 DriveApp.getFolders().next() 将导致死循环!这里的教训:将它分配给一个变量,然后检查 hasNext,因为调用它会改变迭代器的状态,如果再次调用 getFolders,迭代器会再次重置。 那是我真正的错误。