サービスアカウントの発行と秘密鍵のダウンロード

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月以降にデモプログラムを起動しても予定は表示されません