開発
【GAS】GoogleフォームとGoogle Apps ScriptでGoogle Workspace(旧G Suite)のユーザ作成を自動化する
Junichi Fujinuma
藤沼です。
EJでは会社アカウントの管理をGoogle Workspace(旧称G Suite)で行っています。少数精鋭の比較的小規模な会社であることもあり以前まではアカウント発行を手動で行っていたのですが、業務の合間を使って自動化を行いました。
全体の処理フローの概要としては 『①アカウント作成用フォーム(Googleフォーム)にてユーザが入力する』 ▶ 『②入力内容がスプレッドシートに連携される』 ▶ 『③記録された内容を元に、原簿用シート(別シート)にて整形』 ▶ 『④アカウント作成処理』 といった流れになっています。
肝となる④の部分はGAS(Google Apps Script)にて、Google WorkspaceのAdmin SDKに含まれるDirectory APIを利用することで実装することが可能です。Google公式のAPIリファレンスを見れば分かる通りAPIの構造はかなり単純です。大事なこととしては、スクリプトを実行するアカウントが管理者権限を有していることくらいです。
以下、画面キャプチャを中心に手短に紹介します。Googleフォームやスプレッドシートに関する基礎的な説明は省きます。
①アカウント作成用Googleフォーム
アカウント作成にあたって必要な情報を入力するためのフォームを用意します。このフォームでは、後続のDirecotry APIの処理(④)で用いる「苗字(familyName)」「名前(givenName)」と、パスワード紛失時に利用する「バックアップ用電話番号(recoveryPhone)」と「バックアップ用メールアドレス(recoveryEmail)」を取得しています。
なお、「アカウント用メールアドレス(primaryEmail)」「パスワード(password)」なのですが、このうちメールアドレスとパスワードは③④の処理で払い出すため、フォームの回答欄としては設けていません。

ちなみに画像の例では、原簿を一元管理するために住所や生年月日も取得するようにしていますが、④処理としては用いませんので不要な方は省いてもOKです。
ここで一点注意ですが、電話番号およびメールアドレスの回答欄に関しては必ずバリデーションチェック(回答の検証)を行いましょう。


私の場合、電話番号は正規表現を用いて「10桁または11桁の数字(ハイフンなし)」に一致するかどうかの検証を入れています。メールアドレスに関しては予め用意されている設定で「メールアドレス形式かどうか」の検証が選べますのでそれを利用しています。
②フォーム回答内容のスプレッドシートへの連携
フォームの回答内容をスプレッドシートに反映します。これは一般的なGoogleフォームの設定ですので詳細割愛します。

③原簿用シートを作成
原簿用シートを作成します。基本的には②の内容と同じカラム構造ですが、②で保持していない「状況(A列)」「会社アカウント(L列)」のカラムを追加しています。なお、画像では動作確認用に「パスワード(M列)」のカラムもありますが、当然ながら実運用上では個々人のパスワードを管理するのはNGです。

この時点ではこの原簿用シートはヘッダ行を除き空でOKです。④のGASの処理の中で、②で用意したシートから原簿用シートへの転記を行います。
④原簿用シートへの転記およびアカウント作成処理
いよいよGASでアカウント作成を行います。
今回はAdmin SDKのDirectory APIを利用しますので、GASのエディタの左ペインにあるServicesからAdminDirectoryを追加する必要があります。

