🐣

GAS:200件以上のGoogleグループ(メンバーや設定)の一覧を出力する

2021/09/12に公開

前提

デフォルトでは200件しか出力できないが、本スクリプトではpageTokenやwhile文を使うことで200件以上でも出力することが可能となっている。

アカウントの権限

APIアクセスに使用しているアカウントに、グループの管理APIの権限がついている必要がある。権限が無いと、グループを出力できない。

API の追加

スクリプトエディタの左サイドバー「サービス」の[+]を押して、以下2つのAPIを追加する必要がある。

  • Admin SDK API
  • Groups Settings API

概要

対象のドメインのGoogleグループを出力することができる。

  • グループの情報
    • グループのメールアドレス
    • グループの名前
    • グループの説明
    • メンバー数
    • メンバー
  • グループの設定
    • アクセス設定(オーナーに連絡、メンバーを表示、会話を表示、投稿を公開、メンバーを管理)
    • グループに参加できるユーザー
    • 組織外のメンバーの許可

出力された後のスプレッドシート

スクリプト

var ss = SpreadsheetApp.getActiveSpreadsheet();

//実行メニューを作成
function onOpen() {
  var ui = SpreadsheetApp.getUi();
  var menu = ui.createMenu("GAS実行");
  menu.addItem("グループ出力", "exportGoogleGroup");
  menu.addToUi();
}

function exportGoogleGroup() {
  //スプレッドシートの1つ目のシートを選択
  var sheet = ss.getSheets()[0];
  
  //対象ドメイン(example.co.jpの部分を置き換える)
  var domain = 'example.co.jp';

  var endFlag = false;
  var token = '';

  //シートをクリア
  sheet.clear();
 
  //ヘッダー追加
  var values = [];
  values.push([
  "メールアドレス", 
  "グループ名", 
  "説明", 
  "メンバー数", 
  "メンバー",
  "オーナーに連絡", 
  "メンバーを表示",  
  "会話を表示",
  "投稿を公開",
  "メンバーを管理",
  "グループに参加できるユーザー",
  "組織外のメンバーの許可",
  ]);

  //オーナーに連絡の設定状況を日本語表示させる
  var ownercontact = {
    ALL_MANAGERS_CAN_CONTACT: 'グループの管理者',
    ALL_MEMBERS_CAN_CONTACT: 'グループのメンバー',
    ALL_IN_DOMAIN_CAN_CONTACT: '組織全体',
    ANYONE_CAN_CONTACT: '外部'
  };

  //メンバーを表示と会話を表示の設定状況を日本語表示させる
  var access = {
    ALL_OWNERS_CAN_VIEW: 'グループのオーナー',
    ALL_MANAGERS_CAN_VIEW: 'グループの管理者',
    ALL_MEMBERS_CAN_VIEW: 'グループのメンバー',
    ALL_IN_DOMAIN_CAN_VIEW: '組織全体',
    ANYONE_CAN_VIEW: '外部'
  };

  //投稿を公開の設定状況を日本語表示させる
  var post = {
    NONE_CAN_POST: '投稿不可',
    ALL_OWNERS_CAN_POST: 'グループのオーナー',
    ALL_MANAGERS_CAN_POST: 'グループの管理者',
    ALL_MEMBERS_CAN_POST: 'グループのメンバー',
    ALL_IN_DOMAIN_CAN_POST: '組織全体',
    ANYONE_CAN_POST: '外部'
  };

  //メンバーを管理の設定状況を日本語表示させる
  var managemembers = {
    OWNERS_ONLY: 'グループのオーナー',
    OWNERS_AND_MANAGERS: 'グループの管理者',
    ALL_MEMBERS: 'グループのメンバー'
  }; 

  //グループに参加できるユーザーの設定を日本語表示させる
  var canjoin = {
    ALL_IN_DOMAIN_CAN_JOIN:'組織内のすべてのユーザーが参加できる',
    CAN_REQUEST_TO_JOIN:'組織内のすべてのユーザーがリクエストできる',
    INVITED_CAN_JOIN:'招待されたユーザーのみ'
  };

  //組織外のメンバーの許可の設定を日本語表示させる
  var allow = {
    'false':'不可',
    'true':'可'
  };

  //while文
  while(!endFlag){
    try{
    
    //グループ一覧の取得
    var groupsList = AdminDirectory.Groups.list({
        domain: domain, 
        pageToken: token
    });
    
    for(var i = 0; i < groupsList.groups.length; i++){

      //グループの基本情報を取得
      var value = [];
      value.push(groupsList.groups[i].email); //メールアドレス
      value.push(groupsList.groups[i].name); //グループ名
      value.push(groupsList.groups[i].description); //説明
      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 + '\r\n';
          }
        value.push(memberData);
        } else {
          value.push(''); //メンバーなし
        }

      //グループのプロパティを取得
      var group = AdminGroupsSettings.Groups.get(groupsList.groups[i].email);
      value.push(ownercontact[group.whoCanContactOwner]); //オーナーに連絡   
      value.push(access[group.whoCanViewMembership]); //メンバーを表示
      value.push(access[group.whoCanViewGroup]); //会話を表示
      value.push(post[group.whoCanPostMessage]); //投稿を公開
      value.push(managemembers[group.whoCanModerateMembers]); //メンバーを管理
      value.push(canjoin[group.whoCanJoin]); //グループに参加できるユーザー
      value.push(allow[group.allowExternalMembers]); //組織外のメンバーの許可
      values.push(value); 
    }
  
    if(groupsList["nextPageToken"] == null){
      console.log("Group nextPageToken null: "+ groupsList["nextPageToken"])
      endFlag = true;
      }else{
        token = groupsList["nextPageToken"];
      }
 
    } catch(error) {
      console.log(error);
    }
  }

    //取得したデータをスプレッドシートにセットする
    sheet.getRange(1, 1, values.length , 12).setValues(values);

    //垂直方向の配置を指定する(上に配置:top, 真ん中に配置:middle, 下に配置:bottom)
    sheet.getRange(1, 1, values.length , 12).setVerticalAlignment('middle')
}

Discussion