Google Apps ScriptのAdmin SDKでユーザ作成フォームを作る【GAS】

G Suiteを運用しているといつも面倒に感じてるのが、G Suiteの管理画面での作業。ブラウザ上で様々な設定やユーザ管理などなどを行う管理者用のページなんですが、インターフェースがいちいち使いにくい上に、どこに何があるのかが非常に分かりにくいサービスです。また、実際にはユーザを追加するといっても、同姓同名がいたり、どこの施設所属などの情報を持てないので、結局スプレッドシートに書き出して追加なんて羽目になっていたりします。

また、このページは他のGoogle系サービスのサイトと異なり、admin指定のアカウント以外入れないので、切り替えてログインしなければいけなかったりします。当然ユーザを追加したら、申請者に通知もしてあげなければならず、メールで送るなどの作業も必要でしょう。という具合に、1ユーザ追加するといっても、煩わしい事この上ない。作成するアカウント量が多ければ多いほど、それはやっかいになり膨大な時間を消費する事になります。

ということで、申請~承認~アカウント作成~メールで申請者に通知(PDFで書類を添付)~メールアドレス一覧に書き込み、までをGoogle Apps Script上でやってしまおうという事から作り、現在活用しています。その際に必要になるのが、Admin SDK。当たり前ですが、実行するには管理者権限が必要になります。自分は自分に限定管理者の権限を付与しているので、アカウント切り替えせずにGAS上でそのまま作業を行っています。

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

事前準備

Adminページでの作業

APIアクセス許可

Adminにログインしたら以下の設定を施して、Admin SDKからの操作を許可してあげます。

  1. Adminコンソールにログインする
  2. ホーム画面下の「その他の設定」をクリックする
  3. セキュリティ」の項目があるので、クリックする
  4. 真ん中あたりに「APIリファレンス」があるのでクリックして開く
  5. APIアクセスを有効にするにチェックを入れる。これで完了

図:下の方に設定項目が隠れています。

図:APIアクセスを許可してあげましょう。

作成者へ権限付与

特権管理者ですべての作業を行うのは懸命なこととは言えません。すべての操作が可能になってしまいます。通常の担当者にユーザの追加や削除などの権限程度を付与してあげましょう。アカウント切り替えてスクリプトを実行するといった面倒が生じなくなります。

  1. Adminコンソールにログインする
  2. ホーム画面より、「ユーザ」をクリックする
  3. 権限付与したいユーザを探し出してクリックします。
  4. 管理者の権限と役割という項目があるので、クリックして開きます。
  5. 今回はここで「ユーザ管理者」の割当状況をオンにしてあげます。もう少し下の権限でも良いでしょう。

これで権限付与は完了です。特権管理者じゃなくとも、担当ユーザの権限でスクリプトを実行してユーザの作成が可能になります。

図:管理者の権限を付与してあげる

図:ユーザ管理者権限で作成が可能

プロジェクトを移動

今回の発表直前の2019年4月8日より、Google Apps ScriptからCloud Platform Projectへ直接アクセスが出来なくなりました。これまでにデプロイしてるものについては、これまで通り「リソース」⇒「Google Cloud Platform API ダッシュボード」からアクセスが可能です。

今回の変更はスプレッドシート上で動かすスクリプトやGoogleの拡張サービスを利用しないタイプのスクリプトであれば特に問題はありませんが、「Apps Script API」や「Google Picker API」、「Cloud SQL接続」などGCP上のAPIを利用する場合には以下の手順を踏んで、Google Apps Scriptにプロジェクトを連結する必要があります。これまでは、自動的にGCP上にGoogle Apps Script用のプロジェクトが生成されていたのですが、今後は自分の組織(もしくはGCPプロジェクト)上で作成されたプロジェクトでなければならないということです。詳細はこちらのページを見てください。