サンプルコードは以下の通り。
/* ---------------------------------------------------------------------
/ ・アカウント作成用Googleフォームから入力された回答を「スタッフ一覧」シートにコピー
/ ・「スタッフ一覧」シートの内容を元に会社用アカウントを作成
/ Created by Junichi Fujinuma
/ --------------------------------------------------------------------- */
function createGoogleWorkspaceAccountFromForm() {
/* ---アカウント作成用Googleフォームから入力された回答を「スタッフ一覧」シートにコピーここから--- */
// スプレッドシートとシートを宣言
var ss = SpreadsheetApp.openById('スプレッドシートのID'); // スタッフ一覧のスプレッドシート
var from_sht = ss.getSheetByName('②で作成したGoogleフォーム連携シートのシート名'); // コピー元シート
var dest_sht = ss.getSheetByName('③で作成した原簿用シートのシート名'); // コピー先シート
// コピー元シートの最終行のデータを取得し、コピー先シートの空行に貼り付け
var fromRow = from_sht.getLastRow(); // コピー元シートの最終行を取得
var destRow = dest_sht.getLastRow()+1; // コピー先シートの最終行+1行(空行)を取得
from_sht.getRange(fromRow,1,1,1).copyTo(dest_sht.getRange(destRow,2)); // 日付
from_sht.getRange(fromRow,2,1,9).copyTo(dest_sht.getRange(destRow,3),{contentsOnly:true}); // 日付以外(値の貼り付け)
dest_sht.getRange(destRow,1).setValue('現職') // 1列目(A列:状況)を「現職」に設定
/* 会社アカウント(メールアドレス)を生成 */
var account = dest_sht.getRange(destRow,3).getValue()+'.'+dest_sht.getRange(destRow,4).getValue()+'@nowhere.co.jp'; // 会社のアドレス形式
account = account.toLowerCase(); // 小文字に変換
dest_sht.getRange(destRow,12).setValue(account); // 12列目(L列:会社アカウント)に値を記録
/* ランダムなパスワードを生成 */
var first = '!'.charCodeAt();
var last = '~'.charCodeAt();
var password = '';
for (var i = 0, max = 10; i < max; i += 1) {
var code = first + (Math.random() * (last - first) | 0);
password += String.fromCharCode(code);
}
dest_sht.getRange(destRow,13).setValue(password) // 13列目(M列:パスワード)に値を記録(動作確認用。実運用時はコメントアウト。)
/* パスワード生成ここまで */
/* ---アカウント作成用Googleフォームから入力された回答を「スタッフ一覧」シートにコピーここまで--- */
/* ---アカウント作成処理ここから--- */
var phone = dest_sht.getRange(destRow,6).getValue();
var phoneE164 = '+81'+phone.slice(1); // 電話番号をE164形式に変換(Admin SDKの仕様)
Logger.log(phoneE164);
var user = {
name: {
givenName: dest_sht.getRange(destRow,4).getValue(),
familyName: dest_sht.getRange(destRow,3).getValue()
},
primaryEmail: account,
password: password,
recoveryEmail: dest_sht.getRange(destRow,9).getValue(), // 個人用メアド(バックアップ用)
recoveryPhone: phoneE164 // 電話番号(バックアップ用)
};
user = AdminDirectory.Users.insert(user);
Logger.log('User %s created with ID %s.', user.primaryEmail, user.id);
/* ---アカウント作成処理ここまで--- */
}
つらつらと書いていますが、38行目までは原簿用シートへの反映などの下準備で、Admin SDKに係る処理は40行目からです。
一つだけ私もつまづいたのが、電話番号の部分。国番号を含めた「E.164」と呼ばれる形式で記述してあげる必要があります。これを対処しているのが42行目の部分です。
実行結果は以下の通り。

Google Workspaceの管理画面上でも正しくアカウントが追加されていることが確認できればOKです。

これに加えてログイン情報のメール送信も自動で行えば、アカウント作成作業はかなり省力化できるかと思います。
また、EJではコミュニケーションツールとしてCisco Webexを使っているので、Webexへの招待も自動化できればと考えています。(少し調べた感じではMemberships APIを使えばできそう。)
この他にもGoogle Apps ScriptやWebex API関連の記事はいくつか公開していますので、宜しければそちらも御覧ください。また、業務効率化関連では「Power Automate Desktop」の紹介もしています。
定型化できる単純作業をいつまでもヒトがやるのは、特段の理由がない限りムダです。機械が得意なことは機械にやらせて、ヒトはヒトらしい仕事に集中しましょう。
2024/09/13
2024/05/17
2024/05/10
2024/01/05
2023/08/18
2023/07/14
2023/05/12