PHPでGoogle Calendar APIを使って祝日を求める

(1/1)
PHPで祝日を求める」では計算によって祝日を求めるPHPプログラムを紹介したが、今回はGoogle Calendar APIを呼び出して祝日を求めるプログラムを作ってみることにする。

(2026年1月11日) PHP8.5対応:double→float
(2025年9月19日).pahooEnv導入

サンプル・プログラム:実行例

PHPでGoogle Calendar APIを使って祝日を求める

目次

サンプル・プログラム

圧縮ファイルの内容
getHolidayGoogle.phpサンプル・プログラム本体
.pahooEnvクラウドサービスを利用するためのアカウント情報などを記入する .env ファイル。
使い方は「各種クラウド連携サービス(WebAPI)の登録方法」を参照。include_path が通ったディレクトリに配置すること。
pahooInputData.phpデータ入力に関わる関数群。
使い方は「数値入力とバリデーション」「文字入力とバリデーション」などを参照。include_path が通ったディレクトリに配置すること。
getHolidayGoogle.php 更新履歴
バージョン 更新日 内容
2.3.0 2026/01/11 PHP8.5対応:double→float
2.2.0 2025/09/19 .pahooEnv導入
2.1.0 2025/02/11 pahooInputData.php 導入,など
2.0.1 2024/09/23 参考URL変更
2.0 2022/01/10 表示改良,PHP8対応,リファラ・チェック改良
pahooInputData.php 更新履歴
バージョン 更新日 内容
2.0.1 2025/08/11 getParam() bug-fix
2.0.0 2025/08/11 pahooLoadEnv() 追加
1.9.0 2025/07/26 getParam() 引数に$trim追加
1.8.1 2025/03/15 validRegexPattern() debug
1.8.0 2024/11/12 validRegexPattern() 追加

準備:PHP の https対応

クラウド連携や相手先サイトのデータを読み込むのに https通信を使うため、PHPに OpenSSLモジュールが組み込まれている必要がある。関数  phpinfo  を使って、下図のように表示されればOKだ。
OpenSSL - PHP
そうでない場合は、次の手順に従ってOpenSSLを有効化し、PHPを再起動させる必要がある。

Windowsでは、"php.ini" の下記の行を有効化する。
extension=php_openssl.dll
Linuxでは --with-openssl=/usr オプションを付けて再ビルドする。→OpenSSLインストール手順

これで準備は完了だ。

準備:pahooInputData 関数群

PHPのバージョンや入力データのバリデーションなど、汎用的に使う関数群を収めたファイル "pahooInputData.php" が同梱されているが、include_path が通ったディレクトリに配置してほしい。他のプログラムでも "pahooInputData.php" を利用するが、常に最新のファイルを1つ配置すればよい。

また、各種クラウドサービスに登録したときに取得するアカウント情報、アプリケーションパスワードなどを登録した .pahooEnv ファイルから読み込む関数 pahooLoadEnv を備えている。こちらについては、「各種クラウド連携サービス(WebAPI)の登録方法」をご覧いただきたい。

Google Calendar API v3

Google Calendar API」を使うことで、わが国の祝日を取得することができる。
入力パラメータ(IN)はGETで渡し、出力結果(OUT)は json形式で戻るという REST API である。

calendarIDは、Googleが公式に用意している日本語カレンダー ja.japanese#holiday@group.v.calendar.google.com を利用する。2025年(令和7年)2月現在、国民の祝日だけでなく、銀行休業日なども祝日として取得する仕様に変わっている。
WebAPIのURL
URL
https://www.googleapis.com/calendar/v3/calendars/{calendarId}/events
{calendarId} = urlencode('ja.japanese#holiday@group.v.calendar.google.com')

入力パラメータ
フィールド名 要否 内  容
key 必須 Google API key
timeMin 必須 取得開始日時。RFC3339形式。
timeMax 必須 取得終了日時。RFC3339形式。
maxResults 任意 取得する最大件数。
orderBy 任意 並び順。
singleEvents 任意 シングル・イベント。TRUE/FALSE
応答データ構造(json) items summary 祝日名 oggimage oggimage2 twittercard summary name 掲載店名 start date 年-月-日 items summary 祝日名 oggimage oggimage2 twittercard summary name 掲載店名 start date 年-月-日

準備:初期値など

getHolidayGoogle.php

  55: // 初期値(START) =============================================================
  56: 
  57: // 表示幅(ピクセル)
  58: define('WIDTH', 600);
  59: 
  60: // 指定できる西暦年の範囲;現在年±10
  61: define('MIN_YEAR', date('Y'- 10);
  62: define('MAX_YEAR', date('Y'+ 10);
  63: 
  64: // -- 以下のデータは .env ファイルに記述可能
  65: // Google Cloud Platform APIキー
  66: // https://cloud.google.com/maps-platform/
  67: if (isset($_ENV['PAHOO_GOOGLE_API_KEY_1'])) {
  68:     define('GOOGLE_API_KEY', $_ENV['PAHOO_GOOGLE_API_KEY_1']);
  69: else {
  70:     define('GOOGLE_API_KEY', '');
  71: }
  72: 
  73: // 初期値(END) ===============================================================

Google Cloud Platform APIキーは、「Google Cloud Platform - 各種WebAPIの登録方法」を参考に入手してほしい。そして「Google Calendar API」の画面でAPIを有効にすること。APIキーは .pahooEnv ファイルに記入するか、本プログラムの定数 GOOGLE_API_KEY に代入しておくこと。

解説:Google Calendar API呼び出し

getHolidayGoogle.php

 226: /**
 227:  * Google Calendar APIを使って1年分の祝日を取得
 228:  * @param   int    $year     西暦年
 229:  * @param   array  $holidays 祝日を格納する配列
 230:  * @param   string $url      WebAPIのURL格納用
 231:  * @return  int 格納した祝日数
 232: */
 233: function getHoliday_by_Google($year, &$holidays, &$url) {
 234:     $type = urlencode('ja.japanese#holiday@group.v.calendar.google.com');
 235:     $google_api_key = GOOGLE_API_KEY;
 236:     $start  = sprintf("%04d-01-01T00:00:00Z", $year);
 237:     $finish = sprintf("%04d-01-01T00:00:00Z", $year + 1);
 238:     $url = "https://www.googleapis.com/calendar/v3/calendars/{$type}/events?key={$google_api_key}&timeMin={$start}&timeMax={$finish}&maxResults=50&orderBy=startTime&singleEvents=true";
 239: 
 240:     $cnt = 0;
 241:     $result = file_get_contents($url);
 242:     $result = json_decode($result);
 243:     if (! empty($result->items)) {
 244:         foreach ($result->items as $value) {
 245:             $title = (string)$value->summary;
 246:             $date  = (string)$value->start->date;
 247:             $holidays[$date] = $title;
 248:             $cnt++;
 249:         }
 250:     }
 251: 
 252:     return $cnt;
 253: }

WebAPIの呼び出しは、今までのプログラムと同じだ。
戻り値はJSON形式であるが、PHPには関数  json_decode  が組み込まれているので、これを使って、個々の祝日に分解する。

プログラムのその他の部分は、「PHPで祝日を求める」で使ったものとほぼ同じである。

参考サイト

(この項おわり)
header