PHP:Google Calendar API V3で予定の登録と削除を行う

Googleカレンダーと他のカレンダーとの同期方法にはいくつか方法があるようです。

  • Googleカレンダーで「URLの追加」をする・・・半日~1日程度のタイムラグがある?
  • OutLookを使ってExchangeプロトコルで同期する・・・OutLook限定;;
  • CalDAVサーバーを立てる・・・サーバーが必要(Macなら標準?)
  • Google Calendar APIを使う
今回はGoogle Calendar API V3を使ってみました。

Zend Frameworkのインストールと設定

http://framework.zend.com/download/latest からZend Frameworkをダウンロードして解凍。
(1.11.2 Minimalを選択しました。)
サーバにアップロードします。

本来は /usr/local/lib/ZendFramework/ などにアップロードし、php.iniのinclude_pathに指定するのがいいのかもしれませんが、このテストプロジェクトでしか使用しないので、php.iniにはなにも設定しないことにします。

index.php

以下、登録と削除のサンプルです。
ZendFrameworkフォルダはindex.phpと同じところにアップロードしています。
<?php
// Zend Frameworkのパスを追加する
$path = "./ZendFramework/library/";
set_include_path(get_include_path() . PATH_SEPARATOR . $path);

// 以前はこれでよかったみたい・・・今はダメ
// require_once 'Zend/Loader.php';
// Zend_Loader::registerAutoload();

require_once 'Zend/Loader/Autoloader.php';
$autoloader = Zend_Loader_Autoloader::getInstance();
$autoloader->setFallbackAutoloader(true); 

$user = "username@gmail.com";
$pass = "password";

$service = Zend_Gdata_Calendar::AUTH_SERVICE_NAME;
$client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $service);
$serviceCal = new Zend_Gdata_Calendar($client);

// 全削除のサンプル
delCalAll($serviceCal, $user);

// 登録のサンプル
insCal($serviceCal, '2012-07-23', '13:00', '2012-07-23', '16:00', '極秘会議', "出席者:\r\nAさん、Bさん", '第5会議室');

// ************************************************************
// イベント登録
// $sdate, $edate:yyyy-mm-dd
// $stime, $etime:hh:nn
// ************************************************************
function insCal($serviceCal, $sdate, $stime, $edate, $etime, $title, $content, $location){
 // 新規にイベントを作成
 $event= $serviceCal->newEventEntry();

 // イベントの内容を設定
 $event->title = $serviceCal->newTitle($title);
 $event->where = array($serviceCal->newWhere($location));
 $event->content = $serviceCal->newContent($content);
 // 日時の設定
 $when = $serviceCal->newWhen();
 // タイムゾーンは日本(+9:00)
 $tzOffset = "+09";
 $when->startTime = "{$sdate}T{$stime}:00.000{$tzOffset}:00";
 $when->endTime = "{$edate}T{$etime}:00.000{$tzOffset}:00";
 $event->when = array($when);
 
 // イベントをGoogle Calenderに登録
 $newEvent = $serviceCal->insertEvent($event);
 echo "SUCCESS(INSERT).\r\n";
}

// ************************************************************
// 全イベント削除
// ************************************************************
function delCalAll($serviceCal){
 // カレンダーリストを取得
 try {
  $listFeed= $serviceCal->getCalendarListFeed();
 } catch (Zend_Gdata_App_Exception $e) {
  echo "ERROR(DELETE)." . $e->getMessage();
 }
 foreach($listFeed as $list){
  $listId = $list->id;
  $user = substr($listId, strrpos($listId, "/") + 1);
  // イベントリストを取得
  $query = $serviceCal->newEventQuery();
  $query->setUser($user);
  $query->setVisibility('private');
  $query->setProjection('full');
  $query->setOrderby('starttime');
  
  try {
   $eventFeed = $serviceCal->getCalendarEventFeed($query);
  } catch (Zend_GData_App_Exception $e) {
   echo "ERROR(DELETE)." . $e->getMessage();
  }
  
  if($eventFeed){
   foreach($eventFeed as $event) {
    // PHP5?あたりからはemptyで判断。4ならis_nullでもOK
    if(!empty($event->getEditLink()->href)){
     $serviceCal->delete($event->getEditLink()->href);
     echo "SUCCESS(DELETE).\r\n";
    }
   }
  }
 }
}
?>

Googleカレンダーと他のアプリとの同期をとる場合は、全削除した後にCSV(ICS形式でも)などのデータを読み込んで登録するしくみです。
性能面で問題があれば、全削除は見直す必要があります。

ところで、登録するカレンダーの色は変えられないんでしょうか? APIリファレンスでは、colorにはgetメソッドしかないようなんですが・・・
https://developers.google.com/google-apps/calendar/v3/reference/colors/get

2012/7/23 追記
https://groups.google.com/forum/?hl=ja&fromgroups#!topic/google-calendar-help-dataapi/J_i0AR3gk-4
こちらにもありますが、上記イベント削除では25件までしかダメなようです。
$query->setMaxResults('99999'); みたいに書けるといいんですが、そんな関数はなさそう。
ループするしかない??

  • Spread The Love
  • Digg This Post
  • Tweet This Post
  • Stumble This Post
  • Submit This Post To Delicious
  • Submit This Post To Reddit
  • Submit This Post To Mixx

0 Response to “PHP:Google Calendar API V3で予定の登録と削除を行う”

Leave a Reply