#028
posted on 2021.02.09

Google Calendar APIのAPIキーとカレンダーIDでGoogleカレンダーのJSONを取得。

Google Calendar APIのAPIキーを利用して、カレンダーIDで指定したGoogleカレンダーのJSONデータを取得する方法のメモ。

APIキーとカレンダーIDの取得方法は前の記事を参照。

 

※ この方法は、データを取得するGoogleカレンダーの「Access permissions」がpublicになっている必要がある。

 

Google Calendar APIの公式リファレンス

 

カレンダーのJSONデータ取得のURLを作成

APIキーとカレンダーIDから、カレンダーのJSONデータ取得のHTTPリクエストをするURLを作成する。

取得できるカレンダーイベントのパラメーターに関する公式リファレンス

//APIキー
$api_key = '取得したAPIキー';
//カレンダーID
$calendar_id = 'ja.japanese#holiday@group.v.calendar.google.com';//「日本の祝日」のID

//カレンダーIDをURLにエンコード
$calendar_id = urlencode($calendar_id);
//カレンダーのイベントのJSONデータ取得のURL
$url = 'https://www.googleapis.com/calendar/v3/calendars/'.$calendar_id.'/events?';

//データ取得の開始日と終了日を指定
//UTCと日本の時差9時間
$jpOffSet = 9*60*60; //9時間(32400秒)
//今日の日付を取得
if(date_default_timezone_get() == 'Asia/Tokyo'){
//デフォルトタイムゾーンが日本の場合
  $today = date("Y-m-d");
}else{
//デフォルトタイムゾーンが日本以外の場合
  $today = gmdate("Y-m-d", (mktime(date("H"),date("i"),date("s"),date("n"), date("j"),date("Y")))+$jpOffSet);
}
//フォーマット'c'でタイムスタンプをISO 8601形式に変換
$start = date('c', strtotime($today));
$end = date('c', strtotime('2023-12-31'));

//JSONデータ取得用のクエリを作成
$query = [
    'key' => $api_key,
    'singleEvents' => 'true',//trueで終日設定ではないイベントを返す(デフォルトはfalse)
    'orderBy' => 'startTime',//'startTime' (予定開始日時)か'updated' (最終更新日時)
    'timeMin' => $start,
    'timeMax' => $end,//デフォルトは指定無し
    'maxResults' => 10,//デフォルトは250、最大2500
    'timeZone' => 'Asia/Tokyo'//デフォルトはカレンダー側で設定のタイムゾーン
];
//JSONデータ取得のURLにクエリを付加
$url = $url.http_build_query($query);

date(‘フォーマット’) : デフォルトタイムゾーンでの現在時刻を指定フォーマットで返す。

mktime(時, 分, 秒, 月, 日, 年) : 指定した日時のUNIXタイムスタンプを返す。

gmdate(‘フォーマット’, ‘タイムスタンプ’) : 指定したタイムスタンプをGMT(グリニッジ標準時)の時刻にして指定フォーマットで返す。

strtotime(‘英文形式日付’) : 日付をUnixタイムスタンプに変換して返す。

http_build_query(‘配列’) : 配列からURLにエンコードされたクエリ文字列を生成。

 

 

カレンダーのJSONデータを取得

cURL()関数を使ってJSONデータにアクセスして取得し、連想配列にしてオブジェクトを変数に格納。(cURLが使えないサーバーの場合は、file_get_contents()関数を使う。)

 

取得できるカレンダーイベントのデータに関する公式リファレンス

//エラー判定を含めたJSON取得用の関数を作成
function ag2Curl($url){
  $option = [
    CURLOPT_RETURNTRANSFER => true,//データを文字列に変換して返す
    CURLOPT_TIMEOUT        => 30,//タイムアウト時間
  ];
  $ch = curl_init($url);//cURLセッションを初期化
  curl_setopt_array($ch, $option);//転送用の複数のオプションを設定
  $json = curl_exec($ch);//cURLセッションを実行
  if(curl_errno($ch)){ //エラー番号を返す(エラーが発生しない場合、0)
    echo '<p>Curl Error: '.curl_error($ch).'</p>';
    $json = false;
  }
  curl_close($ch);//cURLセッションを閉じて処理を終了

  return $json;
}

