【G Suite】APIでグループ作成・メンバー追加・アクセスタイプ設定をやってみる

【G Suite】APIでグループ作成・メンバー追加・アクセスタイプ設定をやってみる

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

今回は G Suite Admin SDK を利用してグループの登録を行う Google App Script (以下GAS) を作成してみたいと思います。

前回は G Suite のグループリストを取得してそこにグループメンバーとアクセスタイプ設定を取得して表示するものでした。利用するAPIはそれらと同じものでグループ作成とその設定、メンバー追加をするものです。

準備

GASで利用するため Admin API の有効化をしてください。対象は2つ Admin Directory API と Groups Settings API をONにしてください。 今回はスプレッドシートには触れませんが、スプレッドシートのスクリプトエディタ上で動作を確認しています。

処理の流れ

管理コンソール上でグループ作成をするのと同じような流れを想定しています。

  1. Directory API Groups: insert でグループを作成します。
  2. Groups Settings API Groups: patch でアクセスタイプの設定をします。
  3. Directory API Members: insert でメンバー追加の追加をします。

グループの設定項目は必要最低限のものを設定することしました。また、メンバー登録では複数メンバーを登録するようにコードを書いていますが、登録する際はメールアドレスのみで実施し、ロールなどはデフォルトに従う形になっています。実際にAPIを利用してグループ登録・メンバー登録するシステムを構築するのであればその辺りへの対応も必要になると思います。

ソースコード

コードでは Logger.log() や try…catch が入れてあります。今回は全部エラーが返ってきたら終了するようにしてあります。

//Group作成
function InsertGroup() {
  
  //作成するグループのメールアドレス
  var groupEmail = 'aaaatest.100@classmethod.jp';
  
  //アクセスタイプの設定
  var setting = {
    whoCanContactOwner: 'ANYONE_CAN_CONTACT', ////オーナーに連絡 外部
    whoCanViewMembership: 'ALL_IN_DOMAIN_CAN_VIEW', //メンバーを表示 組織全体
    whoCanViewGroup: 'ALL_MEMBERS_CAN_VIEW', //トピックを表示 グループのメンバー
    whoCanPostMessage: 'ANYONE_CAN_POST', //投稿を公開 外部
    archiveOnly: 'false',
    whoCanModerateMembers: 'OWNERS_AND_MANAGERS', //メンバーを管理 
    whoCanJoin: 'CAN_REQUEST_TO_JOIN', //組織内のすべてのユーザーがリクエストできる
    allowExternalMembers: 'false' //組織外のメンバーの許可 いいえ
  };
  
  //登録するメンバー
  var members = ['aaaa@example.com', 'bbbb@example.com', 'ccc@example.com', 'ddd@example.com'];
  
  //==============================
  //グループ作成処理
  try {
    //グループ作成
    var group = AdminDirectory.Groups.insert({email: groupEmail});
    Logger.log(group);
  } catch(error) {
    Logger.log('name:' + error.name);
    Logger.log('message:' + error.message);
    
    return;
  }
  
  //==============================
  //アクセスタイプ設定
  try {
    //設定更新
    var groupSettings = AdminGroupsSettings.Groups.patch(setting, groupEmail);
    Logger.log(groupSettings);
  } catch(error) {
    Logger.log('name:' + error.name);
    Logger.log('message:' + error.message);
    
    return;
  }
  
  //==============================
  //メンバー追加
  for(var i = 0; i < members.length; i++){
    var member = {email: members[i]};
    
    try {
      //グループにユーザーを追加
      var res = AdminDirectory.Members.insert(member,groupEmail);
      Logger.log(res);
    } catch(error) {
      //グルーブ設定
      Logger.log('name:' + error.name);
      Logger.log('message:' + error.message);
      
      return;
    }
  }  
}

実行結果

上記コードを実行した結果作成したグループを管理コンソールで表示した結果が以下になります。無事グループが作成されアクセスタイプ設定、メンバー追加が行われています。

解説

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

グループ作成

  //作成するグループのメールアドレス
  var groupEmail = 'aaaatest.100@classmethod.jp';
  
  //==============================
  //グループ作成処理
  try {
    //グループ作成
    var group = AdminDirectory.Groups.insert({email: groupEmail});
    Logger.log(group);
  } catch(error) {
    Logger.log('name:' + error.name);
    Logger.log('message:' + error.message);
    
    return;
  }

グループの作成です。Groups.insert()で作成したいグループのメールアドレス(email)だけ指定しています。APIの場合は必須なのはemailのみですが管理コンソール上だと名前(name)も必須項目なので差異のある場所ですね。

