GASで全ユーザーのリストをスプレッドシートに日次取得する方法

  • このエントリーをはてなブックマークに追加
  • LINEで送る

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.スクリプトエディタについて

まず、リストを載せるスプレッドシートを用意してください。
スプレッドシートの拡張機能タブからエディタを開いてください。
拡張機能タブからAppsScriptを選択

3-2.権限について

まず、AdminDirectoryを利用できるユーザーでないと実行できません。
GoogleWorkspaceの特権管理者だと実行可能ですが、
部分的に権限を持つことも可能です。
ここは社内の管理者に付与してもらうしかありません。

なぜそんな面倒か、と言いますと、
AdminDirectoryはユーザー情報の編集など、影響の大きい行為を実行できるからです。
誰しもがそんな権限を行使できたら・・・恐ろしいですよね。

ということで、情シスの方に
「GASでAdminDirectoryっての使いたいんだけど、権限もらえる?」
と聞いてみてください。相手が管理者なら分かるはずです。

3-3.AdminDirectoryサービスについて

スクリプトエディタの左側に「サービス」という項目があります。
こちらに「AdminDirectory」との表示がないと、このGASは動きません。

サービスの横の+ボタンをクリックし、
「Admin SDK API」を選択、追加ボタンをクリックしてください。
すると、サービスの欄に追加されます。
AdminSDKを追加

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を派生させて他の何かを管理するも自由です。
ぜひチャレンジしてみてください。

またチャレンジの過程で分からないことがあれば、コメントください。
ありがとうございました。

  • このエントリーをはてなブックマークに追加
  • LINEで送る

コメントを残す

*