$json = ag2Curl($url);

if($json){
  //イベントのデータを配列で保持
  $calendar_events = [];

  $jpW = array("日", "月", "火", "水", "木", "金", "土");

  $obj = json_decode($json, true);//JSON文字列をデコードして連想配列形式のオブジェクトを格納
  @$calendar_summary = $obj['summary'];//カレンダータイトル
  @$calendar_description = $obj['description'];//カレンダー説明
  @$calendar_updated = $obj['updated'];//カレンダー最終更新日
  @$calendar_timeZone = $obj['timeZone'];//カレンダータイムゾーン
  @$calendar_items = $obj['items'];

  if(empty($calendar_items)){
    echo '<p>スケジュールは未定です。</p>';
  }else{
    for($i = 0; $i < count($calendar_items); $i++){
      @$event_id = $calendar_items[$i]['id'];
      @$event_link = $calendar_items[$i]['htmlLink'];//リンク
      @$event_title = $calendar_items[$i]['summary'];//タイトル
      @$event_desc = $calendar_items[$i]['description'];//本文
      @$event_location = $calendar_items[$i]['location'];//場所
      @$event_start = $calendar_items[$i]['start']['date'];//開始日
      @$event_startT = $calendar_items[$i]['start']['dateTime'];//開始日時
      @$event_end = $calendar_items[$i]['end']['date'];//終了日
      @$event_endT = $calendar_items[$i]['end']['dateTime'];//終了日時

      //終日設定対応の調整
      //開始日時を調整
      if(!empty($event_startT)){
        $startStamp = strtotime($event_startT);
        $event_startT = gmdate("H:i", $startStamp+$jpOffSet);
      }else{
        $startStamp = strtotime($event_start);
        $event_startT = '終日';
      }
      $event_startDate = gmdate("Y年m月d日 (".$jpW[gmdate("w", $startStamp+$jpOffSet)].")", $startStamp+$jpOffSet);
      $event_startSub = gmdate("Y/m/d (D)", $startStamp+$jpOffSet);
      //終了日時を調整
      if(!empty($event_endT)){
        $endStamp = strtotime($event_endT);
        $event_endT = gmdate("H:i", $endStamp+$jpOffSet);
      }else{
        //終日設定の場合、翌日の00:00:00がendTimeになるので一日分戻す。
        $endStamp = strtotime($event_end)-24*60*60;
        $event_endT = NULL;
      }
      $event_endDate = gmdate("Y年m月d日 (".$jpW[gmdate("w", $endStamp+$jpOffSet)].")", $endStamp+$jpOffSet);
      $event_endSub = gmdate("Y/m/d (D)", $endStamp+$jpOffSet);

      //取得したデータを配列で格納
      $calendar_events[$i] = array(
        'id' => $event_id,
        'link' => $event_link,
        'title' => $event_title,
        'desc' => $event_desc,
        'location' => $event_location,
        'startDate' => $event_startDate,
        'startTime' => $event_startT,
        'startSub' => $event_startSub,
        'endDate' => $event_endDate,
        'endTime' => $event_endT,
        'endSub' => $event_endSub
      );
    }

    //取得したデータをHTMLに出力
    foreach($calendar_events as $k => $v){
      echo '<div>';
      echo '<p>'.$v['startDate'].'</p>';
      echo '<p>'$v['title'].'</p>';
      echo '<p>'$v['location'].'</p>';
      echo '</div>';
    }

  }
}else{
  echo '<p>API Error : 予定を読み込めませんでした。</p>';
}

 

 

この記事をシェア