[実験]エクセルのシフト表をGoogleカレンダーに反映[してみる]その4

乙です。
さて、今回はPHPでgoogleカレンダーへのデータ更新をします。
とりあえず、google-api-php-client-x.x.xを使用します。適当に設置してください。
あと、もろもろgoogleのapiを使用するためのことをしておいてください。


さてと・・・
phpソースをさらします・・
hoge.php

<?php
// カレンダーのIDは必須なので、無い場合は終了させる
if (!isset($_REQUEST['calendar_id']) && !$_REQUEST['calendar_id']) {
    exit;
}
$calendar_id = $_REQUEST['calendar_id'];
$calendar_title = isset($_REQUEST['calendar_title'])?$_REQUEST['calendar_title']:"バイト";
$day = (isset($_REQUEST['day']) && count($_REQUEST['day']))?$_REQUEST['day']:"";
$min_d = isset($_REQUEST['min_d'])?$_REQUEST['min_d']:"";
$max_d = isset($_REQUEST['max_d'])?$_REQUEST['max_d']:"";
if (!$max_d || !$min_d) {
    exit;
}
require_once("./google-api-php-client-x.x.x/vendor/autoload.php");
$json_path = __DIR__.'/json/「googleAPIのプロジェクト名」-[なんか適当な文字列の羅列].json';

$client = new Google_Client();
$client->setAuthConfig($json_path);
$client->setApplicationName("Google Calendar PHP API");
$client->setScopes(Google_Service_Calendar::CALENDAR);
$client->setAccessType('offline');
$client->setApprovalPrompt ("force");

$service = new Google_Service_Calendar($client);
//該当期間のカレンダーデータを取得
$optParams = array(
  'orderBy' => 'startTime',
  'singleEvents' => TRUE,
  'timeMin' => date('c', strtotime($min_d)),
  'timeMax' => date('c', strtotime($max_d . " +1 day")),
);
// 取得実行
$results = $service->events->listEvents($calendar_id, $optParams);
// GoogleカレンダースケジュールのデータとPOSTされたデータを比較します
foreach ($results->items as $event) {
    // タイトルが同じものか確認
    if($event->summary == $calendar_title){
        $st = strtotime($event->start->dateTime);
        $et = strtotime($event->end->dateTime);
        $res_s_day = date("Y/m/d", $st);
        $del_flg = true;
        // POSTされたデータにカレンダーの該当日のスケジュールがある場合に内容確認
        if (isset($day[$res_s_day])) {
            $ts = strtotime($res_s_day." ".$day[$res_s_day]['f']);
            $te = strtotime($res_s_day." ".$day[$res_s_day]['t']);
            $s = date("Hi", $ts);
            $e = date("Hi", $te);
            // 内容が同じ場合は、googleカレンダーのスケジュールを削除しない
            if ($st == $ts && $et == $te && 
                $day[$res_s_day]['remark'] == $event->description) {
                // 同じなので、削除しないし、更新もしない
                $del_flg = false;
                unset($day[$res_s_day]);
            }
        }
        // 削除対象のものをgoogleカレンダーから削除
        if($del_flg===true){
            // 削除実行
            $del_res = $service->events->delete($calendar_id, $event->id);
        }
    }
}
// 登録・更新する日のスケジュールがない場合終了
if(!isset($day) || !count($day)){
    exit;
}
// googleカレンダーにスケジュールを登録します
$optParams = array();
$summary = $calendar_title;
// 対象の日分回します。
foreach ($day as $ymd=>$arr) {
    $description = $arr['remark'];
    $start = date("c", strtotime($ymd." ".$arr['f']));
    $end = date("c", strtotime($ymd." ".$arr['t']));
    // 登録するスケジュールデータを作成
    $postBody = new Google_Service_Calendar_Event(array(
        "summary" => $summary,
        "description" => $description,
        "start" => array(
            "dateTime" => $start,
            "timeZone" => "Asia/Tokyo",
        ),
        "end" => array(
            "dateTime" => $end,
            "timeZone" => "Asia/Tokyo",
        ),
    ));
    // 登録実行
    $results = $service->events->insert($calendar_id, $postBody);
}
//終了

以上です。

これで動かすとエクセルが固まりますので、受け取ったら、非同期処理でgoogleのAPIを実行させる方がいいです。

スポンサーリンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です