グローバルナビゲーションへ

本文へ

フッターへ

お役立ち情報Blog



GoogleCalendarAPIを利用して、PHPでGoogleカレンダーの情報を取得してみよう!(予定編)

前回はGoogleの提供している日本の祝日カレンダーから祝日データを取得してみました。
今回は以下の2種類の方法で、自分のGoogleカレンダーの予定を取得してみようと思います。

  • カレンダーを公開し、前回同様APIキーを用いて取得する(方法1)
  • サービスアカウントを用いて、認証でカレンダーを取得する(方法2)

筆者の環境

  • CentOS 7
  • PHP 7.3.4

取得するカレンダーイメージ

仮のデータを入力した、以下のカレンダーから情報を取得してみます。

カレンダーを公開し、APIキーを用いて取得する(方法1)

STEP1 カレンダーを一般公開する

Googleカレンダーのメニューから「設定と共有」を選択します。


アクセス権限欄の「一般公開して誰でも利用できるようにする」を選択します。


警告のアラートが出るので「OK」を選択します。
※警告に表示されているとおり、一般公開することにより誰でも閲覧可能になります。(2つ目の方法はこの一般公開をしない方法になっています。)


カレンダーの統合欄にある、カレンダーIDをメモします。

STEP2 GoogleCalendarAPIキーの取得

前回の記事を参考にAPIキーの取得を行います。

STEP3 PHPでデータの取得

前回のコードからの変更点
  • カレンダーIDを日本の祝日カレンダーからSTEP1で取得したカレンダーIDに変更
  • 終日でない予定もあるので$resultsの取得箇所を変更
/**
 * ココまで前回と同じため省略
 */

$results = [];
if ($data = file_get_contents($url. http_build_query($query), true)) {
    $data = json_decode($data);
    foreach ($data->items as $row) {
        // 終日予定はdateプロパティ、時刻指定はdateTimeプロパティにデータがはいっている
        $start = new DateTime(property_exists($row->start,'date')?$row->start->date:$row->start->dateTime);
        $end   = new DateTime(property_exists($row->end,'date')?$row->end->date:$row->end->dateTime);
        $results[$start->format('Y-m-d')][] = [
            'start' => $start->format('Y-m-d H:i:s'),
            'end' => $end->format('Y-m-d H:i:s'),
            'title' => (string)$row->summary
        ];
    }
}

実行結果

$ php get.php 
array(4) {
  ["2020-02-07"]=>
  array(1) {
    [0]=>
    array(3) {
      ["start"]=>
      string(19) "2020-02-07 09:00:00"
      ["end"]=>
      string(19) "2020-02-07 10:00:00"
      ["title"]=>
      string(15) "打ち合わせ"
    }
  }
  ["2020-02-10"]=>
  array(1) {
    [0]=>
    array(3) {
      ["start"]=>
      string(19) "2020-02-10 00:00:00"
      ["end"]=>
      string(19) "2020-02-11 00:00:00"
      ["title"]=>
      string(6) "休暇"
    }
  }
  ["2020-02-12"]=>
  array(1) {
    [0]=>
    array(3) {
      ["start"]=>
      string(19) "2020-02-12 15:00:00"
      ["end"]=>
      string(19) "2020-02-12 16:00:00"
      ["title"]=>
      string(15) "打ち合わせ"
    }
  }
  ["2020-02-13"]=>
  array(1) {
    [0]=>
    array(3) {
      ["start"]=>
      string(19) "2020-02-13 00:00:00"
      ["end"]=>
      string(19) "2020-02-15 00:00:00"
      ["title"]=>
      string(6) "出張"
    }
  }
}

終日予定、時間指定の予定、日をまたいでいる予定もしっかり取得できました!

サービスアカウントを用いて、認証でカレンダーを取得する(方法2)

1つ目の方法ではカレンダーを一般公開する必要があり、誰でも閲覧可能になってしまいます。
一般公開できないアカウントの場合は以下の方法でカレンダーを取得することができます。

STEP1 サービスアカウントの取得

前回の記事を参考にGoogleCalendarAPI有効化まで行います。
続いて、「認証情報を作成」から「サービスアカウント」を選択します。


サービスアカウント名とサービスアカウントIDを入力し「作成」ボタンを押下します。


サービスアカウントの権限(オプション)はそのまま「続行」ボタンを押下します。


