訪問予定とGoogle Calendarを同期する(2)

前記事に引き続いて、自作アプリと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)
      何もしない

これらをコードで記述すると以下のイメージになる。

// 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.');
    }
  }
}
  • 最初の状態(3件の予定を登録し、同期実行済)
    mlocplan05_b01
    gcal_20130426_b01
    xcalsync01_b01
  • アプリで予定を変更(珈琲館の訪問時刻を9:00から9:10に変更)
    mlocplan05_a02
  • シーケンス番号が0から1に更新される
    xcalsync01_b02
  • 同期ボタンをクリックするとGoogle Calendarのイベントが更新される
    gcal_20130426_b02
  • Google Calendarでイベントを変更(東武百貨店の訪問時刻を11:30に変更)
    gcal_20130426_b03
  • 同期処理を実行
    xcalsync01_b03
  • アプリの予定が更新される
    mlocplan05_b03
カテゴリー: Development タグ: パーマリンク

訪問予定とGoogle Calendarを同期する(2) への1件のフィードバック

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

コメントは停止中です。