ScheduleBoardとGoogleCalenderを同期させる

仕事でScheduleBoardを使っているのだがこれが社内からしか見れず不便。
手帳で管理していると「スケジュールボードに予定いれてくださいよ〜」と言われるしかといってScheduleBoardに入れると家から見れず
休みたい時に「もしかしたら明日大事な会議があったような・・」と気になっていたのもこれで解決!
予定が確認できれば気軽に休めるのでプライベートが満喫できます。
これで僕もリア充の仲間入り♪

やっていることはスケジュールボードからデータをCSV形式で抜き出して、
以前作ったGoogleCalenderUtilを使って更新する。

未来データの削除

一旦未来データを削除する。
期間を指定しなければならないので現在時刻から2099年までを指定して取得。

スケジュールボードからのデータの抜き出し

こんなコマンドを打ってあげると月単位でデータをCSVに出力してくれる。
なのでこれをJavaからキック。(今考えるとJavaからキックする必要性が全く感じられないな。。。)

Schedule.exe  /export Penta200803.sch,penta.csv

そうするとこんなCSVが吐き出される

Gara,2008/3/29,9:00,17:30,おやすみだす,,UserID,ff00aa
Gara,2008/3/30,9:00,17:30,おやすみだす,,UserID,ff00aa
Penta,2008/3/1,9:00,20:00,おやすみなのです,,UserID,aa00ff
Penta,2008/3/8,9:00,20:00,おやすみなのです,,UserID,aa00ff
Penta,2008/3/9,9:00,20:00,おやすみなのです,,UserID,aa00ff
Penta,2008/3/15,9:00,20:00,おやすみなのです,,UserID,aa00ff

といった感じでグループ単位でデータは吐き出されるので自分のデータだけを登録していく。

GoogleCalenderにデータ登録

自分のスケジュールを未来分のみ登録してゆく。
スケジュールボードは月単位に.schファイルが出来るのでこれを現在日時から3月分動かす。

タスクスケジューラーに登録して自動化

一度連携できるようになれば後はスケジュール化するだけ。
毎日12時と17時に仕込む。(お昼御飯と夕会の時間)ちなみに朝10時(朝会の時間)にはダーツライブのレート更新バッチが走る。
これで快適な生活が送れそうだ。

出来たソースはこんなかんじ

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Date;
import java.util.List;

import com.google.gdata.data.DateTime;
import com.google.gdata.data.calendar.CalendarEventEntry;
import com.google.gdata.util.AuthenticationException;
import com.google.gdata.util.ServiceException;

public class ScheduleBoard2GoogleCalender {

    public static void main(String[] args) throws Exception {
        // カレンダーID
        String calId = "XXXX";
        String targetCsvFile = "C:\\PROGRA~1\\SCHEDU~1\\out.csv";
        // スケジュールを抽出したいユーザー名
        String targetUser = "Pnetasa";
        GoogleCalenderUtil gCal = new GoogleCalenderUtil();
        gCal.setCalId(calId);
        // スケジュールの抽出
        Runtime.getRuntime().exec("cmd.exe /k start C:\\PROGRA~1\\SCHEDU~1\\makecsv.cmd\"");
        // ?今より先の予定を取得する。
        List<CalendarEventEntry> feeds = gCal.selectCalendarEventEntry("", new Date());
        for (CalendarEventEntry entry : feeds) {
            System.out.println(entry.getTitle().getPlainText() + "を削除します。");
            // ?削除
            gCal.deleteCalendarEventEntry(entry);
        }
        // ?データ投入
        makeData(targetCsvFile, targetUser, gCal);
    }

    private static void makeData(String targetCsvFile, String targetUser, GoogleCalenderUtil gCal) throws Exception {
        BufferedReader br = null;
        try {
            br = new BufferedReader(new FileReader(new File(targetCsvFile)));
            String line = br.readLine();
            while (line != null) {
                String[] wordArray = line.split(",");
                // ユーザーの判定
                if (targetUser.equals(wordArray[0])) {
                    String title = wordArray[4];
                    String startDate = wordArray[1] + " " + wordArray[2];
                    String endDate = wordArray[1] + " " + wordArray[3];
                    DateTime start = gCal.convDateTime(startDate);
                    if (0 < start.compareTo(new Date())) {
                        // 未来のみ登録する。過去分反映しない。
                        System.out.println("Title:[" + title + "] start [" + startDate + "] end [" + endDate + "]");
                        CalendarEventEntry event = gCal.makeCalendarEventEntry(title, startDate, endDate);
                        gCal.insertCalenderEventEntry(event);
                    }
                }
                line = br.readLine();
            }
        } finally {
            if (br != null) {
                br.close();
            }
        }
    }
}