Twitter Facebook github

iCal形式でインポートした予定をまとめて削除する

やらかしました・・・。

foursquareのチェックインをカレンダーに表示させ、ライフログとして活用しているのですが、新しいMacのセットアップ中に数千件のチェックインデータが含まれているiCalendar形式のカレンダーファイルを、普段使いのメインカレンダーにインポートしてしまいました。

MacのカレンダーアプリにはFantasticalを使っていて、Googleアカウントと同期させています。インポート中、マズイかも・・・?と思った時には既に遅く、既に同期されてしまった後でした。。
もちろんインポートをUndoするような気の利いた機能はないので、なんとか元に戻す方法を考えてみます。

こんなひとが対象

  • iCalendar形式(.icsファイル)で取り込んでしまったイベントをまとめて削除したい
  • Googleカレンダーで取り込んだ or Googleカレンダーと同期している

iCalendarの仕様を確認してみる

事が起きた後にicsファイルをテキストエディタで開いてみました。何事もない普通のテキストファイルのようです。
Googleに頼ってみると、RFC 5545 でしっかりとフォーマットが定められていました。

https://tools.ietf.org/html/rfc5545

BEGIN:VEVENT から END:VEVENT までが1件のイベントを表すようです。

削除みたいな手続きはない・・・キャンセルは?

RFC内を remove や delete みたいな関連語で調べてみるも、どうやらイベントの登録、招待、応答待ち・・・のような設定は見つかるものの、削除するようなアクションはなさそうな様子。。
目に留まったのは Statusセクション の CANCELLED の値。
イベントの主催者がイベントのキャンセルを通知するのに使うらしいこのステータス、これを書き込めば消えそうな気がします。

数千件のデータをいきなり取り込むと時間がかかる上に、万が一被害を拡大させると大変なので、テスト用にイベントが1件だけのiCalファイルを作ります。
もちろんこのイベントデータは、誤って取り込んでしまったiCalファイルの中からコピーしてきます。

このファイルを適当な名前でicsファイルを作り、間違ってインポートしてしまったGoogleカレンダーに読み込んでみると、狙い通りその予定が消えてくれました!

全部のイベントをまとめて削除

間違えてインポートしたicsファイルの各イベントに STATUS:CANCELLED を追加します。
MacのCotEditorでは使えないようだったので、シェルからsedでやってみます。

インポートしてしまった元のiCalファイルを target.ics として、出力ファイルを output.ics としました。
Mac標準のBSD sedでしかテストしていませんが、GNUでも多分動きます。

もちろんテキストエディタの機能で改行を含む置換ができればそれを使ってもOKです。

出力されたファイルを確認して、正しく追記されているのを確認したら、テストの際と同様にGoogleカレンダーから取り込みます。

インポートエラーになっても正常に処理されている

件数が多すぎたり、既に削除されたイベントを削除しようとすると下の画像のようなエラーが起きるようです。
%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88_2016-11-29_19_27_28_png

この場合でも、存在するイベントは削除されている(少なくとも私の環境では)はずなので、1度カレンダーをチェックしてみてください。
うまく削除されていれば、カレンダーのクライアントアプリで同期するだけです!

Fantasticalでは処理できない!

今回、間違えたiCalをインポートしたのはFantasticalのアプリ上ですが、上記の STATUS:CANCELLED なiCalをFantasticalで読み込んでも削除はできません。
Fantasticalでは、キャンセル済みという予定ステータスが存在するようで、実行しても予定に取り消し線が引かれたまま残ってしまいます。

foursquareのチェックインを表示する方法

余談になりますが、元々しようと思っていたセットアップの、foursquareのチェックイン履歴をカレンダーに表示する正しい手順はこんな感じです。

  1. foursquareのfeedsページでログイン状態の場合、下部にあるICS形式のURLをコピー
  2. Fantasticalの場合は、環境設定→カレンダーから、追加したいカレンダーセットを選び、カレンダーリストの左下「+」ボタン→「新規カレンダー照会…」をクリック
    (標準カレンダーアプリの場合、ファイル→「新規カレンダー照会…」をクリック)
  3. コピーしておいたURLを貼り付けて次に進む
    4. カレンダー名や更新間隔などを好みの時間に変更して追加

仕組みとしてはfoursquareのサーバー上にあるiCalファイルを定期的にフェッチして更新するタイプなので、プッシュされるものと違い実際にカレンダー上に表示されるまでの遅延があります。

所感

最近、生まれてはじめての健康診断に頑張って行きました。結果は視力以外なにも問題なくて、検査結果がおかしいんじゃないかと目を疑うことに・・・。でもこれは嘘だと信じてやまないので、また余裕ができたら人間ドックでも行こうと思います。

コメントを残す

メールアドレスが公開されることはありません。