【Google Apps Script】フォルダIDを調べるのが面倒!Googleドライブのフォルダをパスで取得するには?

Google Apps Script

はじめに

Google Apps Scriptで、Drive APIを使ってGoogle Driveのフォルダを使う時、以下のようにフォルダのIDを使用してフォルダを取得する方法が一般的です。

var folder = DriveApp.getFolderById('フォルダID');

パスじゃなくてIDで指定するのは、以下の画像のようにGoogleドライブでは同じフォルダに同じ名前のフォルダやファイルを配置できるからです。パス名だけでは1つに特定できない場合があるので、フォルダIDを使う必要がある、というわけです。

「無題のフォルダ」を2つ作ってみたところ。

しかし、わざわざフォルダIDを調べて記述するのは面倒ですし、スクリプトを別アカウントにコピーした場合などにIDを書き換える必要もでてきます。自分一人で使っているGoogleドライブなら、「このフォルダ名は重複して作成しない」と決めておけば、フォルダをパスをで指定できたほうが便利ですよね。

そこで、この記事では、ちょっと「邪道」かもしれませんが、Google Apps Script でフォルダパスを指定するだけでGoogleドライブのフォルダを取得する方法を紹介します。

パスからフォルダを取得する関数「getFolderByPath」の作成と利用

以下は、パスからGoogleドライブのフォルダを取得する関数「getFolderByPath」と、それを利用して指定したフォルダの情報をログ出力するコードです。

function getFolderByPath(folderPath) {
  var folders = folderPath.split("/");
  var folder = DriveApp.getRootFolder();
  
  for (var i = 0; i < folders.length; i++) {
    var subfolders = folder.getFoldersByName(folders[i]);
    if (subfolders.hasNext()) {
      folder = subfolders.next();
    } else {
      throw new Error("フォルダが見つかりません: " + folderPath);
    }
  }
  
  return folder;
}

function printFolderDetails(folderPath) {
  try {
    var folder = getFolderByPath(folderPath);

    var fileCounter = 0;
    var files = folder.getFiles();
    while (files.hasNext()) {
      files.next();
      fileCounter++;
    }

    console.log("フォルダ名: " + folder.getName());
    console.log("フォルダID: " + folder.getId());
    console.log("フォルダURL: " + folder.getUrl());
    console.log("作成日時: " + folder.getDateCreated());
    console.log("更新日時: " + folder.getLastUpdated());
    console.log("フォルダ内のファイル数: " + fileCounter);
  } catch (error) {
    console.error(error.message);
  }
}

function main() {
  printFolderDetails("親フォルダ/サブフォルダ");
}

コードの各部分の解説は以下の通りです。

  1. 関数 getFolderByPath
    • 引数: folderPath(文字列)。取得したいフォルダのパス。例:”親フォルダ/サブフォルダ”。
    • 動作: 引数で指定されたパスのフォルダを取得します。パスは “/” で区切られ、ルートフォルダから順にサブフォルダをたどります。フォルダが見つからない場合はエラーを投げます。
    • 戻り値: 指定されたパスのフォルダオブジェクト。
  2. 関数 printFolderDetails
    • 引数: folderPath(文字列)。詳細情報をログに出力したいフォルダのパス。
    • 動作: getFolderByPath 関数を使ってフォルダを取得し、その詳細情報をログに出力します。具体的には、フォルダ名、フォルダID、フォルダURL、作成日時、更新日時、およびフォルダ内のファイル数(フォルダは数に含まない)です。フォルダが見つからない場合は、エラーメッセージをログに出力します。
  3. 関数 main
    • 動作: この関数は、printFolderDetails関数を呼び出す関数です。この関数を実行すると、指定したフォルダパス(上の例では「親フォルダ/サブフォルダ」)のフォルダの詳細情報がログに出力されます。

GASで上記のコードを実行してみれば、実際の動きが理解できるでしょう。

getFolderByPathを自分のGASコードにコピペすれば、パスからフォルダを取得する機能が使えます。複数のプロジェクトでgetFolderByPathを使いたいなら、独立したプロジェクトを作ってgetFolderByPath関数を含むスクリプトファイルを追加・保存しておき、利用したいプロジェクトにライブラリとして追加すると便利でしょう。

ただし、最初に述べた通り、Googleドライブでは同じ名前のフォルダを同じフォルダ内に作ることができます。このgetFolderByPath関数では、同じ名前の複数のフォルダが存在する場合、どのフォルダが選択されるかは不定です。その点は注意して利用してください。

まとめ

この記事では、Google Apps Scriptで、フォルダパスを指定するだけでGoogleドライブのフォルダを取得するコードを紹介しました。しかし、Googleドライブの特性上、同じ名前のフォルダが存在する可能性があるため、利用には注意が必要です。

Google Apps Script
\シェアお願いします/
LFI

コメント

タイトルとURLをコピーしました