連結する手順は以下の通り

  1. Google Cloud Consoleを開く
  2. 左上にある▼をクリックする
  3. ダイアログが出てくるので、新規プロジェクトを作るか?既存のプロジェクトを選択する。この時、G Suiteであれば選択元は「自分のドメイン」を選択する必要があります。
  4. プロジェクト情報パネルから「プロジェクト番号」をコピーする
  5. 対象のGoogle Apps Scriptのスクリプトエディタを開く
  6. 「リソース」⇒「Cloud Platform プロジェクト」を開く
  7. 4.で入手した番号をプロジェクトを変更のテキストボックスに入れて、プロジェクトを設定ボタンをクリックする
  8. 無事に移動が完了すればメッセージが表示されます。
  9. この時、元の自動作成されたプロジェクトはシャットダウンされて消えます。これで設定完了です。

今回のこの変更だと1つ作ったプロジェクトに集約する必要があるので、クォータについてプロジェクト毎のカウントだったので問題なかったものが、集約されることで、クォータに引っ掛かる可能性があります。

図:プロジェクト番号をコピーしておきます

図:プロジェクトを他のプロジェクトに紐付けしました。

図:GCPの拡張サービスを使うには手順が必要になった

APIを有効にする

申請フォームスプレッドシートを開き、スクリプトエディタに入り、APIを有効化します。

  1. スクリプトエディタのメニューより「リソース」⇒「Googleの拡張サービス」を開きます。
  2. Admin Directory APIを有効化します。
  3. 続けて、「Google Cloud Platform API ダッシュボード」をクリックします。
  4. APIとサービスにて、「APIとサービスの有効化」をクリックする
  5. admin sdkと検索すると出てくるので、クリックします。
  6. 有効化をクリックします。
  7. 認証情報の作成は不要です

図:Admin Directory APIが必要

図:Admin SDKを有効化しましょう。

Picker用のAPIキーを入手しセットする

APIを有効にする

Cloud ConsoleはGoogleの各種APIやウェブサービスを使う時に必要になるものですが、よく使うのは各種APIをプログラム(AndroidやNode.js等々)から利用するケースです。もちろん、Google Apps Scriptからも使えます(Google Apps ScriptにはないAPIもこれで使えるようになったりします)。

APIとサービスのダッシュボードより「APIとサービスの有効化」よりサービスを探して、有効化します。今回はファイルやフォルダをチョイスする「Google Picker API」を元に進めてみます。検索画面より「Picker」と入れると、Google Picker APIが見つかります。このAPIは引き続き認証情報を作成する必要があります。

図:Google Picker APIはよく利用します

認証情報を作る

引き続き認証情報を作る必要があるAPIがあります。今回のPicker APIも同様です。右上の「認証情報を作成」をクリックするか?左サイドバーの「認証情報」より作成開始します。ここで作成するのはAPIキーと呼ばれる単一のコードで、Google Maps APIなどでもよく使っていた1行の文字列です。

プロジェクトへの認証情報追加画面にて、必要な認証情報ボタンをクリックするとすぐにAPIキーが生成されます。これをAPI利用時に使いますので、取っておきます。他人に知られてはなりません。キーは再生成も可能です。

図:APIキーをゲットしたらAPIが利用できます。

※APIキーを入手したら、ソースコード内のPicker.html3種類に其のキーをセットしてあげてください。

ソースコード

申請フォームのコード

HTML側コード(workflow.html)

  • 申請部分はそのほとんどが、申請内容のValidationやGAS側へのデータの送信が占めています。
  • 内容は長いコードではありますが、シンプルです。
  • ユーザが使いやすいように、JavaScriptの様々なライブラリを活用して利便性を向上しましょう。

GAS側コード(telepon関数)

  • 今回のフォームは申請者側にも管理者側にもメールで作成申請内容が自動応答で通知されます。
  • 通知されるメールはレスポンシブメールとして送られるので、スマフォでも見やすいものになっています。
  • 内容は送信ログシートに記録されます。

ユーザ追加コマンドのコード

HTML側コード

  • ほとんどのコードは申請フォーム同様、申請中ステータスになっているものをリストアップしてダイアログに表示します。
  • 承認の場合の処理と却下の場合の処理はそれぞれ、telepon3という同じ関数に引数でわかるように渡しています。

