69
iCalの「トリック」定期イベントを作成する

iCalのイベントスケジュール設定オプションは比較的強力で、日次、週次、月次、さらには年次など、様々なスケジュールで発生するイベントを設定できます。しかし、一見簡単そうに思える機能がiCalでは一つだけあります。それは、毎月の最終日、あるいは複数の日付と最終日を組み合わせたイベントを作成することです。例えば、給与明細を考えてみましょう。多くの企業は15日と月末に給与を支払います。iCalで請求書の支払日や収入の受け取り日を管理している場合、これは少々厄介な問題になります。しかし、少しマニアックなことをしてもいいなら(だって今日は金曜日ですからね!)、解決策があります…

まず最初に、新しいイベントを作成し、できるだけ希望に近いスケジュールを設定します。例えば、上記の「15日と最終日」のイベントを作成するには、毎月この2日間をカスタム繰り返し設定します。イベントを作成し、イベント情報ウィンドウの「繰り返し」ポップアップメニューから「カスタム」を選択します。「カスタム」ダイアログで、「頻度」ポップアップを「毎月」に設定し、1日と15日をクリックします(下図)。

「OK」をクリックすると、繰り返しイベントがカレンダーに表示されます。いつものiCalの煩雑さを省いて見やすくするために、新しいカレンダーにダミーイベントを追加してみました。

詳細を確認するには少し小さいかもしれませんが、オレンジ色のイベントが12月1日と15日に開催されることがわかります。イベントの設定が完了したら、イベントを希望どおりに動作するように修正しましょう。ただし、他の操作を行う前に、iCalを終了してください。

ここからが少し面倒な作業になります。iCalデータファイルのどこにイベントが保存されているかを正確に把握する必要があります。iCalはカレンダーをユーザーの「ライブラリ:アプリケーションサポート:iCal:ソース」フォルダに保存します。このフォルダ内には、iCalに保存されているカレンダーごとに、複雑な名前のフォルダがいくつも存在します。

それぞれのフォルダ内には、corestorage.ics ファイルを含む複数のファイルがあります。これが、変更対象となるカレンダーファイルです。では、どのファイルを開く必要があるのか​​、どうすればわかるのでしょうか?作業を簡単にするために試せることがいくつかあります。まず、Finder で「ソース」フォルダを「変更日」で並べ替え、一番上のカレンダーフォルダを開きます。iCal イベントで他に何も操作しておらず、新しいイベントを追加した後すぐに iCal を終了した場合、これが探しているフォルダのはずです。下記のように開いた後、正しいフォルダではないことがわかった場合は、次の 2 つのうちのいずれかを実行できます。カレンダーの数が少ない場合は、試行錯誤するのが最も早い解決策かもしれません。

フォルダーが多数ある場合は、ターミナルに切り替えて次の 2 つのコマンドを実行します。

	$ cd ~/Library/Application Support/iCal/Sources $ find . -name corestorag* -ls | sort -M -k8,10	

これにより、次のような一致がいくつか表示されます。

	... 7289 11 月 8 日 04:56 ./13A3E82C-8F1C-43C9-A66D-6A42C7E81695.calendar/corestorage.ics ... 8813 11 月 8 日 04:56 ./DC7E1EC1-CEF3-4DCC-B02F-060C95C6C641.calendar/corestorage.ics ... 1037 11 月 8 日 04:56 ./85D2678B-4163-4BB6-8454-A85C957E5B34.calendar/corestorage.ics ... ... 11 月 11 日9 09:32 ./205220CB-0598-4C04-B9E7-54D4D3AC4126.calendar/corestorage.ics	

注: 出力の各行の左側の大部分は、ここに収まるように削除しました。重要な部分は右側にあり、ファイルの変更日時とファイルが格納されているフォルダが含まれています。実行したコマンドは出力を日付順に並べ替え、最新のファイルがリストの一番下に表示されるようにしています。格納されているフォルダ名をメモし、そのフォルダに移動します(ターミナルまたはFinderで)。BBEditやTextEditなど、お好みのテキストエディタを使用して、そのフォルダ内のcorestorage.icsファイルを開きます vipico エディタの検索機能を使用して、作成したイベント名を検索すると、次のような結果が表示されます。

	BEGIN:VCALENDAR CALSCALE:GREGORIAN PRODID:-//Apple Computer, Inc//iCal 2.0//EN VERSION:2.0 BEGIN:VEVENT DTSTART;VALUE=DATE:20051101 DTEND;VALUE=DATE:20051102 Summary:Pay Day! UID:EC10040F-7CCA-4DE0-8FB7-3EB9C552FD5A RRULE:FREQ=MONTHLY;INTERVAL=1;BYMONTHDAY=1,15 DTSTAMP:20051109T172736Z SEQUENCE:5 END:VEVENT END:VCALENDAR	

このカレンダーに複数のイベントがある場合、上記のセクションは、カレンダー上のイベントごとに1つずつ、他の類似セクションの中に表示されます。イベント名が見つからない場合は、corestorage.ics ファイルが間違っていることを意味します。そのファイルを閉じて、他のファイルを試してください。

ファイルの関連セクションを見つけたら、必要なのは1行だけです。 変数RRULE を変更して を変更します。つまり、 を に BYMONTHDAY 変更します 。1-1

ルール:頻度=月次;間隔=1;月日別=-1,15

この簡単な変更を加えたら、ファイルを保存してエディタを終了してください。テストする前に、一体何をしたのか気になるかもしれません。つまり、iCalに月の「1日から最終日」と15日にイベントを繰り返すように指示したということです。

iCal を騙して本来の動作をさせてしまったと思うかもしれませんが、Macosxhints の読者 Tom Robinson 氏によると、これは実は Apple が .ics ファイルに使用している「Internet Calendaring and Scheduling Core Object Specificaion」(3回くらい素早く言ってみてください!)の一部だそうです。この仕様では、 BYMONTHDAY 変数について次のように説明されています。

BYMONTHDAYルール部分は、カンマ文字(ASCII 10進数44)で区切られた月の日付のリストを指定します。有効な値は1~31または-31~-1です。例えば、-10は月の10日から最終日までを表します。

そのため、月の最終日に縛られることはなく、 -5 月末の 5 日前などに使用することも可能です。

専門用語はここまでにして、うまくいったか確認してみましょう!iCalを起動すると、イベントが毎月15日と最終日に設定されているはずです。ここで12月を表示すると、11月30日、12月15日、12月31日の3つのイベントが表示されています。

このトリックの唯一の(ごく小さな)不満点は、情報ウィンドウの「繰り返し」の値が毎月15日と表示されることです。しかし、これは特に影響はなく、アラームもすべて正常に動作しています。いつかAppleがiCal内で直接「終了前」のスケジュール設定を許可してくれることを期待しています。しかし、それまではこれで我慢するしかありません。