プログラミングで世界を変える

ゲームプログラミングと技術のこと

Googleカレンダーの過去の予定を全て非公開にする

TL;DR

  1. Export hoge.ics
  2. sed -e 's/TRANSPARENT/OPAQUE/' hoge.ics
  3. sed -e 's/^CLASS:.*?$\n//' hoge.ics
  4. sed -e 's/(^UID:.*?$)/$1\nCLASS:PUBLIC/' hoge.ics
  5. Import hoge.ics

はじめに

f:id:splas_boomerang:20180817223521p:plain

誰かと予定を調整する時にいちいち空いてる日時のホワイトリストを作らなくても済むように、共有Googleカレンダーを作りたいと思いました。

そこで、折角なのでこの機会に自分の予定をすべてオープンにすることにしました。 Googleカレンダーには全体の共有範囲を、「非公開」「時間のみ公開」「全て公開」というように設定することが出来るので、「全て公開」に変更しようと思いました。

support.google.com

ここで一つ問題がありました。 今後登録する予定については公開前提ということを踏まえた上で登録できるし、もし差支えがある場合は個別に非公開に設定すれば良いです。しかし今までの予定は公開することを踏まえずに登録してきたものばかりです。そう大したことが書いてある訳ではないですが、公開することには抵抗があり、とはいえ削除してしまうのも可逆性の観点から微妙です。

そこで掲題のようにGoogleカレンダーの過去の予定を全て非公開設定に書き換えることにしました。

解説

手順としてはTL;DRの通りですが、もう少しかみ砕いて説明していきます。 参考にする場合は自己責任でお願いします。(バックアップがあれば何とかなるはず)

まずGoogleカレンダーを開きます。 Google カレンダー

設定から登録されているカレンダーをすべてエクスポートします。 落ちてくるzipファイルに登録されているすべてのカレンダーが.ica形式で含まれていると思います。

次に、中身を置換していきます。 xmlとかじゃないので読みづらいのですが、英語なので全然読めます。

f:id:splas_boomerang:20180817222856p:plain

(こんな感じ。芳ばしい感じのキャプションがついてる…。)

.icaの構造についてはこのページが参考になりました。 hacknote.jp

先頭にヘッダー情報があり、以降は数行単位で個別の予定が含まれています。 BEGIN:VEVENTEND:VEVENTで挟まれたブロックが一つの予定であることが分かりました。

ここで状態の整理をします。

Googleカレンダーでは2つのパラメータがあります。

TRANSP CLASS 外からの見え方
予定あり(OPAQUE) 公開(PUBLIC) 全て表示
予定あり(OPAQUE) 非公開(PRIVATE) 時間のみ表示
予定なし(TRANSPARENT) 公開(PUBLIC) 全て表示
予定なし(TRANSPARENT) 非公開(PRIVATE) 非表示

CLASSは設定されていないこともあり、その場合は全体の公開設定に準拠します。

今回の要件でいうと、過去の予定は全て「予定あり」かつ「非公開」にしたいと思います。

正規表現を使って一気に書き換えていきます。

全ての「予定なし」を「予定あり」に書き換えます。

sed -e 's/TRANSPARENT/OPAQUE/' hoge.ics

全ての「公開」もしくは「未設定」を「非公開」に書き換えます。 状態の判別をすると面倒なので、まずは全てのCLASSを削除し、その後それっぽい位置に「非公開」を設定していきました。順番が関係あるのか分からなかったのですが、特に問題にはならなかったです。

sed -e 's/^CLASS:.*?$\n//' hoge.ics
sed -e 's/(^UID:.*?$)/$1\nCLASS:PUBLIC/' hoge.ics

ちなみにTL;DRではsedコマンドを書きましたが、実際はSublime Text 3でプレビューしながら慎重にやっています。書き換えた後にdiffツール(https://www.diffchecker.com/)で余計な変更していないか確認までやりました。

最後に、書き換えた.icaをインポートしていきます。 予定毎にUIDが振られているので重複は上書きしてくれるはずなのですが、なぜかメインカレンダーの場合のみ以下のエラーが表示されました。

指定されたカレンダーにアクセスできないため、予定をアップロードできませんでした。

仕方ないので一度メインカレンダーを削除します。メインカレンダーなので実際には初期化のような挙動です。綺麗な状態になったので、再度インポートすると今度は全件インポートに成功しました。

ナカジのスケジュール

ということで僕のスケジュールです。ぜひ活用してください(?)