【GAS】Googleドライブ：共有ドライブ（メンバー・権限）一覧出力

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

なお、同様の記事として、すでに@ryosukさんの
「[GASでGoogle Driveの共有ドライブと所属ユーザ一の一覧を出力する](https://qiita.com/ryosuk/items/8fdcd606d94e89e156ed)」があります。
私のスクリプトでは、上記を大いに参考にしつつ、以下の点を考慮しました。
- 共有ドライブの数が100を超える場合の処理
- 配列を用いた処理の高速化
- 後々加工しやすい出力形式（これは用途によりますが）

# 実行結果
![output.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529154/d76b413b-4913-1535-c938-94517703694e.png)
※上図に登場する人物・団体・名称等はすべて架空のものです。

# 事前準備
1. 出力対象のすべての共有ドライブ対し、システム管理者（スクリプト実行者）を
「管理者」として追加します。<br>
[[Google Workspace管理コンソール]](https://admin.google.com/) → [アプリ] → [Google Workspace] → [ドライブとドキュメントの設定] → [共有ドライブの管理] → 対象の共有ドライブの[メンバーを管理] → システム管理者のアカウントを入力 → [管理者]を選択 → [共有]
![AdminConsole.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529154/479f2f91-745a-575f-244b-3de85fc2739c.png)

2. 出力先のスプレッドシートを作成し、Apps Scriptに「Drive API」を追加します。<br>
[[Googleシート]](https://docs.google.com/spreadsheets/) → [新しいスプレッドシートを作成] → [拡張機能]タブ → [Apps Script]→
サービス[+] → [Drive API] → [追加]
![AppsScript.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529154/a89e2e01-9c08-25dd-a948-fa05258c444f.png)



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

```javascript: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);
}
```

# 参考
- GASでGoogle Driveの共有ドライブと所属ユーザ一の一覧を出力する - Qiita
https://qiita.com/ryosuk/items/8fdcd606d94e89e156ed

- Spreadsheet Service  |  Apps Script  |  Google Developers
https://developers.google.com/apps-script/reference/spreadsheet

- API Reference  |  Drive API  |  Google Developers
https://developers.google.com/drive/api/v2/reference

- Roles  |  Drive API  |  Google Developers
https://developers.google.com/drive/api/guides/ref-roles