在 FolderIterator 和 FileIterator 上循环 - Google Apps 脚本
Looping on FolderIterator and FileIterator - Google Apps Script
我正在制作一个在 Google Drive 文件夹中循环的脚本,我注意到我不知道循环迭代器(特别是 FolderIterator 和 FileIterator)的最佳方法是什么。
我的第一个方法
const drive_id = '__________';
let base_folder = DriveApp.getFolderById(drive_id),
sub_folders = base_folder.getFolders();
Logger.log(base_folder.getFolders());
for(let sub_folder of sub_folders)
{
Logger.log(sub_folder);
}
输出Error TypeError: sub_folders is not iterable
.
其次,我尝试使用 while 循环并检查 hasNext(),但我发现它们不够美化。我目前设置了这个 for 循环,它可以工作并且足够干净,但看起来还是有点老套。
/*...*/
for(let sub_folders = base_folder.getFolders(); sub_folders.hasNext();)
{
let sub_folder = sub_folders.next();
Logger.log(sub_folder);
}
另请注意,我无法在循环本身内声明 sub_folder
。那么,正确的做法是什么?
此外,如果我想在 sub_folders
上使用 map
或 filter
怎么办?
注意:这个问题的范围可能比 google-script 更广泛,但我找不到正确的术语来以不同的方式提出问题,所以我更愿意坚持特定的我找到的案例。
循环 FolderIterator 或 FileIterator 的正确方法是什么?
使用 while
循环的正确方法。
原因与 hasNext() 函数有关,其中 returns 一个 Boolean
(true
或 false
)并且唯一与布尔值一起使用的循环是 while
循环。
此外,如果我想在 sub_folders 上使用地图或过滤器怎么办?
在您的代码中 sub_folder
是一个类型为 Folder. Unfortunately, you can only retrieve the folders one by one within the while
loop by using next() so you can't directly apply map
or filter
on the FolderIterator 的对象。
相反,您可以通过将每个文件夹推送到一个数组(在 while
循环内)来创建一个文件夹数组,然后使用 map
.
示例:
此脚本找到所有文件夹并将它们存储在一个数组中,然后使用每个子文件夹的 map to get the name:
function myFunction() {
const base_folder = DriveApp.getFolderById('folder_id');
const sub_folders = base_folder.getFolders();
const folders = [];
while (sub_folders.hasNext()){
let folder = sub_folders.next()
folders.push(folder);
}
const folder_names = folders.map(f=>f.getName());
console.log(folder_names);
}
以下是可应用于 folders
数组每个元素的所有可用方法的列表:Class Folder
我正在制作一个在 Google Drive 文件夹中循环的脚本,我注意到我不知道循环迭代器(特别是 FolderIterator 和 FileIterator)的最佳方法是什么。 我的第一个方法
const drive_id = '__________';
let base_folder = DriveApp.getFolderById(drive_id),
sub_folders = base_folder.getFolders();
Logger.log(base_folder.getFolders());
for(let sub_folder of sub_folders)
{
Logger.log(sub_folder);
}
输出Error TypeError: sub_folders is not iterable
.
其次,我尝试使用 while 循环并检查 hasNext(),但我发现它们不够美化。我目前设置了这个 for 循环,它可以工作并且足够干净,但看起来还是有点老套。
/*...*/
for(let sub_folders = base_folder.getFolders(); sub_folders.hasNext();)
{
let sub_folder = sub_folders.next();
Logger.log(sub_folder);
}
另请注意,我无法在循环本身内声明 sub_folder
。那么,正确的做法是什么?
此外,如果我想在 sub_folders
上使用 map
或 filter
怎么办?
注意:这个问题的范围可能比 google-script 更广泛,但我找不到正确的术语来以不同的方式提出问题,所以我更愿意坚持特定的我找到的案例。
循环 FolderIterator 或 FileIterator 的正确方法是什么?
使用
while
循环的正确方法。原因与 hasNext() 函数有关,其中 returns 一个
Boolean
(true
或false
)并且唯一与布尔值一起使用的循环是while
循环。
此外,如果我想在 sub_folders 上使用地图或过滤器怎么办?
在您的代码中
sub_folder
是一个类型为 Folder. Unfortunately, you can only retrieve the folders one by one within thewhile
loop by using next() so you can't directly applymap
orfilter
on the FolderIterator 的对象。相反,您可以通过将每个文件夹推送到一个数组(在
while
循环内)来创建一个文件夹数组,然后使用map
.
示例:
此脚本找到所有文件夹并将它们存储在一个数组中,然后使用每个子文件夹的 map to get the name:
function myFunction() {
const base_folder = DriveApp.getFolderById('folder_id');
const sub_folders = base_folder.getFolders();
const folders = [];
while (sub_folders.hasNext()){
let folder = sub_folders.next()
folders.push(folder);
}
const folder_names = folders.map(f=>f.getName());
console.log(folder_names);
}
以下是可应用于 folders
数组每个元素的所有可用方法的列表:Class Folder