見出し画像

[GAS] 指定フォルダ配下の全ファイル特定の権限一覧化するツール1:指定フォルダ配下のフォルダを全取得する

はじめに

GASで、指定したGoogleドライブのフォルダの配下にあるすべてのファイルを検索し、特定の権限を持つ場合、そのファイル情報を、Googleスプレッドシートに出力するツールを作成します。

Googleドライブに配置したファイルを、他の人と共有することができるのは非常に便利です。その際、特定のユーザーに共有ではなく、「リンクを知っている全員」に設定してしまうことで、情報漏洩のリスクが高まります。

指定したフォルダ配下にある全ファイルを検索し、この「リンクを知っている全員」の共有権限が設定されているファイルを一覧化するツールを作成します。

今回は、その処理の概要と、独自メニューを表示する処理、指定フォルダ配下のフォルダを全取得する処理の実装について、まとめます。

処理概要

処理概要は、下記となります。

  • 指定フォルダ配下に存在するすべてのフォルダを取得する

  • フォルダごとに、全ファイルを取得する

  • ファイルのアクセス権を取得し、「リンクを知っている全員」の共有権限が設定されている場合、Googleスプレッドシートにファイル情報を出力する

Googleドライブのフォルダの指定は、フォルダIDで指定します。フォルダIDは、ブラウザのアドレスバーのURLをコピーして取得することができます。

このフォルダIDは、Googleスプレッドシートの指定シートから指定を行うようにします。

また、GASの実行は、独自メニューを作成し、そのメニューから選択し、実行が開始される、とします。

独自メニュー

続いて、Googleスプレッドシートの構成は、下記としています。

  • 設定

  • FileList

  • ErrorList

シート構成

「設定」シートでは、Googleドライブのフォルダの指定を行います。

「FileList」シートには、指定したフォルダ配下にある全ファイルを検索し、この「リンクを知っている全員」の共有権限が設定されているファイル一覧を出力します。

「ErrorList」シートには、ファイルの権限取得時にエラーが発生した場合のファイル一覧を取得します。

独自メニューを表示する処理の実装

全体の実装は下記になります。

function onOpen(e){
  const ui = SpreadsheetApp.getUi();
  
  ui.createMenu('【ファイル共有権限検出】')
  .addItem('ファイル一覧作成', 'createFilesList')
  .addToUi();
}

Googleスプレッドシートが起動時に実行されるシンプルトリガー、onOpen関数の中に実装します。これによって、Googleスプレッドシートが起動する際に、独自メニューが作成されるようになります。

UIを操作するためのオブジェクト、Uiクラスを取得します。

const ui = SpreadsheetApp.getUi();

createMenuメソッドで、Uiクラスからメニューを作成します。

次に、addItemメソッドで、メニューにアイテムを追加します。この際、第1引数では、メニュー上に表示したい名前(メニュー名)を、第2引数では、選択された際に実行する関数名を指定します。

最後に、addToUiメソッドで、メニューをUiクラスに追加します。

指定フォルダ配下のフォルダを全取得する処理の実装

全体の実装は下記になります。

function createAccessPermissionsFilesList(){
  const folderId = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
  const folder = DriveApp.getFolderById(folderId);

  // 指定フォルダ配下のフォルダを全取得
  const folderIDs = getFolderIDs_(folder);
  folderIDs.push(folderId);

  console.log(folderIDs);
}

/**
 * 指定フォルダにあるすべてのフォルダのIDを取得する
 * @param {object} Folderオブジェクト
 * @return {Array.<string>} フォルダIDの配列
 */
function getFolderIDs_(rootFolder) {
  const folders = rootFolder.getFolders();

  let folderIDs = [];
  while (folders.hasNext()) {
    const folder = folders.next();
    folderIDs.push(folder.getId());

    const subFolderIDs = getFolderIDs_(folder);
    folderIDs = folderIDs.concat(subFolderIDs);
  }
  return folderIDs;
}

DriveApp.getFolderByIdメソッドで、引数で指定されたGoogleドライブのフォルダのIDのFolderクラスを取得します。

const folder = DriveApp.getFolderById(folderId);

そのFolderクラスを、getFolderIDs_関数に引数として渡しています。戻り値は、そのFolderクラス内にあるフォルダのIDの配列としています。

const folderIDs = getFolderIDs_(folder);

続いて、getFolderIDs_関数の処理について、見ていきます。
引数で渡されたFolderクラスから、getFoldersメソッドで、その配下にあるフォルダを取得します。

const folders = rootFolder.getFolders();

getFoldersメソッドの戻り値は、FolderIteratorクラスとなります。
フォルダが存在するかどうかを、hasNextメソッドで取得することができます。
while文の条件式として、このhasNextメソッドの戻り値がtrue、つまり、フォルダが存在する間、1つずつフォルダを、nextメソッドで取得し、取得したフォルダIDを配列に保存していきます。

  while (folders.hasNext()) {
    const folder = folders.next();
    folderIDs.push(folder.getId());

このgetFolderIDs_関数は、再帰関数としており、自分のことを自分で呼び出すようにしています。
これにより、引数で渡されたFolderクラスの配下に、フォルダがなくなるまで、繰り返し呼び出しを行うようになります。

const subFolderIDs = getFolderIDs_(folder);

戻り値として取得したフォルダIDの配列は、Arrayオブジェクトのconcatメソッドで連結します。
concatメソッドの戻り値は、連結後の配列となります。

folderIDs = folderIDs.concat(subFolderIDs);

全てのフォルダのIDが取得出来たら、フォルダIDの配列を戻して終了です!

まとめ

今回は、GASで、指定したGoogleドライブのフォルダの配下にあるすべてのファイルを検索し、特定の権限を持つ場合、そのファイル情報を、Googleスプレッドシートに出力するツールを作成します、の第1回目として、ツールの処理概要と、実装として、独自メニューを表示する処理、指定フォルダ配下のフォルダを全取得する処理について、まとめました。

次は、取得した全フォルダIDからファイルを取得する処理について実装していきます!


この記事が気に入ったらサポートをしてみませんか?