カテゴリー内の他の記事

kintoneのイベント・フェアカレンダーの日程をGoogleカレンダーに公開しよう!

はじめに

kintoneアプリのイベント・フェアカレンダーを利用して、イベントの日程をGoogle WorkspaceのGoogleカレンダーに連携して社内で共有します。

有料のGoogle WorkspaceのGoogleカレンダーですと社内でイベントの日程を管理し、承認後に社内でカレンダー日程をセキュアに共有したい場合などに利用できますし、設定で一般公開すれば、社外にもEメール等でイベントの告知とカレンダー日程の同期が可能になります。

1. 事前に必要なもの

  • Google Workspace アカウント(有料アカウント)
  • kintoneアカウント

2. 開発の流れ

以上の手順で開発して行きます。

3. Googleカレンダーの作成・設定

ステップ1

Google.comより、ログインし、右上Googleアプリアイコンより、カレンダーを選択します。

01_Google_____.png

左サイドメニューの他のカレンダーの右側の「+」をクリックして、「新しいカレンダーを作成」を選択します。

02____________.png

 カレンダー名を入力し、「カレンダーを作成」ボタンをクリックし、カレンダーを作成します。

03______________.png

次に左メニューより、新しく作成されたカレンダーのオーバーフローメニューより、「設定と共有」を選択します。

04_____________.png

「アクセス権限」のセクションにおいて、「{組織名}で利用できるようにする」をチェックします。

ドロップダウンより「予定の表示(全ての予定の詳細)」を選択します。

05_______________.png

次に「特定ユーザーとの共有」設定で、「ユーザーを追加」をクリックし、組織内のユーザーのメールアドレスを追加します。

また「権限」のドロップダウンで「予定の変更」を選択します。

「送信」ボタンをクリックすると指定したユーザーに招待状が送信されます。

指定したユーザーが招待状を承認することにより、作成した「イベント・フェアカレンダー」が共有できるようになります。

06____________.png

「設定」において、さらに下の項目にスクロールすると「カレンダーの統合」の項目内に「カレンダー ID」が表示されているので、メモしておきます。後のプログラミングの際に必要になります。

07_______ID___.png

ステップ2

次にGoogle APIを利用するためにGoogleカレンダーAPIの認証情報を設定します。
まず、Google APIのデベロッパーコンソールにログインします。
ダッシュボード画面が表示されたら、下の画像のように右上の「プロジェクト作成」をクリックします。

08____________.png

 プロジェクト名を入力し、「作成」ボタンをクリックすると、新規プロジェクトが作成されます。

09_Google_API_____________.png

 

ステップ3

「APIとサービスの有効化」をクリックして、「APIライブラリ」設定画面へ移行します。

10_API__________.png

G Suite カテゴリーより、「Google Calendar API」を選択します。

11_Google_Calendar_API__.png

「有効にする」をクリックして、Google Calendar API を有効にします。

12_Google_Calendar_API____.png

ステップ4

右上の「認証情報を作成」をクリックします。

13_Google_Calendar_API______.png

使用するAPIに「Google Calendar API」を選択し、APIを呼び出す場所に「ウェブブラウザ(JavaScript)」、アクセスするデータの種類に「ユーザーデータ」を選択し、「必要な認証情報」をクリックします。

14________________.png

「OAuth同意画面の設定」が表示されるので、「同意画面を設定」をクリックする。

15_Oauth_______.png

ステップ5

アプリを使用するユーザーのタイプを選択し、「作成」をクリックします。今回は、「内部」を選択しました。尚、このオプションは、有料アカウントの場合のみ選択可能です。

16_OAuth____.png

 OAuth同意画面にて、「同意を求めるアプリの名前」を入力し、「ユーザーサポートメール」を選択します。

17_OAuth_________.png

 「承認済みドメイン」にお使いのkintoneのドメイン名を入力(例:cybozu.com)し、「デベロッパーの連絡先情報」にメールアドレスを入力、「保存して次へ」をクリックします。

18_OAuth______.png

スコープに「Google Calendar API」を選択し、「更新」をクリックします。

19_________.png

内容を確認して、「保存して次へ」をクリックします。

20_________.png

アプリ登録の概要を確認し、「ダッシュボードに戻る」をクリックし、「OAuth同意画面」の設定を完了します。

21______________.png

ステップ6

