【G Suite】Googleスプレッドシートでグループ一覧を作成しそこにアクセスタイプも表示する

2019.06.19

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

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

過去2回の記事で Admin Directory API からのグループ取得Groups Settings API でのグループ設定取得 を行ってきました。今回はこれらを合わせてグループ一覧を取得しアクセスタイプの設定状態も反映されるようにします。

準備

以前の記事と特に変わりわないです Googleスプレッドシートの作成と Admin API の有効化です。
今回は Admin Directory API と Groups Settings API をONにしてください。

利用APIのリファレンスはこちらから。

ソースコード

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

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

//CONTACT
var CAN_CONTACT = {
  ALL_MANAGERS_CAN_CONTACT: 'グループの管理者',
  ALL_MEMBERS_CAN_CONTACT: 'グループのメンバー',
  ALL_IN_DOMAIN_CAN_CONTACT: '組織全体',
  ANYONE_CAN_CONTACT: '外部'
};
//VIEW
var CAN_VIEW = {
  ALL_OWNERS_CAN_VIEW: 'グループのオーナー',
  ALL_MANAGERS_CAN_VIEW: 'グループの管理者',
  ALL_MEMBERS_CAN_VIEW: 'グループのメンバー',
  ALL_IN_DOMAIN_CAN_VIEW: '組織全体',
  ANYONE_CAN_VIEW: '外部'
};
//POST
var CAN_POST = {
  NONE_CAN_POST: '投稿不可',
  ALL_OWNERS_CAN_POST: 'グループのオーナー',
  ALL_MANAGERS_CAN_POST: 'グループの管理者',
  ALL_MEMBERS_CAN_POST: 'グループのメンバー',
  ALL_IN_DOMAIN_CAN_POST: '組織全体',
  ANYONE_CAN_POST: '外部'
};
//MODERATE
var CAN_MODERATE = {
  OWNERS_ONLY: 'グループのオーナー',
  OWNERS_AND_MANAGERS: 'グループの管理者',
  ALL_MEMBERS: 'グループのメンバー'
};

//グループ一覧取得
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.push(members[j].email);
          memberData += members[j].email + ','; //カンマ区切りで
        }
        value.push(memberData);
      } else {
        value.push('');  //メンバーなし
      }

      //グループ設定取得
      var groupSettings = AdminGroupsSettings.Groups.get(groupsList.groups[i].email);
      
      value.push(CAN_CONTACT[groupSettings.whoCanContactOwner]); //オーナーに連絡
      value.push(CAN_VIEW[groupSettings.whoCanViewMembership]); //メンバーを表示
      value.push(CAN_VIEW[groupSettings.whoCanViewGroup]); //トピックを表示
      value.push(CAN_POST[groupSettings.whoCanPostMessage]); //投稿を公開
      value.push(CAN_MODERATE[groupSettings.whoCanModerateMembers]); //メンバーを管理

      //データ1行追加
      values.push(value);

    }

    //スプレッドシートにデータをセット
    ss.getRange(1, 1, groupsList.groups.length + 1 , 10).setValues(values);
  }
}

実行結果

このような形でスプレッドシート上にグループ一覧が書き出され今回はアクセスタイプの設定内容も出ています。
管理コンソール上でも確認できることはでますが最大表示件数が50件だったりカラム幅が調整できなかったり柔軟にフィルター掛けて絞り込んだりできないのでスプレッドシートで出力できると捗ります。

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

ちなみに比較として管理コンソールでは以下のような表示にできますが使いづらいです。

解説

いくつかのポイントについて簡単に説明します。 【G Suite】Googleスプレッドシートでグループ一覧を取得する で説明したものは省略します。

処理の流れ

処理の流れは簡単なもので以下の通りです。 グループメンバーは所属なしで0人のこともあるので注意です。

  1. AdminDirectory.Groups.list() からグループリストを取得します。
  2. 各グループのメールアドレスで AdminDirectory.Members.list() からグループに所属しているメンバーリストを取得します。
  3. 各グループのメールアドレスで AdminGroupsSettings.Groups.get() からグループ設定を取得します。
  4. スプレッドシートにデータを書き出し

注意が必要なのはグループ件数が多ければ多いほど処理時間がかかります。恐らくグループ件数が多い方は G Suite Business だったりすると思うのでスクリプトの実行時間制限は30分あります(Basicは6分)。もし実行時間が制限を上回るようならそれを回避するための処理を実装する必要があるでしょう。

Google Apps Script の制限についてはこちらから Quotas for Google Services

グループ設定の取得について

//グループ設定取得
var groupSettings = AdminGroupsSettings.Groups.get(groupsList.groups[i].email);

value.push(CAN_CONTACT[groupSettings.whoCanContactOwner]); //オーナーに連絡
value.push(CAN_VIEW[groupSettings.whoCanViewMembership]); //メンバーを表示
value.push(CAN_VIEW[groupSettings.whoCanViewGroup]); //トピックを表示
value.push(CAN_POST[groupSettings.whoCanPostMessage]); //投稿を公開
value.push(CAN_MODERATE[groupSettings.whoCanModerateMembers]); //メンバーを管理

グループ設定を取得して行データに追加している処理ですが、ここで各項目の値を対応する日本語の文言に変換しています。別にそのまま出してもいいのですが ALL_MEMBERS_CAN_CONTACT とか OWNERS_AND_MANAGERS とか出ていてもよく分からないので管理コンソールと同じ文言になるようにしています。

取得したアクセスタイプについて

実行結果と管理コンソールでの設定画面と見比べてみると設定状態が分かるかと思います。

こうやって一覧できるよにうになるとアクセスタイプの設定状況が一目瞭然です明らかにおかしな設定状態のグループがあっても発見がしやすくなります。 グループの設定情報には他にも値がありますので必要に応じてそれらも表示するようにするとよいですね。スプレッドシート上でフィルター掛ければ管理コンソールを利用するより柔軟に必要な情報を取り出せるかと思います。

最後に

今回の内容は以上となります。APIを利用してグループのメンバー・設定情報を取得してうまくグループ一覧が作れたかと思います。

次回は、これまで参照するだけでしたがAPIを利用してグループの作成をしてみたいと思います。グループを作成し・メンバーを設定し・アクセスタイプの設定をするものを作ってみたいと思います。

関連記事