Google Calendar API + PHPで予定の取得と追加【PHP編】

前回に引き続き、今回はGoogle Calendar APIを使ってPHPから予定の取得と追加をしていきます。

Composerでライブラリをインストール

composer require google/apiclient:^2.15.0

Composerを使いライブラリをインストールします。
インストールが完了すると 【vendor】ディレクトリが追加されますので、【vendor/autoload.php】を読み込んで使用します。

予定の取得

<?php
// --------------------------------------------------
// 共通
// --------------------------------------------------
// ライブラリを読み込む
require_once __DIR__ . '/vendor/autoload.php';

// サービスアカウント作成時にダウンロードしたjsonファイル
$json_path = __DIR__ . '/service-account-key.json';

// カレンダーID
// Googleカレンダーの【設定】→【マイカレンダーの設定】から取得・追加したいカレンダーを選択
// 【カレンダーの統合】から【カレンダーID】を下記に記載
$calendar_id = 'xxxxxxxxxx@group.calendar.google.com';

// サービスオブジェクトを作成
$client = new Google_Client();

// このアプリケーション名
$client->setApplicationName('APIテスト');

// ユーザーアカウントのjsonを指定
$client->setAuthConfig($json_path);

// --------------------------------------------------
// 予定の取得
// --------------------------------------------------
// 予定の取得は Google_Service_Calendar::CALENDAR_READONLY
// 予定の追加は Google_Service_Calendar::CALENDAR_EVENTS
$client->setScopes(Google_Service_Calendar::CALENDAR_READONLY);

// サービスオブジェクトの用意
$service = new Google_Service_Calendar($client);

// 取得パラメータ
// https://developers.google.com/calendar/api/v3/reference/events/list?hl=ja#php
$params = [
    'orderBy' => 'startTime',
    'singleEvents' => true,
    'timeMin' => date('c', strtotime('2024-01-01')),
    'timeMax' => date('c', strtotime('2024-02-29')),
];
$results = $service->events->listEvents($calendar_id, $params);

$events = $results->getItems();
if (empty($events)) {
    echo 'イベントが見つかりません';
} else {
    foreach ($events as $event) {
        $start = $event->start->dateTime;
        if (empty($start)) {
            $start = $event->start->date;
        }

        $end = $event->end->dateTime;
        if (empty($end)) {
            $end = $event->end->date;
        }

        echo sprintf('Summary : %s<br>', $event->getSummary());
        echo sprintf('Desc : %s<br>', $event->getDescription());
        echo sprintf('Start : %s<br>', date('Y/m/d h:i:s', strtotime($start)));
        echo sprintf('End : %s<br>', date('Y/m/d h:i:s', strtotime($end)));
        echo sprintf('<a href="%s" target="_blank">詳細へ</a>', $event->htmlLink);
        echo '<hr>';
    }
}

コメントにも記載していますが、以下補足です。

9行目 : jsonファイル

前回の【Google Calendar APIの準備】の【サービスアカウントの作成】で最後にダウンロードしたjsonファイルを指定しています。
保存したファイル名を変数に指定してください。

14行目 : カレンダーID

Googleカレンダーの【設定】→左メニューの【マイカレンダーの設定】から取得・追加したいカレンダーを選択します。さらに左メニューの 【カレンダーの統合】をクリックし、スクロール先にある【カレンダーID】を変数に指定します。

30行目 : Google_Service_Calendar

取得と追加で指定内容が変わります。
今回は取得なので【CALENDAR_READONLY】を指定しています。
追加する場合は【CALENDAR_EVENTS】に書き換えます。

37行目 : 取得パラメータ

取得する条件等のパラメータを設定しています。

パラメータの詳細は下記をご参照ください。
https://developers.google.com/calendar/api/v3/reference/events/list?hl=ja#php

予定の追加

<?php
// --------------------------------------------------
// 共通
// --------------------------------------------------

// 省略

// --------------------------------------------------
// 予定の追加
// --------------------------------------------------
// 予定の取得は Google_Service_Calendar::CALENDAR_READONLY
// 予定の追加は Google_Service_Calendar::CALENDAR_EVENTS
$client->setScopes(Google_Service_Calendar::CALENDAR_EVENTS);

// サービスオブジェクトの用意
$service = new Google_Service_Calendar($client);

