查找父文件夹中的子文件夹

时间:2016-05-16 16:32:53

标签: google-apps-script google-drive-api

我可能遗漏了一些明显的东西,但我无法遍历父文件夹中包含的子文件夹。我的目的是获取其中一个子文件夹的ID。

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("Create Ticket");
  var FileID = SpreadsheetApp.getActiveSpreadsheet().getId();
  var ThisFileParentFolders = DriveApp.getFileById(FileID).getParents();
  //loop through subfolders to find the admin folder
  var PF = ThisFileParentFolders.next().getName();
  var subfolders = ThisFileParentFolders.next().getFolders();
Logger.log("PF=" + PF);
  while (subfolders.hasNext()) {
      var sfldr = subfolders.next()
      Logger.log(sfldr.getName())
      findSubFolder(sfldr)
    if (sfldr=="TempUploads") {
      var TUploadFolder = subfolders.next().getID();
    }
  }
  Logger.log("TUploadFolder=" + TUploadFolder)

function findSubFolder(sfldr) {
  sfldr = sfldr.getId();
  var childFolder = DriveApp.getFolderById(sfldr).getFolders();
  while(childFolder.hasNext()) {
    var child = childFolder.next();
    Logger.log(child.getName());
    getSubFolders(child);
  }
  return;
}

在调试过程中,代码会中断 var subfolders = ThisFileParentFolders.next()。getFolders();

错误'无法检索下一个对象:迭代器已到达结尾。'

PF在调试器中显示正确的父文件夹,但该文件夹中肯定有子文件夹。我还没有测试过findSubFolder函数,但我甚至无法做到这一点。我错过了什么?

2 个答案:

答案 0 :(得分:1)

“var ThisFileParentFolders”将是“FolderIterator”对象。

“FolderIterator”是一种可以通过2种方法主要访问的数组: .hasNext()和.next()

总是当你使用.next()方法时,你会从这个“数组”文件夹中得到下一个条目。

所以,而不是使用代码行

var subfolders = ThisFileParentFolders.next().getFolders();

你应该使用

var subfolders = PF.getFolders();
你看到了吗? 将返回值保存到PF变量时,首次调用.next()方法。这是你的文件中唯一的父文件夹。

然后你试图从这个PF文件夹中获取文件夹,但是不再使用PF.getFolders(),而是再次使用文件夹的ThisFileParentFolders“数组”上的方法.next(),它没有更多的元素

所以,你的脚本必须停止。

希望,这有帮助。

我必须添加一些内容:

PF不是文件夹! 这是一个STRING! 所以,你必须改变行

var PF = ThisFileParentFolders.next().getName();

var PF = ThisFileParentFolders.next();

从PF.getFolders()获取子文件夹

希望,这有帮助

答案 1 :(得分:0)

这里是迭代解决方案,而不是递归解决方案。这是一种更通用的方法,可以根据任何给定的文件夹相关条件,在 Gdrive 文件夹层次结构中的任何级别查找文件夹。

解决方案
/*Iteratively searches folders, given the amount of folders you would
  want as limit, based on the given condition, which is a function that takes 
  in a folder and outputs a boolean */
function getFolders(rootFolder, condition, limit = 1) {
  var stack = [rootFolder];
  var result = [];
  while ((stack.length !== 0) && (result.length < limit)) {
    var folderIterator = stack.pop().getFolders();
    while (folderIterator.hasNext()) {
      var folder = folderIterator.next();
      stack.push(folder);
      if (condition(folder)) {
        result.push(folder);
      }
    }
  }
  
  return result;
}
用法
function isCalledPhotos(folder) {
  return folder.getName() === "Photos";
}

var personalFolder = DriveApp.getFolderById("XCadfgg")

// Default parameter will be used
getFolders(DriveApp.getRootFolder(), isCalledPhotos); 

getFolders(personalFolder, isCalledPhotos, 2);

// If you want to search every folder, under the root folder.
getFolders(DriveApp.getRootFolder(), isCalledPhotos, Infinity); 

注意:我知道这已经得到了回答。我正在为将来可能会发现此相关答案有用的任何人添加此内容。