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,迭代器会再次重置。
那是我真正的错误。
我有一个 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,迭代器会再次重置。 那是我真正的错误。