PHPを利用してGoogle Calendarを操作することができれば、Google CalendarにログインすることなくGoogle Calendar内のイベントの取得、追加、更新、削除を行うことができます。

Google Calendar APIをPHPを使って利用するためには事前に認証情報の設定を行う必要があります。認証情報の設定については下記の文書を参考に設定を行ってください。設定後、サービスアカウントIDと秘密鍵が入ったキーファイルを取得することができます。サービスアカウントIDはGoogle Calendarのアクセス設定、キーファイルは実際にAPI経由でアクセスする際に利用します。

パッケージのインストール(環境設定)

設定手順やプログラムについてはCalendar APIのPHP Quickstartを参考に行っています。

PHPからGoogle Calendar APIを操作するためにgoogle/apiclientパッケージを利用します。パッケージはcomposerコマンドを利用してインストールします。そのためcomposerコマンドが実行できる環境が必要となります。

本文書ではMACを利用して動作確認を行っていますが、MACのデフォルトではcomposerはインストールされていないので事前にcomposerをインストールしておく必要があります。

google/apiclientパッケージのインストール

任意のディレクトリを作成し、そのディレクトリ内でcomposerコマンドを実行して、google/apiclientパッケージのインストールを行います。


$ composer require google/apiclient:^2.0

インストール後にcomposer.json, composer.lock, vendorが作成されます。

nesbot/carbonパッケージのインストール

Google Calendarでは日付や時刻の設定が必要となるので、日付時刻を扱う際に便利なCarbonパッケージのインストールを行っておきます。Carbonパッケージは必須ではありませんが本文書ではカレンダーにイベントを設定する際の時刻にこのパッケージを利用しています。


 $ composer require nesbot/carbon 

2つのパッケージをインストールしたのでcomposer.jsonファイルの中身は下記のようになっています。


{
    "require": {
        "google/apiclient": "^2.0",
        "nesbot/carbon": "^2.28"
    }
}

Google Calendarの設定

Google Calendar側で認証設定で作成したサービスアカウントのアクセス権を設定する必要があります。

新しいカレンダーの追加

新しいカレンダーを追加して、追加したカレンダーにイベントの追加を行っていきます。認証設定を行ったGoogleアカウントと同じアカウントでGoogle Calendarにアクセスして新しいカレンダーの作成を行います。

既存のカレンダーを利用する場合は新しいカレンダーの追加は必要ありません。
fukidashi
新しいカレンダーの作成
新しいカレンダーの作成

カレンダーに任意の名前を付けてください。ここでは動作確認用カレンダーという名前をつけています。

新しいカレンダーの作成
新しいカレンダーの作成

サービスアカウントへのアクセス権限設定

カレンダーの右上にある歯車のアイコンをクリックして、設定を選択します。

カレンダー設定
カレンダー設定

設定画面が表示されるので、左側のメニューのマイカレンダーの設定から先ほど作成した動作確認用カレンダーを選択します。既存のカレンダーを使用する場合はそのカレンダーを選択してください。

動作確認用カレンダーの選択
動作確認用カレンダーの選択

特定のユーザとの共有を左側のメニューでクリックするか画面右側をスクロールして特定のユーザとの共有の画面を表示します。ログインしたGoogleアカウントが表示されているのでその下にある”ユーザを追加”ボタンをクリックします。

特定のユーザとの共有画面
特定のユーザとの共有画面

ユーザの設定画面が表示されるので、メールアドレスの項目には認証設定で取得したサービスアカウントのIDを入力してください。

ユーザの設定画面
ユーザの設定画面

権限は予定の変更権限に変更してください。サービスアカウントIDの設定と権限の変更が完了したら、送信ボタンをクリックしてください。

サービスアカウントIDの設定
サービスアカウントIDの設定

送信ボタンを押すとサービスアカウントがGoogleアカウントの下に追加されることを確認することができます。

追加したユーザ
追加したユーザ情報

Google Calendar上でのアクセス権の設定は完了です。

カレンダーIDの取得

各カレンダーはIDが割り振られています。このIDを利用してアクセスしたいカレンダーを選択します。カレンダーのIDはカレンダーの統合から確認することができます。

カレンダー統合画面
カレンダー統合画面

Google Calendar APIの使い方

カレンダー内のイベント情報を取得

カレンダーに登録したイベント情報を取得するためにイベントを手動で一つ登録します。

カレンダー
カレンダー

追加したイベントをPHPプログラムを利用して取得します。ファイル名はget_calendar_event.phpとしcomposerを実行したディレクトリに保存します。


<?php

require __DIR__ . '/vendor/autoload.php';

if (php_sapi_name() != 'cli') {
    throw new Exception('This application must be run on the command line.');
}

function getClient()
{
    $client = new Google_Client();
    $client->setApplicationName('Google Calendar API PHP Quickstart');
    $client->setScopes(Google_Service_Calendar::CALENDAR_READONLY);
    $client->setAuthConfig('XXXXXXXXX.json');
  
    return $client;
}
// Get the API client and construct the service object.
$client = getClient();
$service = new Google_Service_Calendar($client);
// Print the next 10 events on the user's calendar.
$calendarId = 'XXXXXX@group.calendar.google.com';

$optParams = [];

$results = $service->events->listEvents($calendarId, $optParams);

$events = $results->getItems();

if (empty($events)) {
    print "No upcoming events found.\n";
} else {
    print "Upcoming events:\n";
    foreach ($events as $event) {
        $start = $event->start->dateTime;
        if (empty($start)) {
            $start = $event->start->date;
        }
        printf("%s (%s)\n", $event->getSummary(), $start);
    }
}

