LoginSignup
3
3

More than 1 year has passed since last update.

【GAS】Googleドライブ:共有ドライブ(メンバー・権限)一覧出力

Last updated at Posted at 2022-09-16

はじめに

本記事は、Google Workspaceを利用している組織のシステム管理者が、GASを用いて
Googleドライブにおける共有ドライブの一覧情報(共有ドライブ名、メンバー、役割etc)を
Googleシートに出力する手順について説明します。

なお、同様の記事として、すでに@ryosukさんの
GASでGoogle Driveの共有ドライブと所属ユーザ一の一覧を出力する」があります。
私のスクリプトでは、上記を大いに参考にしつつ、以下の点を考慮しました。

  • 共有ドライブの数が100を超える場合の処理
  • 配列を用いた処理の高速化
  • 後々加工しやすい出力形式(これは用途によりますが)

実行結果

output.png
※上図に登場する人物・団体・名称等はすべて架空のものです。

事前準備

  1. 出力対象のすべての共有ドライブ対し、システム管理者(スクリプト実行者)を
    「管理者」として追加します。

    [Google Workspace管理コンソール] → [アプリ] → [Google Workspace] → [ドライブとドキュメントの設定] → [共有ドライブの管理] → 対象の共有ドライブの[メンバーを管理] → システム管理者のアカウントを入力 → [管理者]を選択 → [共有]
    AdminConsole.png

  2. 出力先のスプレッドシートを作成し、Apps Scriptに「Drive API」を追加します。

    [Googleシート] → [新しいスプレッドシートを作成] → [拡張機能]タブ → [Apps Script]→
    サービス[+] → [Drive API] → [追加]
    AppsScript.png

スクリプト

Apps Scriptから下記のスクリプトを実行します。
初回のみプロジェクトへの承認が求められますので、許可してください。

script.gs
const act_sheet = SpreadsheetApp.getActive().getActiveSheet();
let drv_list, drv_info, drv_token;
let prm_list, prm_info, role_ja;
let array = [];

function myFunction() {
  array.push(["共有ドライブ", "メンバー", "メール", "タイプ", "役割"]);

  // Drive APIから共有ドライブのリストを取得、pageTokenがある限り繰り返し
  do {
    drv_list = Drive.Drives.list({
      maxResults: 100,
      pageToken: drv_token,
      useDomainAdminAccess: true
    });

    for (let i = 0; i < drv_list.items.length; i++) {
      drv_info = drv_list.items[i];

      try {
          // 共有ドライブごとにパーミッション情報を取得
        prm_list = Drive.Permissions.list(
          drv_info.id,
          {supportsAllDrives: true, useDomainAdminAccess: true}
        );
      
        for (let j = 0; j < prm_list.items.length; j++) {
          prm_info = prm_list.items[j];

          // ロール情報を日本語化
          switch (prm_info.role) {
            case ("organizer"):
              role_ja = "管理者";
              break;
            case ("fileOrganizer"):
              role_ja = "コンテンツ管理者";
              break;
            case ("reader"):
              role_ja = "閲覧者";
              break;
            case ("commenter"):
              role_ja = "閲覧者(コメント可)";
              break;
            case ("writer"):
              role_ja = "投稿者";
              break;
            default:
              role_ja = prm_info.role;
          }

          // 取得した共有ドライブ名および各種情報を配列に追加
          if (j === 0) {
            array.push([
              drv_info.name, 
              prm_info.name, prm_info.emailAddress, prm_info.type, role_ja
            ]);
          } else {
            array.push([
              "",  // 出力形式上、最初のメンバー以外の配列には共有ドライブ名不要
              prm_info.name, prm_info.emailAddress, prm_info.type, role_ja
            ]);
          }
        }
      } catch (err) {
        console.log(err);
        array.push([err]);
        continue;
      }
    }
    drv_token = drv_list.nextPageToken;
  } while (drv_token);

  // 配列をGoogleシートに反映
  act_sheet.clear();
  act_sheet.setFrozenRows(1);
  act_sheet.getRange(1, 1, array.length, array[0].length).setValues(array);
}

参考

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3