「キーを作成」ボタンを押下し、キータイプがJSONになっていることを確認して「作成」ボタンを押下します。
ここでダウンロードされたサービスアカウントの秘密鍵は後で使いますので、保存しておきます。

STEP2 情報を取得したいカレンダー側の設定

STEP1で取得したサービスアカウントにカレンダーを共有します。
Googleカレンダーのメニューから「設定と共有」を選択します。


特定のユーザーとの共有欄の「ユーザーを追加」ボタンを押下します。

ダイアログが開きますので、STEP1で取得したJSONファイルをテキストエディタで開き、「client_email」の値を入力し、「送信」ボタンを押下します。

1つ目の方法同様カレンダーIDを使いますので、カレンダーの統合欄のカレンダーIDをメモしておきます。

STEP3 PHPでデータの取得

GoogleAPIのライブラリが必要になるので、下記のURLにアクセスしインストールします。

A PHP client library for accessing Google APIs

composerでインストールする方法と、.zip形式でダウンロードしインストールする方法がありますが、今回はcomposerでインストールします。

$ composer require google/apiclient:"^2.0"

また、STEP1で取得した秘密鍵もサーバの同階層にアップロードします。

// ディレクトリ構造イメージ
path/to/your-project/
               ├ composer.json
               ├ composer.lock
               ├ 秘密鍵.json
               ├ データ取得用PHP.php
               └ vendor/
                    └ autoload.php

下記のコードを作成してみました。

<?php

// ライブラリの読み込み
require_once __DIR__. '/vendor/autoload.php';
// 秘密鍵.jsonまでのパス
$json_path = __DIR__. '秘密鍵.json';
// データの開始日
$start = date(date('Y'). '-01-01\T00:00:00\Z');
// データの終了日
$end = date(date('Y'). '-12-31\T00:00:00\Z');
// カレンダーID
$calendar_id = 'STEP2でメモしたカレンダーID';

$client = new Google_Client();
// スコープをカレンダーの読み取りに設定
$client->setScopes(Google_Service_Calendar::CALENDAR_READONLY);
// 認証設定
$client->setAuthConfig($json_path);

// カレンダーサービスの作成
$service = new Google_Service_Calendar($client);

$option = [
    'timeMin' => $start,
    'timeMax' => $end,
    'maxResults' => 50,
    '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が入っている
        $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);
        $results[$start->format('Y-m-d')][] = [
            'start' => $start->format('Y-m-d H:i:s'),
            'end' => $end->format('Y-m-d H:i:s'),
            'title' => (string)$event->summary
        ];
    }
}

var_dump($results);

実行結果

$ php データ取得用PHP.php 
array(4) {
  ["2020-02-07"]=>
  array(1) {
    [0]=>
    array(3) {
      ["start"]=>
      string(19) "2020-02-07 09:00:00"
      ["end"]=>
      string(19) "2020-02-07 10:00:00"
      ["title"]=>
      string(15) "打ち合わせ"
    }
  }
  ["2020-02-10"]=>
  array(1) {
    [0]=>
    array(3) {
      ["start"]=>
      string(19) "2020-02-10 00:00:00"
      ["end"]=>
      string(19) "2020-02-11 00:00:00"
      ["title"]=>
      string(6) "休暇"
    }
  }
  ["2020-02-12"]=>
  array(1) {
    [0]=>
    array(3) {
      ["start"]=>
      string(19) "2020-02-12 15:00:00"
      ["end"]=>
      string(19) "2020-02-12 16:00:00"
      ["title"]=>
      string(15) "打ち合わせ"
    }
  }
  ["2020-02-13"]=>
  array(1) {
    [0]=>
    array(3) {
      ["start"]=>
      string(19) "2020-02-13 00:00:00"
      ["end"]=>
      string(19) "2020-02-15 00:00:00"
      ["title"]=>
      string(6) "出張"
    }
  }
}

こちらの方法でも問題なく取得できました!

まとめ

いかがでしたでしょうか。取得したデータを使って通知BOTを作ったり、独自デザインのカレンダーに自動的にデータを表示させたりもできそうですね。

この記事を書いた人

ばね
ばねソリューション事業部 システムエンジニア
東京で2年半エンジニアとしての経験を積み、浜松にUターンの後、アーティスへ入社。
ソリューション事業部のWebエンジニアとして、システムの設計・開発・保守・運用からインフラまで幅広く従事している。
フルスタックエンジニア目指して現在も勉強の日々。車が好き。
この記事のカテゴリ

FOLLOW US

最新の情報をお届けします