サービスアカウントの発行と秘密鍵のダウンロード
Google Cloud プラットフォームを開きます
https://console.cloud.google.com/apis/library?hl=ja
『Google Calendar API』をクリックします
Google Calendar API を有効にします
『認証情報』、『認証情報を作成』をクリックします
『サービスアカウント』を選択します
サービスアカウント名を入れ、完了をクリックします。名前は任意ですので「test_acount」などで構いません
サービスアカウントがメール形式で設定されますので、コピーしてからクリックします
『鍵を追加』をクリックします
『新しい鍵』を選択します
『JSON』形式を選択(確認)し、『作成』をクリックします
秘密鍵がダウンロードされ、完了画面になります
Googleカレンダーの設定
サービスアカウントと秘密鍵を手にしましたので、次にGoogleカレンダー側の設定を行います
念のため新しいカレンダーを作ってから『・・・』(縦)をクリックします
『設定と共有』を選択します
『ユーザやグループを追加』をクリックします
サービスアカウントの発行と秘密鍵のダウンロードの⑧で取得したサービスアカウントを入力し『送信』をクリックし設定を完了します
特定のユーザまたはグループと共有するの下の方にある『カレンダーID』をコピーしておいてください。Webアプリからは、このIDでカレンダーを指定します
PHPライブラリの準備
GoogleAPIのライブラリが必要になるので、下記のURLにアクセスしインストールするのですが、今回composerでインストールします
A PHP client library for accessing Google APIs
composer については、SSHセットアップやcomposerインストールを参考にしてください
私の場合、composer.json のあるフォルダを『project_lib』としてますので、そのフォルダでダウンロードします
[・・・\project_lib]$ composer require google/apiclient:"^2.0"
『composer.json』『composer.lock』『vendor』はcomposer 関係で、『vendor』フォルダにライブラリが格納されます
├ project_lib/ // ライブラリフォルダ
| ├ composer.json
| ├ composer.lock
| └ vendor/ // ライブラリ本体
| └ autoload.php
└ schedule_app/ // Webアプリフォルダ
├ index.php
├ sever.php
└ data/
├ 省略
検討用のプログラム作成
サービスアカウントの発行と秘密鍵のダウンロードの⑪でダウンロードした秘密鍵と、Googleカレンダーの設定の⑥でコピーしたGoogleカレンダーIDを使用します
gapiLoad_PHP 関数は、カレンダーデータを echo で表示します。戻り値は、カレンダーデータ配列を戻します
/*************************/
/* Googleカレンダー取得 */
/*************************/
function gapiLoad_PHP()
{
$project_lib = dirname ( __DIR__ ) . '\project_lib';
require_once $project_lib . '\vendor\autoload.php'; // ライブラリの読込み
$json_path = '?????.json'; // サービスアカウントの秘密鍵
$calendar_id = '?????'; // カレンダID
$client = new Google_Client();
$client->setScopes( Google_Service_Calendar::CALENDAR_READONLY ); // スコープをカレンダ読取りに設定
$client->setAuthConfig( $json_path ); // 認証設定
$service = new Google_Service_Calendar( $client ); // カレンダサービスの生成
$start = date( date( 'Y' ). '-03-01\T00:00:00.000+09:00' ); // カレンダデータの開始日
$end = date( date( 'Y' ). '-03-31\T23:59:59.000+09:00' ); // カレンダデータの終了日
$option =
[
'timeMin' => $start,
'timeMax' => $end,
'maxResults' => 1000,
'orderBy' => 'startTime',
'singleEvents' => 'true'
];
$response = $service->events->listEvents( $calendar_id, $option ); // カレンダデータ取得
$events = $response->getItems();
$results = [];
if( !empty( $events ))
{
foreach( $events as $event )
{
// 予定が終日の場合 :date に 日付が入り dateTime はnull
// 予定が終日でない場合:date に nullが入り dateTime は時刻が入る
$start = new DateTime( !is_null( $event->start->date ) ? $event->start->date:$event->start->dateTime );
$end = new DateTime( !is_null( $event->end->date ) ? $event->end->date: $event->end->dateTime );
// 一日に2つの予定がある場合で生成される配列
// results[ '2023-2-23'][ 0 ][ 'start' ] = '2023-02-13 10:00:00'
// results[ '2023-2-23'][ 0 ][ 'end' ] = '2023-02-13 11:00:00'
// results[ '2023-2-23'][ 0 ][ 'title' ] = ''社内ミーティング
// results[ '2023-2-23'][ 1 ][ 'start' ] = '2023-02-13 13:00:00'
// results[ '2023-2-23'][ 1 ][ 'end' ] = '2023-02-13 15:00:00'
// results[ '2023-2-23'][ 1 ][ 'title' ] = 'A社訪問'
//
// 終日の場合で生成される配列。時刻は00:00:00で、日付が当日と翌日となる
// results[ '2023-2-23'][ 1 ][ 'start' ] = '2023-02-14 00:00:00'
// results[ '2023-2-23'][ 1 ][ 'end' ] = '2023-02-15 00:00:00'
// results[ '2023-2-23'][ 1 ][ 'title' ] = 'A社訪問'
//
$dateSta = $start->format( 'Y-m-d' ); // 2015-10-01 のフォーマットで文字列取得
$dateEnd = $end->format( 'Y-m-d' ); // 00:00:00 のフォーマットで文字列取得
$timeSta = $start->format( 'H:i:s' );
$timeEnd = $end->format( 'H:i:s' );
$title = (string)$event->summary;
$results[ $start->format( 'Y-m-d' ) ][] =
[
'start_date' => $dateSta,
'start_time' => $timeSta,
'end_date' => $dateEnd,
'end_time' => $timeEnd,
'title' => $title
];
echo $dateSta . ' ' . $timeSta . '~' . $dateEnd . ' ' . $timeEnd . ' ' . $title . '<br>';
}
}
return $results;
}
Googleカレンダー連携利用の追加
スケジュールアプリの概要で説明した会社のメンバー予定表などへ各メンバーのGoogleカレンダーを自動 or ワンクリックでインポートするような機能をデモプログラムに追加しました
注意:デモプログラムにはこの機能が入っていますが、ダウンロード可能なソースファイルには入れていませんが
デモデータの中で Google カレンダを登録している Small Solution を選択して、表示したい週を選択します。選択した週の日付が自動で表示され、メンバーのカレンダIDに問い合わせて戻ってきた予定を自動的に表示します。下記例では同じカレンダを設定していて、同じ予定が表示されています
注意:デモプログラムに使用しているカレンダは3月のみ登録していて、今後の更新もしません。選択できる週も現在の日付からなので、3月後半や4月以降にデモプログラムを起動しても予定は表示されません