2023年 2月 の投稿一覧

GASで全カレンダーリソースの名称とアドレスをスプレッドシートに取得する方法

1.はじめに

GoogleWorkspaceを使っている方で、
「当社管理のカレンダーリソースを全件取得したい!」
などと思っている方、居られるのではないでしょうか。

そんな方々へ、簡単コピペで実現できるGASコードをご紹介します。
これらのデータの活用方法も交えながら解説していきます!

2.コード

ではコードをどうぞ。
実行すると、シートA列に指名、B列に対応するメールアドレスがズラっと羅列されます。
シート名やアドレスはご自身の環境に合った内容に変更してくださいね。

function getResourcesAll(){

  const customerId = AdminDirectory.Users.get("あなたのメールアドレス").customerId;
  let pageToken = '';
  let result = [["名称","アドレス"]];

  do{
      let resources = AdminDirectory.Resources.Calendars.list(customerId, {pageToken: pageToken});
      let items = resources.items;

      for(let item of items){
        result.push([item.resourceName, item.resourceEmail]);
        /**
         * itemから取得可能なプロパティは以下の通り
         * resourceEmail
         * capacity
         * etags
         * resourceName
         * resourceCategory
         * generatedResourceName
         * resourceDescription
         * resourceId
         * buildingId
         * kind
         */
      }
      pageToken = resources.nextPageToken;      
    }while(pageToken);
  
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("シート1");
  sheet.clear();
  SpreadsheetApp.flush();
  sheet.getRange(1,1,result.length, result[0].length).setValues(result);
}

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.customerIdについて

最初で定義するcustomerId、ご自身のメールアドレスから取得と書いていますが、
必要なカレンダーリソースをGoogleカレンダーに登録しているアカウントにしてください。

実際に実務で検証してみたところ、
そのアカウントがカレンダー上に表示可能なリソースとして登録している分だけを取得できるようです。

例えば会議室A,B,Cがあったとして、
自身の「マイカレンダー」「その他のカレンダー」にAとBしか登録していなかった場合、
customerIdに自身を設定するとCの情報は取得できません。
必要なカレンダーを予め「マイカレンダー」か「その他のカレンダー」に登録しておくか、
必要なカレンダーが登録されているアカウントをcustomerIdに設定してください。
「マイカレンダー」「その他のカレンダー」の設定方法はこちらです。

4-2.各リソースから取得可能な値について

for文内のコメントに記載していますが、
各カレンダーリソースから様々な情報を取得可能です。

例えばcapacity。
会議室に収容人数を設定していた場合、その値が取得できます。

他にもbuildingIdなど、活用すると拠点情報と紐づけできそうです。
例えばGASを使って空き状況を可視化したい場合などを想定すると、
拠点ごとに検索をする必要がありますから、ビルディングの設定は必須です。

取得する項目を変更する場合、冒頭で定義しているヘッダ項目名を変更するなど
二次元配列の列構成に気を付けてコードを変更してくださいね。

4-3.シートクリアについて

貼り付ける前にシート内容を「sheet.clear()」でクリアしています。
もしコードを書き替えて、差分情報だけ貼り付けしたい場合などは
この部分を削除してください。

5.活用方法のアイデア

様々な活用方法があると思います。

5-1.社員に見せるためのマスタ情報とする

「リソースのブラウジング」という機能があるので、
一般ユーザーが普通にカレンダー登録する際には特にマスタは必要ありません。

ですが例えばcapacity属性に登録した収容人数情報がシートに自動連携され、
一覧性のある状態になっていれば便利そうじゃないですか?

また各社員での開発が盛んな企業の場合、
リソースIDを公開しておくことにも意義があります。

5-2.空き会議室検索ツール用のマスタ

実務で作成しました。
開始時刻と終了時刻、対象の拠点を選択して、
その時間帯に空いている会議室を表示するアプリを開発できます。

Googleカレンダー上でも予定を作成する画面上で空き部屋を検索可能ですが、
「予定作成画面をわざわざ開かずに見たい」というユーザーには好評です。
まあ、UI/UXの好みの問題でしょうね。

5-3.リソース管理/更新用アプリを開発する

マスタ上に「ビルディング/リソースの作成/変更/削除」機能をGASで持たせましょう。
GoogleWorkspace上で操作しなくても、マスタを参照しながらマスタシート上で
管理/更新を一括管理するアプリを開発できます。

あまり手間をかけずに更に拡張するなら、
総務系の拠点管理担当からリソース作成等の依頼を飛ばせる依頼用UIを開発しましょう。
その依頼内容を以て、承認できるようなUIも作成。
承認したら作成等の処理とマスタ更新が走ります。
更新メニューを開く事のできるアカウントを制限するとより良いでしょう。
GASでのwebアプリ開発経験者にとっては、あまり難しくないと思います。

6.さいごに

いかがでしたでしょうか。
たかがカレンダーリソースですが、
固く運用するのであれば開発のし甲斐がありそうですよね。

ご参考になれば幸いです。ありがとうございました。

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

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

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