【G Suite】Googleスプレッドシートでグループ一覧を取得する

【G Suite】Googleスプレッドシートでグループ一覧を取得する

こんにちは、IT推進室の杉浦です。

私の業務の一つとして G Suite の運用保守があります。当然ながら G Suite の管理コンソールで作業しているわけですが機能にもよりますが正直使いづらい部分が多いです。

そこで今回の内容は管理コンソール上だとなかなかに管理しづらいグループについてGoogleスプレッドシートと Google App Script を使ってグループ一覧を作ろうというものです。
グループはメーリングリストとして利用したり、単純にメールアドレスとして使うなど利用状況によっては件数が膨れ上がることがありスプレッドシートに書き出せるとうれしいはず!

準備

準備についてはGoogleスプレッドシートの作成とAdmin APIの有効化ですが、よくあるやつなのでこの辺りのアレコレはこの記事では割愛しています。
管理側でAdmin API 有効化済みで、スクリプトエディタ上で Admin Directory API を ON になっている前提で進めさせていただきます。当然ながらスクリプトを実装するユーザーには必要な管理者権限が付与されていないといけません。

相変わらず Google の拡張サービス の画面はいつもWindowsだと崩れていますね。Macだと正しく表示されているはずです。

ソースコード

//スプレッドシートにメニューを追加
function onOpen() {
  var ui = SpreadsheetApp.getUi();
  var menu = ui.createMenu("グループ");
  menu.addItem("グループ一覧取得", "GetGroupList");
  menu.addToUi();
}

//取得グループのドメイン
var domainName = 'example.com';
//Groups: list の maxResults のデフォルトは200
var maxResults = 200;

//グループ一覧取得
function GetGroupList()
{
  //アクティブなシートを取得する
  var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  //シート初期化
  ss.clear();
  
  //スプレッドシートにセットするデータ
  var values = [];
  //ヘッダー追加
  values.push(["グループ名", "説明", "メールアドレス", "メンバー数", "グループメンバー"]);
 
  //グループ一覧の取得
  var groupsList = AdminDirectory.Groups.list({domain: domainName, maxResults: maxResults});
  
  if(groupsList) {
    //データセット
    for(var i = 0; i < groupsList.groups.length; i++){
      
      var value = [];
      //グループのデータをセット
      value.push(groupsList.groups[i].name); //グループ名
      value.push(groupsList.groups[i].description); //説明
      value.push(groupsList.groups[i].email); //メールアドレス
      value.push(groupsList.groups[i].directMembersCount); //メンバー数
      
      //グループのメンバー情報の取得
      var members = AdminDirectory.Members.list(groupsList.groups[i].email).members;
      
      //メンバー処理
      if (members) {
        //メンバーデータをセット
        var memberData = '';
        for (var j = 0; j < members.length; j++){
          memberData += members[j].email + ','; //カンマ区切りで
        }
        value.push(memberData);
      }
      
      //データ1行追加
      values.push(value);
      
    }
   
    //スプレッドシートにデータをセット
    ss.getRange(1, 1, groupsList.groups.length + 1 , 5).setValues(values);
  } 
}

実行結果

このような形でスプレッドシート上にグループリストが出来上がります。管理コンソール上だと確認しにくいメンバーの詳細が分かるようになります。
管理コンソール上だと50件毎にしか表示できないのでグループ数が多いほどスプレッドシートに出せるメリットは大きいと思います。

※実際のデータはお見せできないので少々加工してあります。

解説

いくつかのポイントについて簡単に説明します。

取得グループのドメイン

var domainName = 'example.com';

取得するグループのドメインです、弊社の場合だと classmethod.jp とかになります。
G Suite に複数のドメイン登録している場合はグループもそれぞれのドメインで作成しているかと思います。その場合は複数ドメインのデータを一度に取得できないのでドメイン毎にデータを取得することになります。
取得するドメインをメニューから選択できるようにしたり、入力用のダイアログを表示するようにしてもよいかも。

グループ取得上限数

var maxResults = 200;

AdminDirectory.Groups.list() ではデフォルトで maxResults は200件となっていますので不要な場合は特に設定する必要はありませんがここでは任意の数値を入れるようにしています。
グループ数や登録メンバーが多い場合、今回の内容でGASの動作確認していると1日のリクエスト上限数を突破してしまう可能性がありますので実装中やテストでは必要に応じてグループ取得上限(maxResults)を小さくしておくとよいです。
実際にはスプレッドシートで一覧表示したい場合はというのはグループ数が膨大なパターンだと思いますので実情に合わせて設定していただくのがよいです。

グループ取得時に maxResults よりグループ数が多い場合は nextPageToken が返ってきています。それを利用して分割してデータ取得するようにしたり、他アプリで使うときはページング処理を実装したりとなります。

グループ取得

var groupsList = AdminDirectory.Groups.list({domain: domainName, maxResults: maxResults});

APIからグループを取得しています。必須パラメーターはドメインだけです。

Groups.list() では、orderBy と sortOrder でメールアドレスでソートして取得できたり、userKey でユーザーのメールアドレスを指定することでそのユーザーが所属するグループのみ取得できて便利です。

リファレンスはこちらから Groups: list

最後に

今回の内容は以上となります。やはりスプレッドシート上で確認できるとかなり違うと思います。グループ管理の役に立てばいいなと思います。

次回はグループの更に詳細な情報を取得してくるものかスプレッドシートの内容からGASでグループ作成をするものをやりたいと思います。グループ作成自体は簡単ですがアクセスタイプの設定などをする場合は Groups Settings API を利用する必要があります。
アクセスタイプの設定はかなり項目が多いのでこの辺りの解説もできればと思っていいます。