Google Apps Scriptでグループアドレスの作成・削除を行う【GAS】

Google Apps Scriptで地味な存在ながら非常に重要な機能を担ってるのが「Googleグループ」。単なるメーリングリストとしての機能だけではなく、Google Driveのアクセス権をまとめて付与する場合にも、このグループのアドレスで管理したりします。

そんなグループアドレスを作成するにはちょっと手間が必要です。

今回使用するスプレッドシート

グループの作成で利用するメソッドは、Google Workspaceの管理者権限が必要です。よって通常のユーザ権限では実行ができないので要注意。今回のコードでは紹介していませんが、Enterprise Standard以上で使える動的グループについては、Admin SDKではなくCloud Identity APIを使って作成が出来るようです。

Google Workspaceの動的グループで楽をしよう【GAS】

事前準備

グループの作成は1つのメソッドではなく、3つのメソッドを使って作成する必要があります。また、その際に利用するクラスは

スクリプトエディタを開き、左サイドバーのサービスの+をクリックして以下の追加を行います。

  1. Admin SDK APIを追加する
  2. GroupSettings APIを追加する

図:2つのサービスが必要です

ソースコード

グループを作成 => グループ設定を変更 => メンバーを追加という3ターンで1グループが作成できます。

グループの作成

  • AdminDirectory.Groups.insertで追加します
  • emailがグループアドレスの指定場所
  • nameがグループ名を指定する場所です

グループ設定変更

このグループ作成で一番配慮しなければいけないのが、グループのアクセス設定。一歩間違えると社内のメールが外部の第三者にだだ漏れという事件が嘗てありましたが、それが起こりかねません。また勝手に外部のメンバーがリクエストしてグループに入れるというのもマズイ。

また、内部の人間にむやみに権限を与えて、外部メンバーを追加できてしまうというのもまたマズイということでこれらのアクセスタイプ。これをよく考えてコードで設定する必要があります。

アクセスタイプについて

次のコードのoptionの中身がグループに対する様々なアクセス権を設定するものになります。主によく使うパターンは以下内容になります。

  • whoCanViewMembership(メンバーを表示できるユーザ)
    ALL_IN_DOMAIN_CAN_VIEW = 組織全体
    ALL_MEMBERS_CAN_VIEW = グループメンバー
  • whoCanContactOwner(グループのオーナーに連絡出来るユーザ)
    ANYONE_CAN_CONTACT = 外部含め誰でも
    ALL_MEMBERS_CAN_CONTACT = グループメンバー
  • whoCanViewGroup(会話を閲覧できるユーザ)
    これが一番重要な設定で誤った設定をすると第三者にグループメールの中身が世界中に漏洩することになります。
    ALL_IN_DOMAIN_CAN_VIEW = 組織内なら誰でも
    ALL_MEMBERS_CAN_VIEW = グループメンバー
  • whoCanPostMessage(投稿出来るユーザ)
    こちらも通常はメンバー以外の投稿を認めない設定が良いでしょう
    ANYONE_CAN_POST = 外部含め誰でも
    ALL_MEMBERS_CAN_POST = グループメンバー

    ALL_IN_DOMAIN_CAN_POST = ドメイン内のメンバーならだれでも
  • whoCanModerateMembers(メンバーの管理)
    通常メンバーにメンバーの管理権限は与えません
    OWNERS_ONLY = オーナーのみ
    OWNERS_AND_MANAGERS = オーナーとマネージャのみ
  • whoCanJoin(グループに参加できるユーザ)
    CAN_REQUEST_TO_JOIN = 組織内全員がリクエスト出来る
  • allowExternalMembers(組織外のメンバーの許可)
    false = 外部メンバー追加はさせない
    true = 外部メンバーを追加を許可する
    ※但し、trueでなくとも管理コンソールからは追加できる。しかしGASからはtrueにしておかないと外部メンバーは追加できない

ソースコード

  • optionにて、アクセスタイプを定義します
  • 今回のオプションは社内で利用する場合に推奨されるパターンのオプションとなります。
  • AdminGroupsSettings.Groups.patchにてアクセスタイプを反映させます
  • groupaddressにはグループアドレスを入れます。