次に認証情報設定の画面に戻り、OAuth 2.0 クライアントに適当な名前を入力し、「承認済みのJavaScript 生成元」にお使いのkintoneのURLを入力(例;https://{サブドメイン}.cybozu.com)、また、「承認済みのリダイレクトURI」には、後に作成するkintoneアプリのURIを入力(例:https://{サブドメイン}.cybozu.com/k/{アプリケーションID}/)します。

最後に「OAuth クライアントIDの作成」ボタンをクリックして、クライアントIDを生成します。

22_OAuth______ID__.png

クライアントIDが作成されますので、メモしておきます。(後のカスタマイズのプログラミングで使用します。)

「完了」ボタンをクリックして、終了します。

23_OAuth______ID___1.png

ステップ7

再び、「認証情報を作成」メニューから、今度は、「APIキー」を選択します。

24_API_____.png

APIキーが作成されますので、メモしておきます。

25____API__.png

「キーの制限」の設定をすることにより、キーの不正仕様や盗用を防止できますので、必要に応じて設定してください。詳細は、Googleのドキュメント(外部リンク)「APIキーの使用」を参照してください。

左サイドメニューの「認証情報」をクリックすると生成した認証情報が確認できます。

26_API____.png

以上でGoogleカレンダー側の設定は終了です。

4. kintoneアプリの設定・変更

ステップ1

今回は、kintone アプリの「イベント・フェアカレンダー」を元にアプリを設定・変更します。
kintoneアプリストアより、左サイドメニュー上部のアプリストア検索欄に「イベント」と入力し、検索します。「イベント・フェアカレンダー」が表示されますので、「このアプリを追加」をクリックします。

27__________________.png

ステップ2

アプリを開いて、右上のギアアイコンをクリックして、アプリの設定画面に移行します。

28________________________.png

ステップ3

下記テーブルを参考にフォームにフィールドの追加・変更を行います。

フィールドの種類 フィールド名 フィールドコード
日付 開催日 event_date
文字列(1行) イベント名 event_name
日時 開催日時 start_datetime
日時 終了日時 end_datetime
文字列(複数行) 開催場所 event_location
文字列(複数行) イベント詳細 event_description
スペース publish_button_space
文字列(1行) GoogleイベントID event_id

フィールドの設定、変更後、「フォームを保存」し、最後に「アプリを更新」します。

29_________________________.png

これで、kintoneアプリの設定は終了です。

5. JavaScriptによるプログラムの作成

下記サンプルコードを参考にプログラムを作成します。

サンプルコード

コードのアップロード

作成したコードに適当な名前をつけ、保存します。(例:google-calendar.js)

以上のコードを「アプリの設定」から、「JavaScript/CSSでカスタマイズ」を選択し、アップロードします。

また、Google APIのJavaScriptクライアントを以下のURLを指定して参照します。
https://apis.google.com/js/api.js

設定を「保存」して、「アプリを更新」します。

30__________________.png

6. 動作の確認

上記で作成したイベント・フェアカレンダーのアプリを開き、新規イベントを追加します。

31_________.png

イベント情報を入力して、「保存」します。

32__________.png

保存後、「公開する」ボタンが表示されるのでクリックするとGoogleアカウントへの認証画面が表示されるので、メールアドレス、パスワードを入力してGoogleアカウントへログインします。

33_Google_Calendar__.png

34_Google_Calendar__.png

認証が成功すると登録したイベントがGoogleカレンダーに公開され、GoogleイベントIDが設定されます。

35_Google_____ID__.png

Googleカレンダーを確認するとイベント情報が公開されています。

36_Google_____________.png

既に公開済みのイベントはイベント・フェアカレンダーでイベント情報を更新し、公開ボタンを再びクリックすれば、Googleカレンダー側も自動で更新できます。(今回は削除機能は作成していません。)

 

プログラムの解説

Google API認証情報の設定

Googleカレンダーの作成・設定で取得した、Google API キー、クライアントID、カレンダーIDの値を変数にセットします。

以下コードの2行目のapi_keyにはGoogle API キー、4行目のclient_idにはクライアントID、6行目のcalendar_idにカレンダーIDの値をセットします。

スコープとディスカバリードックの情報の詳細はGoogle Calendar APIのガイドを参照してください。

Google API クライアントとOAuth2.0ライブラリー

Google APIのJavaScriptクライアントとOAuth2.0モジュールのライブラリーをロードし、ロード完了時に呼び出すコールバック関数を設定しています。

JavaScriptクライアントとOAuth 2.0の認証情報の詳細に関しましては、OAuth 2.0 for Client-side web applicationsを参照してください。

レコード詳細画面の表示後イベント

レコード詳細画面の表示後イベントは以下の関数内に記述します。

Google カレンダーにイベントを公開するためのボタンを画面下部スペースに設置します。また、イベントリスナーにボタンのクリック時に呼び出される関数を設定しています。

レコード追加時、編集時の表示後イベント

Google カレンダーのイベントIDは自動設定されるので、レコード追加時及び編集時には編集できないように設定しています。

Googleカレンダーへのイベント公開

まずは、イベント・フェアカレンダーで設定したレコードのデータの取得を行います。

レコードのデータ取得後、すでにGoogle アカウントへ認証済みかチェックし、もし、認証済みでない場合は、Google認証画面を呼び出します。

Google APIへの認証は、非同期となるため、非同期関数として宣言し、認証処理を待ちます。

次にGoogleカレンダーへ送るイベントデータのパラメーターをJSON形式で設定します。

イベントデータのパラメーターの設定は、Google Calendar API ReferenceのEventの項目を参照してください。

イベント・フェアカレンダーのデータにすでにGoogle Event ID が設定済みかチェックし、すでに設定済みであればGoogle Event IDによりデータを更新し、未設定ならばイベントを追加します。

Google カレンダーへのイベントの追加は、Insertの項目をイベントの更新は、Updateの項目を参照してください。

上記で設定したリクエストを実行します。Googleカレンダーへの登録実行後、生成されたGoogleカレンダー側のイベントIDを取得し、kintone APIを呼び出し、event _idフィールドを更新しています。

7. まとめ

今回は、kintoneのイベント・フェアカレンダーを使って、イベントの情報を社内的に管理し、承認されたイベントを公開して、Google カレンダーで社内で共有できるように連携してみました。他のGoogle Workspaceのサービスもkintoneと連携して、様々な業務データの内部管理と承認済みデータを社内共有することも可能だと思います。

8. 参照サイト

Google Calendar API Guides
Google Identity Platform
Google Calendar API JavaScript Quickstart

このTipsは、2020年12月版 kintoneで確認したものになります。

記事に関するフィードバック

記事のコメント欄は記事に対するフィードバックをする場となっております。
右の記事フィードバックのためのガイドを参照してコメントしてください。
記事のリンク切れなど、気になる点がある場合も、こちらのフォームからフィードバックいただけますと幸いです。

Avatar
Sheldon Chen

サンプルコードの中に間違いを一つ見つけました。 "timezone"ではなく、"timeZone"です。

Avatar
cybozu Development team

Sheldon Chenさま

cybozu developer network運営事務局です。

ご指摘ありがとうございました。記述に誤りがあり、大変申し訳ございませんでした。

修正させていただきました。

Avatar
加藤 優志

お世話になっております。

こちら、PC版では活用させていただいているのですが、スマートフォンだとうまく作動しないようです。

https://developer.cybozu.io/hc/ja/articles/202738940-PC-%E3%82%B9%E3%83%9E%E3%83%BC%E3%83%88%E3%83%95%E3%82%A9%E3%83%B3-%E6%97%A9%E8%A6%8B%E8%A1%A8 

↑の記事を参考にapi呼び出し部分のコードもmobileを含むように書き換えています。

コンソールを見ると、「Failed to load resource: the server responded with a status of 400 (Bad Request)」というエラー表示が出ています。

画面に表示されるエラーも「Google イベントIDの登録に失敗しました」となっていますので、おそらくリクエストに不備があり、googleに受け取ってもらえないのでしょう。コンソールによるとイベントID自体は発行できているようですが、__REQUEST_TOKEN__に問題があるというような表示に見えます。

詳しくは分かっていないのですが、__REQUEST_TOKEN__の問題が原因でリクエストが受け付けられていない、ということでしょうか?同じ案件についてPCで同じ操作をすると成功するようです。なぜモバイルだと問題が発生するのでしょうか?

なにかご教授いただけましたら大変幸いです。

加藤 優志により編集されました
Avatar
cybozu Development team

加藤 優志 様

設定の観点から考えられる原因に、「スマートフォン用のJavaScript用ファイル」の欄にファイルがアップロードされていない可能性があります。

以下の記事を参考に、「スマートフォン用のJavaScript用ファイル」欄にもファイルを適用されているか、ご確認をお願いいたします。

https://developer.cybozu.io/hc/ja/articles/360027249311

それで解決しない場合は何らかの技術的な問題がある可能性がありますので、コミュニティの方を活用ください。

コミュニティで質問する際、作成したコードとエラーメッセージと共に投稿いただけると、回答がつきやすくなります。ご参考ください。

Avatar
経理

お世話になっております。

最近勉強を始めた初心者です。初歩的なことを伺い申し訳ありません。

上記記事を参考にGoogleカレンダーへの連携までは成功しました。

追加の処理として、条件毎に登録するアカウントを変更するように加工しているのですが、なかなかうまくいきません。

具体的には、3つの文字列のフィールドがあり、その3つの中で一つでも条件に合致すれば、api_key、client_id、calendar_idの値を変更し、

登録を行うという風にしたいと思っています。

3つのフィールドの値を配列にして、条件と合致した場合、変数に代入するというところまでできたので、

if文の中にサンプルコード16行目以降を入れ込めばいいのかと思ったのですが、うまくいきません。

コンソールにはこのようなエラーが出ます。

cb=gapi.loaded_0:163 Uncaught TypeError: Cannot read property 'isSignedIn' of null

曖昧な質問で申し訳ございません。ご教授いただければ幸いです。

 

Avatar
cybozu Development team

経理 様

お世話になっております。cybozu developer network 運営事務局でございます。

こちらのコメント欄は記事内容のフィードバック目的となっており、
記事の内容の発展などのご質問は、大変お手数ですがcybozu developer コミュニティにお願いできますでしょうか。
コミュニティのほうが多くの方がご覧になっているため、アドバイスも得やすいかと思います。

その際、実際のソースコードに変更を加えた部分についても記載すると、
より良い回答が得られるかと思います。

よろしくお願い致します。

サインインしてコメントを残してください。