我想仅列出云端硬盘中特定硬盘的文件夹名称。所以我首先调用函数getFolderNames()
并在那里添加父文件夹名称。然后我调用getChildFolders(parent)
函数获取所有子文件夹并继续为每个子文件夹递归调用。
我的问题是变量folderatt
(应该包含有关文件夹名称的所有信息)只包含第一个文件夹的名称,因此只有父文件夹的子文件夹。但是当我在递归函数中登录时,它会正确显示所有文件夹和子文件夹名称。
function getFolderNames() {
var folderatt = [];
try {
// If you want a tree of any sub folder
var parent = DriveApp.getFoldersByName("Librari").next();
var dhenat = getChildFolders(parent);
folderatt.push(dhenat);
} catch (e) {
Logger.log(e.toString());
}
return folderatt;
}
function getChildFolders(parent) {
folderNames = [];
var childFolders = parent.getFolders();
var thirr = 1;
while (childFolders.hasNext()) {
var childFolder = childFolders.next();
var allFolders = {};
allFolders.emri = childFolder.getName();
allFolders.id = childFolder.getId();
folderNames.push(allFolders);
thirr++;
folderNames.push(thirr);
// Logger.log(childFolder.getName());
// Logger.log(folderNames);
// Recursive call for any sub-folders
getChildFolders(childFolder);
}
return folderNames;
}
答案 0 :(得分:1)
我可以在您的代码中看到一些问题,但首先,对于getChildFolders( childFolder )
调用的结果,您实际上并没有做任何事情,所以很自然,它不会得到结果集,现在可能你可以把它改成这个
// Recursive call for any sub-folders
folderNames.concat( getChildFolders( childFolder ) );
但是你应该知道,目前你的folderNames
变量是一个全局变量(因为它没有真正定义,你只需为它赋值)。只要它是全局的,即使concat也不会帮助你,所以你也必须分配它,例如:
let folderNames = [];
它无效的原因是每次调用getChildFolders
函数时,在您的示例中,folderNames将再次设置为空数组,因此folderNames只包含最后一个的结果你打电话给getChildFolders( childFolder )
的时间。通过在本地定义,不会有这样的副作用
所以最后,第一个函数可以改写为:
function getChildFolders(parent) {
let folderNames = [];
let childFolders = parent.getFolders();
while (childFolders.hasNext()) {
let childFolder = childFolders.next();
let allFolders = {
emri: childFolder.getName(),
id: childFolder.getId()
};
folderNames.push(allFolders);
// Recursive call for any sub-folders
folderNames.concat( getChildFolders( childFolder ) );
}
return folderNames;
}
请注意我删除了thirrr变量,因为我不清楚你需要它的目的。
最后,这应该为您提供包含allFolders
对象的扁平数组。我还将var
更改为let
关键字,因为var
是一个函数范围的关键字,在块内定义没有意义(在本例中,是你的while循环)< / p>
答案 1 :(得分:1)
JSFiddle - 看看这个小提琴。
在递归函数之外声明并初始化'folderNames'
变量。那应该可以解决你的问题。此外,您无需将其返回到父级功能中的'dhenat'
变量,因为现在“folderNames'
将保留结果