setAuthConfigで指定しているjsonファイルが認証情報で設定した時に取得した秘密鍵が入ったキーファイルです。ここでは作成したget_calendar_event.phpファイルと同じディレクトリに保存しています。

$calendarIdには先程取得したカレンダーのIDを設定しています。

setScopesメソッドでGoogle_Service_Calendar::CALENDAR_READONLYを設定していますがCALENDAR_READONLYはカレンダーからイベントを取得する時に利用します。後ほど行うイベントの追加を行う際は、CALENDAR_EVENTSを設定します。

これを下記のように実行するとカレンダーに追加したイベントを取得することができます。


 $ php get_calendar_event.php 
Upcoming events:
ランチミーティング (2020-01-17T12:00:00+09:00)

時刻設定について

Google Calendarの時刻の形式は、イベント取得時に表示されるように次の形になっています。

2020-01-17T12:00:00+09:00

これはISO8601形式で、[西暦]-[月]-[日]-[T][時間]:[分]:[秒][タイムゾーン]で構成されています。

本文書ではCarbonを利用してこの形式のデータを作成し設定を行っています。2020-01-17T12:00:00+09:00の時刻を設定するためには下記のように記述します。


<?php

require __DIR__ . '/vendor/autoload.php';

use Carbon\Carbon;

$tz = new DateTimeZone('Asia/Tokyo');

$startTime = Carbon::create(
    2020,
    01,
    17,
    12,
    0,
    0,
    $tz
);

$time = $startTime->format('c');

echo $time;

作成したtime.phpファイルを実行すると下記の時刻が表示されます。


 $ php time.php
2020-01-17T12:00:00+09:00

カレンダーにイベントを追加する

カレンダーからイベントを取得する方法と時刻の設定方法がわかったので次はイベントを追加する方法を確認します。

2020-01-17の18:00から21:00に新年会というイベントを追加しています。タイトルと開始、終了時刻を変更すれば別のイベントも追加することが可能です。

実行後にイベントのIDを表示させていますが、各イベントもIDを持っており、このIDを使ってイベントの更新、削除を行うことができます。


<?php

require __DIR__ . '/vendor/autoload.php';

use Carbon\Carbon;

if (php_sapi_name() != 'cli') {
    throw new Exception('This application must be run on the command line.');
}

function getClient()
{
    $client = new Google_Client();
    $client->setApplicationName('Google Calendar API PHP Quickstart');
    $client->setScopes(Google_Service_Calendar::CALENDAR_EVENTS);
    $client->setAuthConfig('XXXXX.json');
  
    return $client;
}

$title = '新年会';

$tz = new DateTimeZone('Asia/Tokyo');

$startTime = Carbon::create(
    2020,
    01,
    17,
    18,
    0,
    0,
    $tz
);

$endTime = Carbon::create(
    2020,
    01,
    17,
    21,
    0,
    0,
    $tz
);

$googleStartTime = new Google_Service_Calendar_EventDateTime();
$googleStartTime->setTimeZone($tz);
$googleStartTime->setDateTime($startTime->format('c'));

$googleEndTime = new Google_Service_Calendar_EventDateTime();
$googleEndTime->setTimeZone($tz);
$googleEndTime->setDateTime($endTime->format('c'));

// Get the API client and construct the service object.
$client = getClient();
$service = new Google_Service_Calendar($client);

$calendarId = 'XXXXXX@group.calendar.google.com';

$event = new Google_Service_Calendar_Event();

$event->setStart($googleStartTime);
$event->setEnd($googleEndTime);
$event->setSummary($title);

$event = $service->events->insert($calendarId, $event);

echo $event->id;

実行すると画面にはイベントIDが表示されます。


$ php insert_calendar_event.php
b9ig7mkutafq5r8uqqao2am3mg

カレンダーを見るとイベントが追加されていることが確認できます。

イベントの追加
イベントの追加

イベントの更新

追加したイベントIDを利用してイベントのタイトルの更新を行います。


&lt;?php

require __DIR__ . '/vendor/autoload.php';

use Carbon\Carbon;

if (php_sapi_name() != 'cli') {
    throw new Exception('This application must be run on the command line.');
}

function getClient()
{
    $client = new Google_Client();
    $client->setApplicationName('Google Calendar API PHP Quickstart');
    $client->setScopes(Google_Service_Calendar::CALENDAR_EVENTS);
    $client->setAuthConfig('XXXXXX.json');
  
    return $client;
}


// Get the API client and construct the service object.
$client = getClient();

$service = new Google_Service_Calendar($client);

$calendarId = 'XXXXX@group.calendar.google.com';

$eventId = 'b9ig7mkutafq5r8uqqao2am3mg';

$event = $service->events->get($calendarId, $eventId);

$event->setSummary('2020年新年会');

$updatedEvent = $service->events->update($calendarId, $event->getId(), $event);

カレンダーを確認すると追加したイベントのタイトルが新年会から2020新年会に変更になっていることが確認できます。

イベントの更新
イベントの更新

イベントIDを知りたい場合

各イベントのIDをイベント取得を利用することで取得することができます。作成したget_calendar_event.phpのprintfの箇所に$event->idを追加することで実現可能です。


printf("%s (%s) ID:(%s)\n", $event->getSummary(), $start, $event->id);

$ php get_calendar_event.php 
Upcoming events:
string(26) "b9ig7mkutafq5r8uqqao2am3mg"
2020年新年会 (2020-01-17T18:00:00+09:00) ID:(b9ig7mkutafq5r8uqqao2am3mg)

ここまでの手順でイベントの取得、追加、更新方法が確認できました。どのプログラムもシンプルなものなので、PHPアプリケーションとGoogle Calendarの連携が必要な場合はぜひチャレンジしてみてください。