目次

Google API

アプリケーション固有のパスワード

2段階認証の設定をしているアカウントで認証する場合、独自に2段階認証プロセスを実装するのは困難なため、アプリケーション固有のパスワードを生成して、認証に用います。

  1. ブラウザからgoogleアカウントをクリックして、ポップアップから「アカウント」をクリックします。

  1. 左のメニューから「セキュリティ」をクリックして、右の「2段階認証プロセス」の説明文中の「アプリケーション固有のパスワードの管理」をクリックします。

  1. 「名前」に適当な名前を入力して「パスワードの生成」を押下します。

  1. パスワードが表示されますので、これを作成しているブラウザアプリなどの認証処理のパスワードに使用します。

Zend_Gdataインストール

http://framework.zend.com/manual/1.12/ja/zend.gdata.introduction.html

# wget "https://packages.zendframework.com/releases/ZendGdata-1.12.3/ZendGdata-1.12.3.tar.gz"
# tar xzvf ZendGdata-1.12.3.tar.gz
# cp -r ZendGdata-1.12.3/library/Zend /usr/local/clown/bin/

PHP実装のお作法

<?php
set_include_path(get_include_path() . PATH_SEPARATOR . '/usr/local/clown/bin');

require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Gdata');
Zend_Loader::loadClass('Zend_Gdata_ClientLogin');
Zend_Loader::loadClass('Zend_Gdata_Calendar');

/* ClientAuth 認証 */
// ClientAuth 認証用のパラメータ
$Email    = "taro@clown.com";
$Password = "アプリケーション固有のパスワード";
$Service  = Zend_Gdata_Calendar::AUTH_SERVICE_NAME;

// 認証済みHTTPクライアント作成(ClientLogin版)
$Client = Zend_Gdata_ClientLogin::getHttpClient($Email, $Password, $Service);

Google Calendar

http://framework.zend.com/manual/1.12/ja/zend.gdata.calendar.html

$service = new Zend_Gdata_Calendar($Client);

$query = $service->newEventQuery();
// カレンダーID(default/*****)
$query->setUser('clown.com_ulamstbg1c1b9tp4elv2krmg88@group.calendar.google.com');
// 公開/非公開
$query->setVisibility('private');
// 情報(full/composite/basic)
$query->setProjection('full');
//
$query->setOrderby('starttime');
//並べ替えの昇順・降順を指定(ascend/descend)
$query->setSortorder('ascend');
//期間指定時はコメントアウト
//$query->setFutureevents('true');
// 指定した日付の範囲からのイベントの取得
$query->setStartMin('2013-12-09');
$query->setStartMax('2013-12-29');
// 全文検索によるイベントの取得
//$query->setQuery("KingVM");
 
// カレンダーサーバからイベントの一覧を取得します
try {
    $eventFeed = $service->getCalendarEventFeed($query);
} catch (Zend_Gdata_App_Exception $e) {
    echo "エラー: " . $e->getMessage();
}
 
// リストの内容を順に取得し、HTML のリストとして出力します
echo "<ul>";
foreach ($eventFeed as $event) {
    $list = $event->when[0]->getStartTime();
    $list .= ”~”;
    $list .= $event->when[0]->getEndTime();
    $list .= ” ”;
    $list .= $event->title;
    $list .= " (Event ID: ";
    $list .= $event->id;
    $list .= ")";

    echo "<li>" . $list . "</li>";
}
echo "</ul>";

Google Spreadsheets

http://framework.zend.com/manual/1.12/ja/zend.gdata.spreadsheets.html

/* スプレッドシートの読み込み */
// Spreadsheetサービスのインスタンス作成
$Spreadsheet = new Zend_Gdata_Spreadsheets($Client);

//スプレッドシートのキーを知らなければ、
	// スプレッドシート名
	$spreadsheetName = "test";
	
	$Feed = $Spreadsheet->getSpreadsheetFeed();

	// スプレッドシートのキー取得
	$i = 0;
	foreach($Feed->entries as $Entry) {
	    if( $Entry->title->text===$spreadsheetName) {
	        $Key = split('/', $Feed->entries[$i]->id->text);
	        $SpreadsheetKey = $Key[5];
	        break;
	    }
	    $i++;
	}
//スプレッドシートのキーを知っていれば
	$SpreadsheetKey = "tX6waVdKTSIWZdwwKe8-bfg";

//ワークシートIDを知らなければ
	// ワークシート(タブ)名
	$worksheetName   = "sheet1";
	
	/* ワークシートIDの取得 */
	// クエリの作成
	$Query = new Zend_Gdata_Spreadsheets_DocumentQuery();
	$Query->setSpreadsheetKey($SpreadsheetKey);

	// ワークシートフィードの取得
	$Feed = $Spreadsheet->getWorksheetFeed($Query);

	// ワークシートの検索
	$i = 0;
	foreach($Feed->entries as $Entry) {
	    $worksheetId = split('/', $Feed->entries[$i]->id->text);
	    if( $Entry->title->text===$worksheetName ){
	        $WorksheetId = $worksheetId[8];
	        //echo("ワークシートのID:{$WorksheetId}<br>");
	        break;
	    }
	    $i++;
	}
