(Author : Fuji Business International Mamoru Fujinoki)
はじめに
kintoneアプリのイベント・フェアカレンダーを利用して、イベントの日程をGoogleカレンダーに連携して公開します。
社内でイベントの日程を管理し、承認後に一般公開したい場合などに利用できますし、社外にもEメール等でイベントの告知とカレンダー日程の同期が可能になります。
1. 事前に必要なもの
- Googleアカウント
- kintoneアカウント
2. 開発の流れ
以上の手順で開発して行きます。
3. Googleカレンダーの作成・設定
ステップ1
Google.comより、ログインし、右上Googleアプリアイコンより、カレンダーを選択します。
左サイドメニューのマイカレンダーより、新しいカレンダーの作成を選択します。
カレンダー名を入力し、「このカレンダーを他のユーザーと共有する」をチェックした後、「このカレンダーを一般公開する」をチェックします。「カレンダーを作成」ボタンをクリックし、新しいカレンダーを作成します。
ステップ2
左サイドメニューより、作成したカレンダーの右側の矢印をクリックし、サイドメニューより、カレンダー設定を選択します。
カレンダーのアドレス項目にカレンダーIDが表示されるので、メモしておきます。後のプログラミングの際に必要になります。
ステップ3
次にGoogle APIを利用するためにGoogleカレンダーAPIの認証情報を設定します。
まず、Google APIのデベロッパーコンソールにログインします。
画面が表示されたら、「プロジェクトを選択」をクリックします。
右上の「+」アイコンをクリックして、新規プロジェクトを作成します。
プロジェクト名を入力し、「作成」ボタンをクリックすると、新規プロジェクトが作成されます。
ステップ4
再び、プロジェクト選択の画面を開き、新規作成したプロジェクトを開きます。
次に左サイドメニューより、「ライブラリ」を選択し、Google Workspace APIsカテゴリーより、「Calendar API」を選択します。
「有効にする」をクリックして、Google Calendar API を有効にします。
ステップ5
右上の「認証情報を作成」をクリックします。
使用するAPIに「Google Calendar API」を選択し、APIを呼び出す場所に「ウェブブラウザ(Javascript)」、アクセスするデータの種類に「ユーザーデータ」を選択し、「必要な情報」をクリックします。
クライアントID名を入力し、「承認済みのJavaScript 生成元」にお使いのkintoneのURLを入力し、「クライアントIDの作成」ボタンをクリックして、クライアントIDを生成します。
ステップ6
次にOAuth 2.0同意画面の設定をします。メールアドレスを選択し、サービス名を適当に入力して、「次へ」ボタンをクリックします。
クライアントIDが作成されますので、メモしておきます。(後のプログラミングで使用します。)
ステップ7
再び、「認証情報を作成」メニューから、今度は、「APIキー」を選択します。
APIキーが作成されますので、メモしておきます。
左サイドメニューの「認証情報」をクリックすると生成した認証情報が確認できます。
以上でGoogleカレンダー側の設定は終了です。
4. kintoneアプリの設定・変更
ステップ1
今回は、kintone アプリの「イベント・フェアカレンダー」を元にアプリを設定・変更します。
kintoneアプリストアより、左サイドメニュー上部のアプリストア検索欄に「イベント」と入力し、検索します。「イベント・フェアカレンダー」が表示されますので、「このアプリを追加」をクリックします。
ステップ2
アプリを開いて、右上のギアアイコンをクリックして、アプリの設定画面に移行します。
ステップ3
下記テーブルを参考にフォームにフィールドの追加・変更を行います。
フィールドの種類 | フィールド名 | フィールドコード |
---|---|---|
文字列(1行) | 開催日 | event_date |
文字列(1行) | イベント名 | event_name |
日時 | 開催日時 | start_datetime |
日時 | 終了日時 | end_datetime |
文字列(複数行) | 開催場所 | event_location |
文字列(複数行) | イベント詳細 | event_description |
スペース | − | publish_button_space |
文字列(1行) | GoogleイベントID | event_id |
フィールドの設定、変更後、「フォームを保存」し、最後に「アプリを更新」します。
これで、kintoneアプリの設定は終了です。
5. JavaScriptによるプログラムの作成
下記サンプルコードを参考にプログラムを作成します。
サンプルコード
解説
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 モジュール
Google APIのJavaScriptクライアントとOAuth2.0モジュールのライブラリーをロードし、認証後のコールバック関数を設定しています。
JavaScriptクライアントとOAuth 2.0の認証情報の詳細に関しましては、OAuth 2.0 for Client-side web applicationsを参照してください。
レコード詳細画面の表示後イベント
レコード詳細画面の表示後イベントは以下の関数内に記述します。
Google カレンダーにイベントを公開するためのボタンを画面下部スペースに設置します。また、イベントリスナーにボタンのクリック時に呼び出される関数を設定しています。
レコード追加時、編集時の表示後イベント
Google カレンダーのイベントIDは自動設定されるので、レコード追加時及び編集時には編集できないように設定しています。
Googleカレンダーへのイベント公開
まずは、イベント・フェアカレンダーで設定したレコードのデータの取得を行います。
レコードのデータ取得後、すでにGoogle アカウントへ認証済みかチェックし、もし、認証済みでない場合は、Google認証画面を呼び出します。
次にGoogleカレンダーへ送るイベントデータのパラメーターをJSON形式で設定します。
イベントデータのパラメーターの設定は、Google Calendar API ReferenceのEventの項目を参照してください。
イベント・フェアカレンダーのデータにすでにGoogle Event ID が設定済みかチェックし、すでに設定済みであればGoogle Event IDによりデータを更新し、未設定ならばイベントを追加します。
Google カレンダーへのイベントの追加は、Insertの項目をイベントの更新は、Updateの項目を参照してください。
上記で設定したリクエストを実行します。Googleカレンダーへの登録実行後、生成されたGoogleカレンダー側のイベントIDを取得し、kintone APIを呼び出し、event _idフィールドを更新しています。
コードのアップロード
作成したコードに適当な名前をつけ、保存します。(例:sample-google-calendar.js)
以上のコードを「アプリの設定」から、「JavaScript/CSSでカスタマイズ」を選択し、アップロードします。
また、Google APIのJavaScriptクライアントを以下のURLを指定して参照します。
https://apis.google.com/js/api.js
設定を「保存」して、「アプリを更新」します。
6. 動作の確認
kintoneのイベント・フェアカレンダーを開くとGoogleアカウントへの認証画面が表示されるので、メールアドレス、パスワードを入力してGoogleアカウントへログインします。(Googleカレンダーを作成したアカウントを選択してください。)
イベントのデータを追加し、保存します。
保存後、「公開する」ボタンが表示されるのでクリックして登録したイベントをGoogleカレンダーに公開します。
公開後、GoogleイベントIDが設定されます。
Googleカレンダーを確認するとイベント情報が公開されています。
既に公開済みのイベントはイベント・フェアカレンダーでイベント情報を更新し、公開ボタンを再びクリックすれば、Googleカレンダー側も自動で更新できます。(今回は削除機能は作成していません。)
7. まとめ
今回は、kintoneのイベント・フェアカレンダーを使って、イベントの情報を社内的に管理し、承認されたイベントのみを外部に公開できるようにGoogle カレンダーと連携してみました。他のGoogle Workspaceのサービスもkintoneと連携して、様々な業務データの内部管理と承認済みデータの一般公開をすることも可能だと思います。
8. 参照サイト
Google Calendar API Guides
Google Identity Platform
Google Calendar API JavaScript Quickstart
9. 関連プラグイン
今回はサンプルの紹介ですが、サイボウズのパートナーが販売する有償のプラグインに類似の機能のものがあるため、こちらも紹介します。
できることとしては類似していますが、以下のようなプラスアルファの機能があります。
- Googleカレンダー風にドラッグ&ドロップで変更が出来る
- 登録するGoogleユーザーアカウントを選択できる
気になる方は、双方試してみてはいかがでしょうか。
Googleカレンダー™対応連携プラグイン(株式会社ノベルワークス)
このサンプルは、2017年11月版 kintoneで確認したものになります。
サンプルコードの中に間違いを一つ見つけました。 "timezone"ではなく、"timeZone"です。
Sheldon Chenさま
cybozu developer network運営事務局です。
ご指摘ありがとうございました。記述に誤りがあり、大変申し訳ございませんでした。
修正させていただきました。
お世話になっております。
こちら、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で同じ操作をすると成功するようです。なぜモバイルだと問題が発生するのでしょうか?
なにかご教授いただけましたら大変幸いです。
加藤 優志 様
設定の観点から考えられる原因に、「スマートフォン用のJavaScript用ファイル」の欄にファイルがアップロードされていない可能性があります。
以下の記事を参考に、「スマートフォン用のJavaScript用ファイル」欄にもファイルを適用されているか、ご確認をお願いいたします。
https://developer.cybozu.io/hc/ja/articles/360027249311
それで解決しない場合は何らかの技術的な問題がある可能性がありますので、コミュニティの方を活用ください。
コミュニティで質問する際、作成したコードとエラーメッセージと共に投稿いただけると、回答がつきやすくなります。ご参考ください。
お世話になっております。
最近勉強を始めた初心者です。初歩的なことを伺い申し訳ありません。
上記記事を参考に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
曖昧な質問で申し訳ございません。ご教授いただければ幸いです。
経理 様
お世話になっております。cybozu developer network 運営事務局でございます。
こちらのコメント欄は記事内容のフィードバック目的となっており、
記事の内容の発展などのご質問は、大変お手数ですがcybozu developer コミュニティにお願いできますでしょうか。
コミュニティのほうが多くの方がご覧になっているため、アドバイスも得やすいかと思います。
その際、実際のソースコードに変更を加えた部分についても記載すると、
より良い回答が得られるかと思います。
よろしくお願い致します。