// 追加パラメータ
// https://developers.google.com/calendar/api/v3/reference/events/insert?hl=ja
$params = new Google_Service_Calendar_Event([
    'summary' => 'APIで追加した予定',
    'start' => [
        'dateTime' => '2024-01-01T10:00:00+09:00',
        'timeZone' => 'Asia/Tokyo',
    ],
    'end' => [
        'dateTime' => '2024-01-01T11:00:00+09:00',
        'timeZone' => 'Asia/Tokyo',
    ],
]);
$event = $service->events->insert($calendar_id, $params);

echo sprintf('<a href="%s" target="_blank">%s</a>', $event->htmlLink, $event->summary);

13行目 : Google_Service_Calendar

追加なので【CALENDAR_EVENTS】に書き換えています。

20行目 : 追加パラメータ

パラメータの詳細は下記をご参照ください。
https://developers.google.com/calendar/api/v3/reference/events/insert?hl=ja

【番外】予定の追加と同時にゲスト追加

ここからは前回の記事でも触れていますが、Google Workspaceに登録済み、且つ【ゲスト追加をする為の下準備】を行っている必要があります。

<?php
// --------------------------------------------------
// 共通
// --------------------------------------------------
// ライブラリを読み込む
require_once __DIR__ . '/vendor/autoload.php';

// サービスアカウント作成時にダウンロードしたjsonファイル
$json_path = __DIR__ . '/service-account-key.json';

// カレンダーID
$calendar_id = 'xxxxxxxxxx@group.calendar.google.com';

// Workspaceの権限を持つユーザーのメールアドレス
$workspace_user_mail = 'xxxxxxxxxx@yyyyyyyy.com';

// 以下、省略

// --------------------------------------------------
// 予定の追加
// --------------------------------------------------
// 予定の取得は Google_Service_Calendar::CALENDAR_READONLY
// 予定の追加は Google_Service_Calendar::CALENDAR_EVENTS
$client->setScopes(Google_Service_Calendar::CALENDAR_EVENTS);

// ゲストを設定する場合、Workspaceの権限を持つユーザーのメールアドレスを設定
$client->setSubject($workspace_user_mail);

// サービスオブジェクトの用意
$service = new Google_Service_Calendar($client);

// 追加パラメータ
// https://developers.google.com/calendar/api/v3/reference/events/insert?hl=ja
$params = new Google_Service_Calendar_Event([
    'summary' => 'APIで追加した予定',
    'start' => [
        'dateTime' => '2024-01-01T10:00:00+09:00',
        'timeZone' => 'Asia/Tokyo',
    ],
    'end' => [
        'dateTime' => '2024-01-01T11:00:00+09:00',
        'timeZone' => 'Asia/Tokyo',
    ],
    'attendees' => [
        // 一人目のゲスト
        [
            'email' => 'xxxxxxxxxx@gmail.com',
        ],
        // 二人目のゲスト
        [
            'email' => 'yyyyyyyyyy@gmail.com',
        ],
    ],
]);

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

echo sprintf('<a href="%s" target="_blank">%s</a>', $event->htmlLink, $event->summary);

先程の【予定の追加】からの変更点は、15行目と27行目と44~53行目の追加になります。

15行目 : $workspace_user_mail

Workspaceの権限を持つユーザーのメールアドレスを変数に指定しています。

27行目 : setSubject

ゲストを設定する場合、Workspaceの権限を持つユーザーのメールアドレスを設定します。
これがないとエラーになります。

44~53行目 : ゲスト追加

例として二名のゲストを追加するようにしています。

念の為、補足

当方が【Google Calendar API + PHP】の実装をしたのが半年以上前の事で、うろ覚えで今回記事にしています笑。
一応記事にするにあたってテストはしていますので大丈夫だと思いますが、もしゲスト追加が上手くいかないという人は56行目を下記に書き換えて試してみてください。

// $event = $service->events->insert($calendar_id, $params);
$event = $service->events->insert($calendar_id, $params, ['sendUpdates' => 'all']);

実装当時はゲスト追加が上手くいかず、調べまくってみたら【sendUpdates】を指定しないとダメなようで、【$params】に突っ込んで試したけどやっぱりダメ。

なぜ??と思いながら更に調べまくった結果、第二じゃなくて第三引数に指定する事が判り、ようやく上手くいった、という記憶があります。

今回テストしてみたところ、【sendUpdates】がなくてもゲスト追加できていたので???ってなっています笑。