GAS側コード

  • telepon3が作成のルーチンではあるが、今回のテーマである「Admin SDK」にて管理者サイトに対して、実際にアカウント作成の命令を投げているのは、addUser関数である。
  • 作成した内容はTemplateに従い通知書を作成、addUserで管理コンソールで自動生成されたパスワードを取得されたものを追記しています。
  • 作成が無事に完了すると、通知されステータスは承認もしくは却下が記録されます。

実行と結果

本フォームおよび作成の為には事前に作業が必要です。以下の手順で作業をしましょう。

サイドバーの設定

  1. スプレッドシートメニューより「作業用」⇒「設定」を開く
  2. 管理者通知アドレスには、申請されてきたときにメールが届く先のアドレスです。
  3. ファイル格納場所として、フォルダを適当に作り、Google Drive内のフォルダをPickerで選択しましょう。GSアカウントの通知書が発行される場所です。
  4. PDF格納場所として、3.と同じく作業をします。通知書をPDF化してメールで送ります。
  5. 発行通知Templateとして、今回使用するファイルのTemplateを指定します。

この作業を行わないと、フォームが機能しません。

ウェブアプリケーションとして公開

申請フォームをオープンにしないと、誰も申請することができません。そこで、以下の作業をしておきましょう。

  1. スクリプトエディタのメニューより「公開」⇒「ウェブアプリケーションとして導入」を実行
  2. プロジェクトバージョンはNew、次のユーザとしてアプリケーションを実行は、作成者の自分で良いでしょう。
  3. アプリケーションにアクセスできるユーザは、通常はドメイン内の全員。外部に公開する必要はないので、全員や匿名ユーザの選択はする必要はありません。
  4. 更新ボタンを押すと、最後にexecのついたURLが生成されるので、これをGoogle Siteなどに貼り付けましょう。

セッティング

今回のフォームは以下のセッティングが必要です。

  1. スプレッドシートの設定シートにて、ドメインリストに発行する所持しているドメインをリストアップします。1組織で複数のドメインをG Suiteに持っている場合には複数記述しましょう。
  2. スプレッドシートの施設名リストには、例えば本店や支店などの発行管理単位を記述しましょう。申請者がどこに所属しており、どこの施設のアカウントを発行したいのか?申請時に自動このリストを読み取って選択肢として組み立てます。

作成手順

  1. 申請フォームから個人・部門アカウントでユーザは申請をすると、管理者に通知が来ます。申請中ステータスで送信ログシートに記録されます。
  2. 管理者は通知が来たら、スプレッドシートのメニューより「作業用」⇒「GSアカウントの承認・作成」を実行
  3. ダイアログが出るので、作成するアカウントのラジオボタンをクリックして選択。
  4. 承認、もしくは却下ボタンをクリックする
  5. 承認の場合、通知書が作成されaddUser関数でAdmin SDKが実行されてアカウント作成、PDF化されたファイルが添付されて、申請者に対してメール通知されます。
  6. 作成されると承認ステータスになり、発行済には自動的にリストが登録され、以降同じメアドでの発行をしようとしてもプログラム中で存在確認されるので、エラーを防ぐ事ができます。

図:アカウント作成用ダイアログ

ポイント

  1. 申請用スクリプトやフォームを別途作成して、スプレッドシートに必要事項を申請者に入れさせるようにしましょう。そのデータをこのユーザ作成スクリプトで利用します。
  2. 自分はユーザリストを別にスプレッドシートに持たせてるので、申請フォームでまず同一アドレスがあるかどうか?チェックさせています。
  3. Admin SDKで現在のユーザ一覧を取得はできますが、一応制限もあるので、あまり多用はしないように。
  4. 承認フォーム&スクリプト側に上記のコードを入れてあります。承認を実行すると、ユーザの追加が実行されるわけです。
  5. 自分は、ユーザ追加が実行がされたら、申請スプレッドシートの該当データをユーザリストにappendRowしてます。
  6. 今回はランダム生成したパスワードをこちらで設定するようにしています。それらを元に通知用テンプレートスプレッドシートに情報を書き込み、PDF化してメールで申請者に送信しています。
  7. Admin SDKは基本、管理者用ページで出来る事のかなりのことが、スクリプトで実行できるようになっていますので、応用すると結構いろいろ半自動化が出来ると思います。

関連リンク

コメントを残す

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

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