メールアドレスの入力だけの場合はnameはデフォルトではemailのローカルパート部分が設定されます。
aaaatest.100@classmethod.jp であれば aaaatest.100 が name になります。また説明(description)も入力できます。

エラーが返ってきたら終了するようにしてありますが、実装したい仕様によってはエラーの中身を判断して処理を続行する場合も想定されます。
例えば、複数グループを一括登録する場合などで既存のグルーブであってもアクセスタイプ設定やメンバー追加を行いたい場合などが考えられます。

Groups.insert() でエラーとなるパターンがいくつか存在しますがその中の例を紹介します。

既に指定したメールアドレスのグループが存在する場合

name:GoogleJsonResponseException
message:次のエラーが発生し、directory.groups.insert の呼び出しに失敗しました: Entity already exists.

入力値が正しくない、Emailであればメールアドレスが正しくない場合

name:GoogleJsonResponseException
message:次のエラーが発生し、directory.groups.insert の呼び出しに失敗しました: Invalid Input: groupKey.

入力したメールアドレスのドメインが正しくない場合

G Suiteで管理されているドメインではないとグループ作成できません。
name:GoogleJsonResponseException
message:次のエラーが発生し、directory.groups.insert の呼び出しに失敗しました: Domain not found.

アクセスタイプ設定

  //アクセスタイプの設定
  var setting = {
    whoCanViewMembership: 'ALL_IN_DOMAIN_CAN_VIEW', //オーナーに連絡 外部
    whoCanContactOwner: 'ANYONE_CAN_CONTACT', //メンバーを表示 組織全体
    whoCanViewGroup: 'ALL_MEMBERS_CAN_VIEW', //トピックを表示 グループのメンバー
    whoCanPostMessage: 'ANYONE_CAN_POST', //投稿を公開 外部
    archiveOnly: 'false',
    whoCanModerateMembers: 'OWNERS_AND_MANAGERS', //メンバーを管理 
    whoCanJoin: 'CAN_REQUEST_TO_JOIN', //組織内のすべてのユーザーがリクエストできる
    allowExternalMembers: 'false' //組織外のメンバーの許可 いいえ
  };
  
  //==============================
  //アクセスタイプ設定
  try {
    //設定更新
    var groupSettings = AdminGroupsSettings.Groups.patch(setting, groupEmail);
    Logger.log(groupSettings);
  } catch(error) {
    Logger.log('name:' + error.name);
    Logger.log('message:' + error.message);
    
    return;
  }

グループのアクセスタイプの設定を行います。管理コンソールだとグループ作成時に設定することになりますがAPIでグループを作成した場合はデフォルトの設定がされています。そのため、任意の設定値に変えてあげる必要があります。

APIで作成直後のデフォルトの設定値は以下の通りです。

このソースの値で設定した場合は以下の通りに設定されます。この辺りの設定値は複数グルーブの一括登録を実装する場合はスプレッドシート上の値を入れたり、デフォルトの設定値としてハードコードすることが考えられます。

この処理でエラーとなるパターンは何れも設定する値に問題がある場合です、その為エラーが返ってきたら処理を終了することになると思います。

メンバー追加

  //登録するメンバー
  var members = ['aaaa@example.com', 'bbbb@example.com', 'ccc@example.com', 'ddd@example.com'];
  
  //==============================
  //メンバー追加
  for(var i = 0; i < members.length; i++){
    var member = {email: members[i]};
    
    try {
      //グループにユーザーを追加
      var res = AdminDirectory.Members.insert(member,groupEmail);
      Logger.log(res);
    } catch(error) {
      //グルーブ設定
      Logger.log('name:' + error.name);
      Logger.log('message:' + error.message);
      
      return;
    }
  }

メンバーの追加は複数メンバーを一括で追加することを想定しています。この記事では Members.insert() でメールアドレスだけ指定しています。この場合、役割(role)はデフォルト値のメンバー(MEMBER)が設定されます。

エラーについてはグループ作成時と同様にエラー内容によっては処理続行する場合が想定されます。
その場合、対応が必要なのは以下の既にメンバーとして登録されていた場合のエラーかなと思います。既にメンバーになっていた場合は無視して他のメンバーを追加するような処理が想定されます。
name:GoogleJsonResponseException
message:次のエラーが発生し、directory.members.insert の呼び出しに失敗しました: Member already exists.

最後に

今回の内容は以上となります。APIを利用してグループの作成からアクセスタイプの設定、メンバー追加の処理が出来ました。

次回は、スプレッドシート上の情報から複数のグループを一括で作成し、かつアクセスタイプの設定、メンバー追加を行うものを作成します。複数グループを一括作成するためには今回参考程度にしていた例外処理についてしっかりと対応する必要があります。それではまた次の記事でよろしくお願いします。

関連記事