//ワークシートIDを知っていれば
	$WorksheetId = "od6";

// リストフィードの取得
$listFeed = searchListFeed($Spreadsheet,$SpreadsheetKey,$WorksheetId);

tips

■日付指定は9時間ずれる(+9時間される)
以下のスケジュールをgoogleカレンダーに定義して、12/25 00:00:00~12/25 23:59:59の予定を取得したい

12/24 17:00~20:00 7台
12/24 21:00~01:00 10台
12/25 01:00~03:00 4台
12/25 09:00~10:00 6台
12/25 10:00~11:00 5台
12/26 08:00~09:00 10台

日時指定で12/24~12/26を指定する
⇒12/24 09:00:00~12/26 08:59:59の予定が取得される

2013-12-24T17:00:00.000+09:00,2013-12-24T20:00:00.000+09:00,7
2013-12-24T21:00:00.000+09:00,2013-12-25T01:00:00.000+09:00,10
2013-12-25T01:00:00.000+09:00,2013-12-25T03:00:00.000+09:00,4
2013-12-25T09:00:00.000+09:00,2013-12-25T10:00:00.000+09:00,6
2013-12-25T10:00:00.000+09:00,2013-12-25T11:00:00.000+09:00,7
2013-12-26T08:00:00.000+09:00,2013-12-26T09:00:00.000+09:00,10

日時指定で12/25~12/26を指定する
⇒12/25 09:00:00~12/26 08:59:59の予定が取得される

2013-12-25T09:00:00.000+09:00,2013-12-25T10:00:00.000+09:00,6
2013-12-25T10:00:00.000+09:00,2013-12-25T11:00:00.000+09:00,7
2013-12-26T08:00:00.000+09:00,2013-12-26T09:00:00.000+09:00,10

日時指定で12/24 15:00~12/25 15:00を指定する
⇒12/25 00:00:00~12/25 23:59:59の予定が取得される

2013-12-24T21:00:00.000+09:00,2013-12-25T01:00:00.000+09:00,10
2013-12-25T01:00:00.000+09:00,2013-12-25T03:00:00.000+09:00,4
2013-12-25T09:00:00.000+09:00,2013-12-25T10:00:00.000+09:00,6
2013-12-25T10:00:00.000+09:00,2013-12-25T11:00:00.000+09:00,7

■連続のイベントは期間指定では一度しか抽出されない
以下のスケジュールをgoogleカレンダーに定義
※12/24 13:00~15:00でスケジュールを登録して、27日まで毎日で定義

12/24 13:00~15:00 8台(※)
12/24 17:00~20:00 7台
12/24 21:00~01:00 10台
12/25 01:00~03:00 4台
12/25 13:00~15:00 8台(※)
12/25 09:00~10:00 6台
12/25 10:00~11:00 5台
12/26 08:00~09:00 10台
12/26 13:00~15:00 8台(※)
12/27 13:00~15:00 8台(※)

日時指定で12/24 15:00~12/26 15:00を指定する(12/25 00:00~12/27 00:00を取得したい)
⇒12/25 13:00~15:00と12/26 13:00~15:00の2回あるはずが、取得は一度だけ

2013-12-25T13:00:00.000+09:00,2013-12-25T15:00:00.000+09:00,8
2013-12-24T21:00:00.000+09:00,2013-12-25T01:00:00.000+09:00,10
2013-12-25T01:00:00.000+09:00,2013-12-25T03:00:00.000+09:00,4
2013-12-25T09:00:00.000+09:00,2013-12-25T10:00:00.000+09:00,6
2013-12-25T10:00:00.000+09:00,2013-12-25T11:00:00.000+09:00,7
2013-12-26T08:00:00.000+09:00,2013-12-26T09:00:00.000+09:00,10

日時指定で12/25 15:00~12/27 15:00を指定する(12/26 00:00~12/28 00:00を取得したい)
⇒12/26 13:00~15:00と12/27 13:00~15:00の2回あるはずが、取得は一度だけ

2013-12-26T13:00:00.000+09:00,2013-12-26T15:00:00.000+09:00,8
2013-12-26T08:00:00.000+09:00,2013-12-26T09:00:00.000+09:00,10

■終日スケジュールは翌日まで取得対象となる
以下のスケジュールをgoogleカレンダーに定義

1/7 9台

日時指定で1/6 15:00~1/7 15:00を指定する(1/7 00:00:00~59:59:59を取得したい)

2014-01-07,2014-01-08,9

日時指定で1/7 15:00~1/8 15:00を指定する(1/8 00:00:00~59:59:59を取得したい)
⇒1/8日中でも処理の対象となる

2014-01-07,2014-01-08,9

■画面上削除したスケジュールは実際に削除される場合と、ステータスで削除となる場合がある。
取得したスケジュールの$event→eventstatusがcanceledとなっているものは、無効なスケジュール。

■日時のないスケジュールが存在する場合がある。
取得したスケジュールの$event→when[0]がないものは、無効なスケジュール。