pslaboが試したことの記録

はてなダイヤリーからはてなブログに引っ越してきました

この日記は現在実行中の減量記録を含む個人的なメモとして始めましたが、最近はコンピュータやガジェット、ハック、セキュリティネタのほうがメインになっております。

はてなダイヤリー時代はカテゴリ分けが適当だったのですが、これはそのうち直します。


Google Calendar のスケジュールを iCal からインポートしたり、Apps Script で弄る実験をしていたらハマった話。

desknet's のスケジュールを CSV エクスポートしたものを iCal 形式に変換して Google Calendar に登録するテストをやっていてハマりました。

もともとは CSV 形式のままでフォーマットをすこし弄って登録、というのを試していたのですが、description に複数行の入力がなされている個所や " を含むデータのハンドリングで失敗するなどして、全件登録できず。

そこで iCal 形式への変換を試みるも、timezone の調整ミス等で手こずり、思った通りに登録が進まない。

かといって、登録ミスのゴミデータが大量に発生している状況はそれはそれで困るので、Google Apps Script で全消しして登録する、という操作を試みるが、iCal で一度登録したデータは消したのちも再登録が上手くできない。

では、ということで別のカレンダーを作って iCal インポートし、そこから Google Apps Script で全件コピーする処理を作ってみたら...

「編集できる予定の数の上限に達しました。ご使用のアカウントの確認が済むまで、数時間お待ちください。ご不便をおかけします。」

という残念なメッセージが...。

やはりこういう実験はテスト用のアカウントでやらないとダメですねえ。

とりあえずできあがった iCal 変換用のスクリプトはこんなカンジ。タブ区切りテキストからの変換を前提としています。Excel 等に食わせるのが簡単ですね。

#!/usr/bin/awk -f
#
# desknets のスケジュールデータを
# Google Calendar 向け iCal に変換するスクリプト
#
# ※このスクリプトは desknets の生データを処理できません。
# 次の2段階の前処理を行ってください。
#
# 1. csv 形式から tsv 形式に変換してください。Excel の使用を推奨します。
# 2. 文字コードを UTF-8 に変換してください。nkf -w でも OK です。
#
#

BEGIN {
        FS="\t"

        print "BEGIN:VCALENDAR"
        print "PRODID:-//Google Inc//Google Calendar 70.9054//EN"
        print "VERSION:2.0"
        print "CALSCALE:GREGORIAN"
        print "METHOD:PUBLISH"
        print "X-WR-TIMEZONE:Asia/Tokyo"
        print "X-WR-CALDESC:"
}

{
        sub( "\"" ,"\\\"",$0)
}

NR > 2 {
        if ( $8 == "--" ) {
                subject = $9
        } else if ( $8 != $9 ) {
                subject = $8" "$9
        } else {
                subject = $8
        }

        if ( $10 == "--" ) {
                location = $11
        } else if ( $10 != $11 ) {
                location = $10" "$11
        } else {
                location = $10
        }

        split($4,datetmp,"/")
        split($5,timetmp,"/")

        dtstart = strftime( "%Y%m%dT%H%M%SZ", mktime( sprintf("%04d %02d %02d %02d %02d %02d",
                        datetmp[1],datetmp[2],datetmp[3],
                        timetmp[1],timetmp[2],timetmp[3] )) - ( 9 * 60 * 60 ) )


        split($6,datetmp,"/")
        split($7,timetmp,"/")
        dtend = strftime( "%Y%m%dT%H%M%SZ", mktime( sprintf("%04d %02d %02d %02d %02d %02d",
                        datetmp[1],datetmp[2],datetmp[3],
                        timetmp[1],timetmp[2],timetmp[3] )) - ( 9 * 60 * 60 ) )
        description=$12

        printf "BEGIN:VEVENT\n"
        printf "%s:%s\n", "DTSTART", dtstart
        printf "%s:%s\n", "DTEND",       dtend
        printf "%s:%s\n", "SUMMARY", subject
        printf "%s:%s\n", "DESCRIPTION", description
        printf "%s:%s\n", "LOCATION", location
        printf "END:VEVENT\n"
}

END {
        print "END:VCALENDAR"
}