前記事に引き続いて、自作アプリとGoogle Calendarの同期機能を作成する。
「自作アプリにもGoogle Calendarにも登録がある」場合(前回記事のケースB)を処理する。(これら以外に、「Google Calendar にのみ登録がある」場合(ケースC)も考えられる。これには、(1)Google Calendarに手動で新規登録した、(2)Google Calendarに同期作成したがアプリ側で削除した場合が考えられるが、現時点ではこのような(C)のケースは無視する。)
// JavaScript
var a_plan = plan[i];
if (plan[i].cal_id == ''){ // Google Calendarに未登録の場合(A)
addToGCal(plan[i]); // Google Calendarに登録する
} else { // Google Calendarに登録済の場合(B)
updGCal(plan[i]);
}
このコードでは、Google Calendarに登録済かどうかをEventIDが保存されているか否かで判定しているため、さらに2つの状況がある。
- (B-1) 対応するEvent IDを持つイベントがGoogle Calendarに存在しない
「イベントを同期作成したが、Google Calendar側で手動操作してそのイベントを削除した」場合に発生する。再度Google Calendarのイベントを登録することも考えられるが、現時点では何もしないことにする。 - (B-2) 対応するEvent IDを持つイベントがGoogle Calendarに存在する
このケースでは、両者が保持するsequence番号を比較し、古いほうを新しいほうに合わせることにする。場合分けすると以下のとおり。- Google Calendarのイベントが新しい(B-2a)
アプリの予定データを更新する。 - アプリの予定データが新しい(B-2b)
Google Calendarのイベントを更新する。 - どちらも最新(B-2c)
何もしない
- Google Calendarのイベントが新しい(B-2a)
これらをコードで記述すると以下のイメージになる。
// JavaScript
// 指定された予定に紐づいたCalendarのEventを取得する
var a_event = getEvent(gGCEvent, a_plan.cal_id);
if (a_event == null){
// アプリにあってGoogle Calendarにない(=向こうで削除された)状態
// 現状は何もしない
} else {
// 両方に登録がある場合はsequenceを比較
// Google Calendarのほうが新しい場合(B-2a)
if (a_plan.cal_seq < a_event.sequence){
// アプリの日付データ等を(Google Calendarに合わせ)最新にする
a_plan.spot_date = xud_date2dateStr( a_event.start_dateTime );
a_plan.spot_time = xud_date2timeStr( a_event.start_dateTime );
a_plan.cal_seq = a_event.sequence;
// アプリの予定データを更新
gDSspotPlan.dbUpd(a_plan.plan_key, a_plan, function(){
console.debug('Plan updated.');
});
// アプリのほうが新しい場合(B-2b)
} else if (a_plan.cal_seq > a_event.sequence){
// Google Calendarの日付データ等を(アプリに合わせ)最新にする
a_event.start_dateTime = new Date(a_plan.spot_date + ' ' + a_plan.spot_time);
a_event.sequence = a_plan.cal_seq;
// Google Calendarのイベントを更新
gGCalendar.updEvent(a_event, function(resp){
console.debug('Event updated.');
});
// どちらも同じシーケンス番号を持つ場合(B-2c)
} else {
// どちらも同じ状態なので何もしない
console.debug('The two items have the same sequence numbers.');
}
}
}








ピンバック: 予定作成アプリ(PC版)のレベルアップ(1) | Try Lifelog