1.はじめに
GoogleWorkspaceを使っている方で、
「当社ドメインのユーザーアドレスを全件取得したい!」
「ユーザーアドレスのマスタを日次更新したい!」
などと思っている方、居られるのではないでしょうか。
そんな方々へ、簡単コピペで実現できるGASコードをご紹介します。
2.GASコード
早速コードをどうぞ。
実行すると、シートA列に指名、B列に対応するメールアドレスがズラっと羅列されます。
function listAllUsers(){
let pageToken;
let page;
let result = [];
do {
page = AdminDirectory.Users.list({
domain: 'leverages.jp',
orderBy: 'givenName',
maxResults: 500,
pageToken: pageToken
});
let users = page.users;
if (users) {
users.forEach(x=> result.push([x.name.fullName,x.primaryEmail]))
}
pageToken = page.nextPageToken;
}while (pageToken)
const sh = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("シート1");
sh.clear();
SpreadsheetApp.flush();
const menu = ["氏名","アドレス"];
result.unshift(menu);
sh.getRange(1,1,result.length,result[0].length).setValues(result);
SpreadsheetApp.flush();
}
3.解説-前提
3-1.スクリプトエディタについて
まず、リストを載せるスプレッドシートを用意してください。
スプレッドシートの拡張機能タブからエディタを開いてください。
3-2.権限について
まず、AdminDirectoryを利用できるユーザーでないと実行できません。
GoogleWorkspaceの特権管理者だと実行可能ですが、
部分的に権限を持つことも可能です。
ここは社内の管理者に付与してもらうしかありません。
なぜそんな面倒か、と言いますと、
AdminDirectoryはユーザー情報の編集など、影響の大きい行為を実行できるからです。
誰しもがそんな権限を行使できたら・・・恐ろしいですよね。
ということで、情シスの方に
「GASでAdminDirectoryっての使いたいんだけど、権限もらえる?」
と聞いてみてください。相手が管理者なら分かるはずです。
3-3.AdminDirectoryサービスについて
スクリプトエディタの左側に「サービス」という項目があります。
こちらに「AdminDirectory」との表示がないと、このGASは動きません。
サービスの横の+ボタンをクリックし、
「Admin SDK API」を選択、追加ボタンをクリックしてください。
すると、サービスの欄に追加されます。
3-4.トリガーについて
日次更新したい場合、日次のトリガー設定を行ってください。
後でも解説しますが、毎回データを削除して再取得した内容に洗い替えるコードになっています。
4.解説-コード
4-1.上限突破について
メイン処理のAdminDirectory.Users.listですが、
1回の取得上限が500件までと制限されています。
ですので、do while文を使ってループしています。
page.nextPageTokenで次ページの存在を確認し、
存在確認が取れなくなるまで500件ずつ取得しています。
これで1000件2000件と、500件以上のユーザー数にも対応できます。
4-2.日次更新について
毎日更新することを前提にしているため、
ユーザーリストを取得して貼り付けする前に
シートのデータを全削除する、というコードになっています。
sh.clear() の部分で、シート情報を全てクリアしています。
もしコードを書き替えて、差分情報だけ貼り付けしたい場合などは
この部分を削除してください。
4-3.取得する情報の種類について
今回はA列に指名、B列にメールアドレスを取得しています。
ですが、GoogleWorkspaceからは他にも情報を取得できます。
例えば、nameでもfamilyNameを取得したり、
GoogleWorkspaceの管理者なのかどうかを取得したり、
エイリアスのアドレスを取得したり、です。
取得できる項目は公式ドキュメントにありますので、参照してみて下さい。
5.Usersの活用アイデア
AdminDirectory.Usersの活用アイデアを提案します。
実際に私の環境で使っているものもあります。
5-1.入退社リストと紐づける
入退社リストにアドレス列と処理状態列を作成します。
処理状態に「作成」「削除」をプルダウン入力可能にします。
プルダウン状態を取得し、作成/削除し状態列を作成完了/削除完了にするGASを開発します。
実行時にユーザーマスタシートも最新情報に更新します。
尚、同姓同名の場合にアドレス被りが発生するとエラーになりますので、
エラー時にはアドレス末尾に_1を付けて再実行、
それもダメだったら_2を付けて再度、等の工夫をすると良いでしょう。
5-2.Googleグループマスタと関連づける
メーリングリストとして活用できるGoogleグループ。そのマスタがあったとします。
GASでGoogleグループからメンバ取得する際、メールアドレスしか取得できません。
GASでユーザー名まで取得したい場合、adminDirectory.Usersの情報を紐づけましょう。
関数が得意な場合は、グループマスタとユーザーマスタを関数で紐づけても良さそうです。
件数が多い場合は処理が重くなるので、基本的にはGASでの日次取得がオススメです。
この方法は私も実務で活用しています。
5-3.管理権限等のマスタ及び操作ツールを開発する
取得したUserについて、様々な属性を付与または取得する事ができます。
例えばisAdminを取得すれば、そのアカウントが特権管理者かどうか分かります。
同様にarchivedを取得すれば、アーカイブ状態かどうかが分かります。
また、それらの情報は、updateメソッドによって更新可能です。
よって、GoogleWorkspace上のユーザー情報を管理、編集するための
GASによるwebアプリを開発できるという事になります。
取得可能な情報と実行可能なメソッドはこちら、
ユーザー情報の更新についてはこちらに載っています。
Googleの公式ドキュメントです。
6.さいごに
いかがでしたでしょうか。
ぶわっと結果が表示された瞬間、ワクワクしませんか?
「何かのマスタがある」という状態は、様々な改善への第一歩となります。
ここから関数やGASを派生させて他の何かを管理するも自由です。
ぜひチャレンジしてみてください。
またチャレンジの過程で分からないことがあれば、コメントください。
ありがとうございました。