Googleカレンダーと他のカレンダーとの同期方法にはいくつか方法があるようです。
- Googleカレンダーで「URLの追加」をする・・・半日~1日程度のタイムラグがある?
- OutLookを使ってExchangeプロトコルで同期する・・・OutLook限定;;
- CalDAVサーバーを立てる・・・サーバーが必要(Macなら標準?)
- Google Calendar APIを使う
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'); みたいに書けるといいんですが、そんな関数はなさそう。
ループするしかない??







