2023-11-04に投稿

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

こんにちは、しきゆらです。
今回は、GASでGoogleドライブにあるファイル・フォルダの一覧を取得する方法をメモしておきます。

ファイル・フォルダの一覧を取得するコード

すべてのフォルダを取得する

すべてのフォルダを取得する場合、以下だけです。

const folders = DriveApp.getFolders();

DriverApp.getFolders()でGoogleドライブにあるフォルダのイテレータを取得できます。
ドライブ内にあるすべてのファイルが欲しければ、このイテレータ内でファイル一覧を取得していけば可能ですね。

Class DriveApp  |  Apps Script  |  Google for Developers https://developers.google.com/apps-script/reference/drive/drive-app?hl=ja#getfolders

なお、Folderクラスにも直下にあるフォルダ一覧を取得できるgetFolders()メソッドが生えているので、同じように使えます。

Class Folder  |  Apps Script  |  Google for Developers https://developers.google.com/apps-script/reference/drive/folder?hl=ja#getfolders

フォルダ直下にあるファイル一覧を取得する

上記のようなFolderIteratorからFolderクラスのインスタンスを取得します。
Folderクラスには、直下にあるファイルのイテレータを取得するメソッドがあるのでこれを使います。

const folder = folders.next(); // FolderIteratorからFolderオブジェクトを取得
const fileIterator = folder.getFiles();

const files = []; // ファイルオブジェクトを格納する配列
while(fileIterator.hasNext()) {
  files.push(fileIterator.next());
}

Class Folder  |  Apps Script  |  Google for Developers https://developers.google.com/apps-script/reference/drive/folder?hl=ja#getfiles

これらを組み合わせれば、特定のフォルダ配下のすべてのファイル一覧を取得することができますね。 やってみましょう。

特定のフォルダ配下にあるすべてのファイルを取得する

ターゲットとなるフォルダを取得する

まずは、GASからターゲットとなるフォルダを取得します。

// https://drive.google.com/drive/u/0/folders/xxxxxxのxxxxxxx部分
const folderId= "xxxxxxxxxx"; 
const targetDir = DriveApp.getFolderById(folderId); 

targetDirはGASのFolderクラスのインスタンスが入っています。

Folderクラスについては以下を参照。

Class Folder  |  Apps Script  |  Google for Developers https://developers.google.com/apps-script/reference/drive/folder?hl=ja

フォルダ一覧を取得する

前述の通り、Folderクラスには配下にあるフォルダ一覧を取得するメソッドが定義されているのでそれを使います。

const folderIterator = targetDir.getFolders(); // Folderのイテレータオブジェクトが返ってくる
while (folderIterator.hasNext()) { // 参照していないFolderがあればループする
  folders.push(folderIterator.next()); // .next()でFolderを取得
}

FolderIteratorクラスは以下を参照。
よくあるイテレータで、hasNext()で次の要素があるかどうかを確認しつつ、次の要素があればnext()で取得する形です。

Class FolderIterator  |  Apps Script  |  Google for Developers https://developers.google.com/apps-script/reference/drive/folder-iterator?hl=ja

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

Google サービスの割り当て  |  Apps Script  |  Google for Developers https://developers.google.com/apps-script/guides/services/quotas?hl=ja

今回は、ここまで。

おわり

Originally published at shikiyura.com
ツイッターでシェア
みんなに共有、忘れないようにメモ

しきゆら

勉強したり手を動かした記録を「しきゆらの備忘録」(http://shikiyura.com)へ投稿している人。 Ruby/JavaScriptをよく書いている。いろんな言語に触れてみたい。新しい物・辛いもの好き。バグは愛すべきもの。一応社会人。

Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?

コメント