🐪

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

2023/08/03に公開

Googleドライブの指定したフォルダ内のすべてのファイル/フォルダを取得する方法を紹介します。

フォルダ内のファイル一覧を取得する

以下のコードを使用してフォルダ内の全てのファイルを取得します。

function listFilesInFolder() {
  const folderId = 'your-folder-id-here'; // ここにフォルダIDを入力します。
  const folder = DriveApp.getFolderById(folderId);
  const files = folder.getFiles();
  while (files.hasNext()) {
    const file = files.next();
    const fileName = file.getName();
    console.log(`fileName: ${fileName}`);
    const url = file.getUrl();
    const fileId = file.getId();
  }
}

"your-folder-id-here"は取得したいフォルダIDに書き換えてください。

エラー

フォルダの共有設定がされていないと以下のエラーになります。

Exception: No item with the given ID could be found. Possibly because you have not edited this item or you do not have permission to access it.

実行しているGoogleアカウントをフォルダの共有設定に追加しましょう。

フォルダIDが誤ってると以下のエラーになります。

Exception: Unexpected error while getting the method or property getFolderById on object DriveApp.

?以降の部分(?usp=sharing)はフォルダIDに含まないので注意しましょう。
https://drive.google.com/drive/folders/1zDptZULVJuhqM2p1a5?usp=sharing
この場合、フォルダIDは1zDptZULVJuhqM2p1a5です。

hasNext()、next()とは何か?

hasNext()next()メソッドについて簡単に説明します。getFiles()メソッドはファイルのリスト(正確にはFileIteratorオブジェクト)を返し、hasNext()next()はそのリストを一つずつ処理するためのメソッドです。

  • hasNext():まだ処理していない次のファイルが存在するかどうかを確認します。存在すればtrueを返し、存在しなければfalseを返します。
  • next():次のファイル(もしあれば)を取り出します。

このwhileループは、次のファイルが存在しなくなる(つまり、全てのファイルを処理し終える)まで、繰り返し実行されます。これにより、指定したフォルダ内の全てのファイルを処理することができます。

hasNext()next()メソッドの処理を理解するために、whileループを使わずに実装を試みると以下のようになります。

function getFiles() {

  const folderId = 'your-folder-id-here'; // ここにフォルダIDを入力します。
  const folder = DriveApp.getFolderById(folderId);
  const files = folder.getFiles();

  if (files.hasNext()) {
    const file1 = files.next();
    console.log(`1つ目のファイル: ${file1.getName()}`);
  } else {
    console.log("1つ目のファイルはありません。");
  }

  if (files.hasNext()) {
    const file2 = files.next();
    console.log(`2つ目のファイル: ${file2.getName()}`);
  } else {
    console.log("2つ目のファイルはありません。");
  }
  
  //続く...

}

フォルダ内のファイル数を取得する

getFiles()メソッドが返すfilesオブジェクトは配列ではありません。FileIteratorという特別な型のオブジェクトです。したがって、配列のようにlengthプロパティやforループ, mapなどの配列専用メソッドを使用することはできません。ファイルの数を数えるには、whileループを使用してファイルを一つずつカウントする必要があります。

function countFilesInFolder() {
  const folderId = 'your-folder-id-here'; // ここにフォルダIDを入力します。
  const folder = DriveApp.getFolderById(folderId);
  const files = folder.getFiles();
  let count = 0;
  while (files.hasNext()) {
    files.next();
    count++;
  }
  console.log('ファイル数: ' + count);
}

フォルダ内のフォルダ一覧を取得する

フォルダの取得は、folder.getFiles()からfolder.getFolders()に変わります。

function listFoldersInFolder() {
  const folderId = 'your-folder-id-here'; // ここにフォルダIDを入力します。
  const folder = DriveApp.getFolderById(folderId);
  const folders = folder.getFolders();
  while (folders.hasNext()) {
    const folder = folders.next();
    const folderName = folder.getName();
    console.log(`folderName: ${folderName}`);
    const url = folder.getUrl();
    const folderId = folder.getId();
  }
}

Discussion