こんにちは、しきゆらです。
今回は、GASでGoogleドライブにあるファイル・フォルダの一覧を取得する方法をメモしておきます。
すべてのフォルダを取得する場合、以下だけです。
const folders = DriveApp.getFolders();
DriverApp.getFolders()
でGoogleドライブにあるフォルダのイテレータを取得できます。
ドライブ内にあるすべてのファイルが欲しければ、このイテレータ内でファイル一覧を取得していけば可能ですね。
なお、Folder
クラスにも直下にあるフォルダ一覧を取得できるgetFolders()
メソッドが生えているので、同じように使えます。
上記のようなFolderIterator
からFolder
クラスのインスタンスを取得します。
Folder
クラスには、直下にあるファイルのイテレータを取得するメソッドがあるのでこれを使います。
const folder = folders.next(); // FolderIteratorからFolderオブジェクトを取得
const fileIterator = folder.getFiles();
const files = []; // ファイルオブジェクトを格納する配列
while(fileIterator.hasNext()) {
files.push(fileIterator.next());
}
これらを組み合わせれば、特定のフォルダ配下のすべてのファイル一覧を取得することができますね。 やってみましょう。
まずは、GASからターゲットとなるフォルダを取得します。
// https://drive.google.com/drive/u/0/folders/xxxxxxのxxxxxxx部分
const folderId= "xxxxxxxxxx";
const targetDir = DriveApp.getFolderById(folderId);
targetDir
はGASのFolder
クラスのインスタンスが入っています。
Folderクラスについては以下を参照。
前述の通り、Folder
クラスには配下にあるフォルダ一覧を取得するメソッドが定義されているのでそれを使います。
const folderIterator = targetDir.getFolders(); // Folderのイテレータオブジェクトが返ってくる
while (folderIterator.hasNext()) { // 参照していないFolderがあればループする
folders.push(folderIterator.next()); // .next()でFolderを取得
}
FolderIterator
クラスは以下を参照。
よくあるイテレータで、hasNext()
で次の要素があるかどうかを確認しつつ、次の要素があればnext()
で取得する形です。
ただし、ここで取得できるのはtargetDir
直下にあるフォルダのみです。
targetDir
配下すべてを取得するにはちょっと工夫してあげる必要がります。
const subFolders = [targetDir.getFolders()];
for(let i = 0; i < subFolders.length; i++) {
const subFolder = subFolders[i];
while(subFolder.hasNext()) {
const folder = subFolder.next();
subFolder.push(folder.getFolders()); // フォルダ一覧を取得し、次に参照する
}
}
配列に破壊的に追加しつつfor
でループ処理するので、だいぶお行儀がよくない印象ですがいい方法が思いつきませんでした。
forEach
を使うと、追加された要素を参照してくれなかったのでfor
で回しています。
ファイルの一覧を取得するコードの全体像はこんな感じ。
最終的にはfilesの配列にファイルオブジェクトが集まるので、ここに対してあれこれすればよい。
3重ループになっているので、ファイル取得部分を関数に分けるなどすればもう少し見やすくなるかなと思います。
const folderId= "xxxxxxxxxx";
const targetDir = DriveApp.getFolderById(folderId);
const files = []; // ファイルオブジェクトを保持する配列
const subFolders = [targetDir.getFolders()];
for(let i = 0; i < subFolders.length; i++) {
const subFolder = subFolders[i];
while(subFolder.hasNext()) {
const folder = subFolder.next();
subFolders.push(folder.getFolders());
const fileIterator = folder.getFiles();
while(fileIterator.hasNext()) {
files.push(fileIterator.next());
}
}
}
フォルダの一覧の場合は、fileIterator
のループが不要で、subFolder.next()
を配列に詰めればOK。
もっとこう書けばええやん、というご指摘等あればコメントいただければ嬉しいです。
今回は、GASでGoogleドライブにあるとあるフォルダ配下にあるすべてのファイルを取得する方法をメモしました。
GASは結構機能が用意されているので、Googleサービスに対してやろうと思ったことは気軽に実装できそうな印象です。
ただし、GASには実行時間の制限などもあるので、この辺に気をつけて使いましょう。
今回は、ここまで。
おわり
勉強したり手を動かした記録を「しきゆらの備忘録」(http://shikiyura.com)へ投稿している人。 Ruby/JavaScriptをよく書いている。いろんな言語に触れてみたい。新しい物・辛いもの好き。バグは愛すべきもの。一応社会人。
Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。
また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!
こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?
コメント