Googleカレンダー連携タイムラインを作る【GAS】

以前、Googleスプレッドシートのタスクを元にjQueryライブラリにてタイムラインアプリを作成したことがあります。同じ仕組みを作って、Google Groupに参加してるメンバーのカレンダー情報を投影できないか?ということで今回作成してみました。

外部メンバーでもGoogleアカウントであるならば表示させることは可能ですが、相手に閲覧を許可しておく必要性があります。

所謂、組織カレンダーと呼ばれるものを模して作成したもので、同様のものはrakumoサテライトオフィスがアドオンとして提供している。元々はCybozeのスケジュールカレンダーが発祥と思われるこの機能日本企業だと結構需要があるのです。

Googleスプレッドシート連携タイムラインを作る【GAS】

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

利用する為には事前準備が必要です。また、今回はグループのメンバーデータを取得する為にAdmin SDKを使って管理コンソールからデータを取得する仕様になっているので、管理者権限を持つものでウェブアプリをデプロイする必要があります。

また今回利用してるライブラリがGoogle Visualization APIのDataTableを利用してる為、そのライブラリも追加されています。

fullCalendarだとより高度がことが可能ですがタイムライン機能はPremiumの機能なのでライセンス購入が必要です($480くらい)。

図:タイムライン表示のメイン画面

利用にあたっての事前準備

GAS側

コード内

GASのコード内に於いて、コード.gsの上部にあるdomain変数に自身のテナントのドメインを入力します。Admin SDKを利用してグループのリストやそのメンバー情報を取得する為に必要です。

図:ドメインを入力して保存

HTML内の参照ライブラリ

今回のサンプルの場合、index.htmlがウェブアプリの本体になります。このファイル冒頭のHead部分でタイムラインライブラリ等を参照していますが、JSやCSSの一部がこのサーバに格納してるライブラリを指定しています。ここはご自身で前述のタイムラインライブラリをダウンロードして、参照するURLを書き直しておくと良いでしょう。

図:サンプルはこのサーバ上のライブラリを使ってます

設定を行う

スプレッドシートのメニューに表示されてる「タイムライン」を開くと2つ項目が出てきます。それぞれを実行します。

  • セットアップ:スプレッドシートのスクリプトプロパティにファイルのIDが記述されます(ウェブアプリ用)
  • グループ書き出し:Google Workspaceのテナントに作成済みのグループアドレス一覧をシートに書き出します(これがカレンダー表示のソースになる)

ただし、グループについては組織カレンダーに合うものだけに削ったほうが良いでしょう。手動で登録しても問題ありません。また、アプリケーションの仕様として

  • グループアドレスの中にグループアドレスがあっても無視されます(ユーザのみが対象となるし子グループ内まで探索しません)
  • グループアドレス内にあるメンバーはGoogleアカウントである必要があります(M365ユーザが居てもカレンダーデータは取得出来ません)
  • 外部メンバーであってもGoogleアカウントであるならばカレンダーデータは取得可能です。
  • カレンダーデータはタイトルと時間のみを取得し、ユーザ名とメアドのみがAdmin SDKで参照されます。
  • 今回のアプリではユーザに直接紐付くデフォルトカレンダーのみが対象。別途作ったカレンダーについては検証していません。
  • デプロイした人のカレンダーには、ユーザがカレンダーにアクセスする毎に個人のカレンダーが自動subscribeされて追加されていきます。

図:セットアップが必要

Webアプリケーションとしてデプロイ

事前準備が完了したら、ウェブアプリケーションとしてデプロイします。デプロイしたものを社内ポータルのGoogle Sitesなどに貼り付けると良いでしょう。

  1. スクリプトエディタを開く
  2. 右上のデプロイをクリック
  3. 新しいデプロイをクリック
  4. 種類の選択ではウェブアプリを選択し、次のユーザとしてアプリケーションを実行で誰の権限で動かすかを指定する。今回は自分自身を指定します。
  5. アプリケーションにアクセスできるユーザを指定する。今回は組織内ユーザに限定します。
  6. 最後に導入すると、ウェブアプリケーションのURLが取得できます。このURLでアクセスをします。URLの最後がexecが本番用、devがテスト用で、テスト用はデプロイをテストをクリックすると表示されますが、変更したコードがそのまますぐに反映されてしまうので、テスト用のURLで運用しないように。
  7. 次回以降コードを編集して再デプロイ時はデプロイを管理から同じURLにて、新しいバージョンを指定して発行することが出来ます。

図:今回は次のユーザとして実行は管理者権限のあるアカウントにて

Google Apps Scriptでウェブアプリケーション作成入門【GAS】

新しいGoogle Sitesを使い倒してみた

一般ユーザ側

Googleカレンダーは仕様上、相手が自分自身と共有していて尚且つ自身のカレンダーに相手のカレンダーを追加登録していないとデータが取得出来ません。よって、ユーザサイドでは以下の設定をしておく必要があります。

  1. Googleカレンダーを開く
  2. マイカレンダー一番上にある自分自身に直接紐付くカレンダーにカーソルを合わせて、「︙」をクリック
  3. 設定と共有をクリックする
  4. 予定のアクセス権限にて、xxxxで利用できるようにするにチェックを入れて、内容は時間枠のみ・詳細は非表示だとタイトルが取れないので、すべての予定の詳細を選択する
  5. もしくは、下のほうにある「特定のユーザーまたはグループと共有する」にて、ユーザやグループを追加をクリック。
  6. デプロイした人のアドレスを入れて共有する

図:設定と共有を開く

図:デプロイした人にカレンダーが見えないと取得出来ない

ソースコード

GAS側コード

  • 殆どのコードが指定のグループアドレスからグループ情報の取得メンバーの取得、メンバーの詳細情報を取得する関数になります。
  • 個別カレンダーを取得する為にsubscribeToCalendarにて自動でカレンダー追加を行わせています。
  • recalendar関数がメインの関数。デフォルトは1週間分のデータを取得します。
  • 日付期間を指定してカレンダーデータを取得する場合の条件分岐をrecalendar関数で指定。その際に最終日+1日しないと最終日のカレンダーデータが取れないので加工しています。
  • 指定期間内のカレンダーにイベントがないと、その人が組織カレンダー一覧に出てこなくなってしまうのでダミーで空のデータを必ず入れています

カレンダーデータの取得周りは以下のエントリーで別にまとめています。

Google Apps Scriptでグループメンバーとカレンダーリソースを取得する

HTML側コード

  • 基本的には前回の記事の内容とほぼ同じ
  • ただし、カレンダーデータの取得をするため、選択中グループアドレスの取得などに変更をしています。
  • またウィンドウをリサイズした際にフィットするようにsetGridHeightなどの関数をイベントに追加しています。
  • 省略したCSS部分で個別のパーツのカスタマイズを追加しています。
  • 予定クリック時に予定のタイトルを表示するように変更しました。

ベースになるアプリであるため、まだ色々と足りない部分は多いと思います(例えばこの上から予定を追加するであったり、予定クリック時の詳細な内容を表するロジックなど)。また、デプロイした人の管理者権限で動いてる為、個別の予定の追加となるとデプロイした人のカレンダーに予約が書き込まれてしまうので、以下のエントリーのようなサービスアカウントとGoogle APIを利用して登録する仕組みが別途必要です。

Google Apps Scriptで一部だけをユーザ権限で動かしたい時は?

関連リンク

コメントを残す

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

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