【GAS】Googleドライブにあるフォルダ・ファイルの一覧を取得する

2023年11月4日JavaScript

こんにちは、しきゆらです。
今回は、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); 
const folders = []; // フォルダの一覧を保持する配列

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には実行時間の制限などもあるので、この辺に気をつけて使いましょう。

今回は、ここまで。

おわり

Posted by しきゆら