イテレーターしたい(GoogleAppsScript.Base.Iterator)
1function iteratorToArray<T>(
2 iterator: GoogleAppsScript.Base.Iterator<T>
3): T[] {
4 const result: T[] = [];
5 while (iterator.hasNext()) {
6 result.push(iterator.next());
7 }
8 return result;
9}
10
11// Usage
12const files = iteratorToArray(folder.getFiles());
13const folders = iteratorToArray(folder.getFolders());
イテレーター(iterator)は、配列などのコレクション型から、要素を1つずつ順番に取り出すしくみです。
.hasNext()で次の要素があるかを確認し、
.next()で次の要素を取得し、内部のカウンターを1つ進めます。
イテレーターはメモリ使用量を少なくできますが、.mapや.filterなどの便利メソッドが使えません。
上記のようなイテレーターをコレクション型に変換する関数を作成しておくと便利です。
フィルタリングしたい
1function iteratorToArrayWithFilter<T>(
2 iterator: GoogleAppsScript.Base.Iterator<T>,
3 fn: (v: T) => boolean
4): T[] {
5 const result: T[] = [];
6 while (iterator.hasNext()) {
7 const v = iterator.next();
8 if (fn(v)) result.push(v);
9 }
10 return result;
11}
12
13// Usage
14const folder = DriveApp.getFolderById("フォルダID");
15
16const pdfFiles = iteratorToArrayWithFilter(
17 folder.getFiles(),
18 file => file.getName().endsWith(".pdf")
19);
20
21pdfFiles.forEach(f => console.log(f.getName()));
ファイルの数が多い場合など、一度に配列に変換するとメモリを使い過ぎてしまう可能性があります。
上記のサンプルは、要素を逐次フィルタリングして、条件にマッチした要素だけ残すようにしてあります。