図:これがアクセスタイプ

メンバーの追加

AdminDirectoryを使う場合

  • member変数でJSON形式でメンバーのアドレスを構築
  • AdminDirectory.Members.insertにてメンバーを追加する
  • groupaddressにてグループアドレスを指定する

Cloud Identity Groups APIを使う場合

2020年10月に追加されたCloud Identity Groups APIというものがあるのですが、こちらのAPIを使ってメンバーの追加や更新を行う場合は、対象者のグループ参加有効期限を設定可能です。GUI上や他のメソッドからは出来ない動作になります。このAPIはREST APIとなっているため、GASからはUrlfetchAppで叩いてリクエストしますが、Cloud Identity Premium / Enterprise Standard以上でなければ利用出来ません。

このAPIはGCP側のAPIとなるので、事前準備が必要です。以下の手順で構築します。

※但し、1時間後にexpireと指示してみましたが、削除されず・・・日数単位での指定が必要のようです。

※セットしてる最中は、対象者のロールの変更などは手動で出来ません。

APIを有効にする

Google Cloud Console側でAPIを有効化する必要性があります。

  1. GCPのプロジェクトを開く
  2. 左サイドバーからAPIとサービスにて、「APIとサービスの有効化」をクリックする
  3. Cloud Identityと検索すると出てくるので、クリックします。
  4. 有効化をクリックします。
  5. Admin SDK APIも検索して追加しておきます。
  6. 認証情報の作成は不要です

GASのスクリプトエディタ左側のサービスにて、Admin ADKも追加しておきましょう。

図:有効化をしておくだけでOK

図:サービスとしても追加

GASのプロジェクトを紐付けする

Google Apps ScriptとCloud Consoleのプロジェクトを紐付けする作業が必要です。以下の手順でプロジェクトの変更を行います。

  1. Cloud Console側のプロジェクトのホームを開き、「プロジェクト番号」を控えておく
  2. Google Apps Scriptのスクリプトエディタを開く
  3. サイドバーからプロジェクト設定を開く
  4. GCPプロジェクトの「プロジェクトを変更」をクリック
  5. GCPのプロジェクト番号に、1.の番号を入力して、プロジェクトを設定をクリック
  6. これで紐付けが完了しました。

図:プロジェクトの移動も必須の作業です

appscript.jsonの編集

appscript.jsonに以下のような感じで、oauthScopesを追加して起きます。appscript.jsonの表示は、サイドバーのプロジェクト設定より、「appsscript.json」マニフェスト ファイルをエディタで表示するにチェックを入れると表示されるようになります。GCPのAPIを使う為に必要です。

セットするソースコード

このコードは対象のグループに対して、期限付きでユーザを追加するコードです。すでに追加済のユーザに対しての変更は、こちらのメソッドを利用して更新します。

  • getGroupName関数で、groups/xxxxという形式のグループのリソース名を取得しておきます。
  • getCustomerId関数で、Google Workspaceの顧客IDを取得します(管理コンソール上でも表示されてる)
  • makeGroupUserlimit関数にて、グループリソース名をもってしてURLを構築し、対象ユーザに期限を設定して追加します。
  • 利用するエンドポイントは、「https://cloudidentity.googleapis.com/v1beta1/groups/xxxx/memberships」という形式になります。
  • リクエストボディにn日後のリミットとしてexpireTimeを指定し、このときの日付時刻はJSTで指定すること
  • 成功するとレスポンスコードは200で返ってくる

管理コンソール上のグループにはこれでメンバーが新規追加されますが、表面上リミットを確認する為のUIは存在しません。成功すると以下のような内容がレスポンスとして取得可能です。

expireする日を確認するコード

expireする日を指定することは出来ましたが、管理コンソール上などで失効する日は確認することができません。よって、これはコードでのみ確認することが出来ます。以下のコードの中でグループアドレスと対象者メアドを指定することで、対象者にセットされてる失効日確認することが可能です。

グループの削除

作成済みのグループアドレスの削除は非常に簡単です。AdminDirectory.Groups.removeに対してメアドを渡して実行するだけです。

関連リンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)