我可能遗漏了一些明显的东西,但我无法遍历父文件夹中包含的子文件夹。我的目的是获取其中一个子文件夹的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函数,但我甚至无法做到这一点。我错过了什么?
答案 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);
注意:我知道这已经得到了回答。我正在为将来可能会发现此相关答案有用的任何人添加此内容。