カレンダーに使われるiCalendar形式について part2

この記事は[part1](https://qiita.com/TomOse/items/31b5fb4782f06d19af79)の続きです。
まだご覧になってない方は先にご覧いただくとわかりやすいかと思います。

さて、part1では`icsファイル`の最低限の機能について説明しました。
今回はアラーム機能についてまとめたいと思います。

# アラームの例
Googleカレンダーで以下の様な適当な予定を追加してみます。
アラームの部分は赤い枠で囲った部分になります。

![スクリーンショット 2019-11-23 22.07.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315273/bd303ea1-0d2d-2348-7a4b-7d2275a88e0e.png)

この予定を`icsファイル`で開くと以下の様になります。

```
BEGIN:VCALENDAR
PRODID:-//Google Inc//Google Calendar 70.9054//EN
VERSION:2.0
CALSCALE:GREGORIAN
BEGIN:VEVENT
DTSTART;VALUE=DATE:20191125
DTEND;VALUE=DATE:20191126
DTSTAMP:20191123T131055Z
CREATED:20191123T131041Z
DESCRIPTION:
LAST-MODIFIED:20191123T131041Z
LOCATION:
SEQUENCE:0
STATUS:CONFIRMED
SUMMARY:予定
TRANSP:TRANSPARENT
BEGIN:VALARM
ACTION:DISPLAY
DESCRIPTION:This is an event reminder
TRIGGER:-P0DT15H0M0S
END:VALARM
BEGIN:VALARM
ACTION:DISPLAY
DESCRIPTION:This is an event reminder
TRIGGER:-P0DT3H0M0S
END:VALARM
END:VEVENT
END:VCALENDAR
```

part1をご覧になった方はなんとなく雰囲気がわかると思います。
今回のメインとなるアラームの部分は、VEVENT中の下側にある以下の様な記述です。

```
BEGIN:VALARM
ACTION:DISPLAY
DESCRIPTION:This is an event reminder
TRIGGER:-P0DT15H0M0S
END:VALARM
BEGIN:VALARM
ACTION:DISPLAY
DESCRIPTION:This is an event reminder
TRIGGER:-P0DT3H0M0S
END:VALARM
```

見やすい様にインデントをします(実際にはこれでは読み込むことができません)

```
BEGIN:VALARM
  ACTION:DISPLAY
  DESCRIPTION:This is an event reminder
  TRIGGER:-P0DT15H0M0S
END:VALARM

BEGIN:VALARM
  ACTION:DISPLAY
  DESCRIPTION:This is an event reminder
  TRIGGER:-P0DT3H0M0S
END:VALARM
```

この`VALARM`に囲まれた部分がアラームについて定義している部分です。
ここでは`VALARM`に囲まれた部分が二つあります。
先ほどの写真を見てもらうと、通知を二回する様にしているので、`VALARM`も二つになっています。
複数のアラームを設定したい時にはその数だけ、付け足せば良いということです。

さて、それでは`VALARM`の内容についてみていきます。

# VALARMについて
先ほどのコードを見ると、以下の三つのプロパティがあることがわかります。

1. ACTION
2. DESCRIPTION
3. TRIGGER

このうち、`ACTION`と`TRIGGER`は必須項目です。
`DESCRIPTION`を含め、その他のいくつかのプロパティは通知の方法によって要不要が変わり、通知の方法は`ACTION`によって定義されます。

# ACTIONプロパティについて
ACTIONは先述の様に通知の形式を定義しています。
ACTIONで定義できる通知の方法には、`AUDIO`、`DISPLAY`、`EMAIL`、`PROCEDURE`があります。
それぞれで使用可能なプロパティは以下の様になっています。

- AUDIO(音で通知をする機能に使われる)
    - ATTACH(任意) ←再生するサウンドの種類を選択
- DISPLAY(通知を表示する機能に使われる)
    - DESCRIPTION(必須) ←通知に表示するメッセージ
- EMAIL(メールで通知をする機能に使われる)
    - DESCRIPTION(必須) ←メール本文
    - SUMMARY(必須) ←メールタイトル
    - ATTENDEE(必須) ←出席者
    - ATTACH(任意)
- PROCEDURE(よくわかりませんでした)
    - ATTACH(必須)

また、全てに共通するプロパティに`DURATION`と`REPEAT`があり、文字通り、通知の繰り返しとその間隔を定義します。
この二つは任意のプロパティですが、一方を記述すると他方も記述しなくてはなりません。

おそらくこれらの機能は、使用するカレンダーアプリに依存する機能だと思うので対応状況を調べてみる必要がありそうです(調べきれず、すみません:bow_tone1:)

# TRIGGERプロパティについて
さて、もう一つの必須プロパティである`TRIGGER`について説明します。
このプロパティは通知をするタイミングを定義しており、プロパティの値として`通知する日付の絶対値を指定する`か、`イベントとの相対値を入力する`かの二通りがあります。

## 通知する日付の絶対値を指定する方法
まず、`通知する日付の絶対値を指定する`やり方です。
これは[part1](https://qiita.com/TomOse/items/31b5fb4782f06d19af79)で`DTSTART`、`DTEND`で説明した時の表記と同じです。
すなわち、19970714T170000Z(=「UTCで1997年7月14日17時00分00秒」)のように指定していきます。

プロパティにセットするには、`VALUE`を用いて以下の様に記述します。

```
TRIGGER;VALUE=DATE-TIME:19970714T170000Z
```


## イベントとの相対値を入力する方法
さて、次に`イベントとの相対値を入力する`やり方ですが、例えばこの様に指定します。

```
TRIGGER:-P2DT2H0M0S
```
これは、イベント開始時間から、2日と2時間前の日時を表しています。

書き方の決まりは(おそらく)以下の様になっています。

* D(日)、H(時間)、M(分)、S(秒)といった時間を表す記号を用いる
* (数値)(記号)の順に指定する(例；2D → 2日)
* 先頭に`-P`をつけると、より前の日時を指定、`P`をつけると、より後の日時を指定する
* 日付と時間の間には`T`を入れる

いくつか例を挙げてみます

```
TRIGGER:-P1D10H ←イベント開始の1日と10時間前
TRIGGER:-P1D ←イベント開始の1日前
TRIGGER:PT2H ←イベント開始の2時間後
```

なお、イベント終了時刻からの相対値を入力したい場合は以下の様に記述します。
(ENDをSTARTにすることで開始時刻にできますが、それなら先述の表記の方が楽だと思います)

```
TRIGGER;RELATED=END:-P1D ←イベント終了時刻の1日前
```

#終わりに
今回は仕様書を読んでも(英文が)よくわからないところが多かったので、説明に誤りや抜けがあると思います。
ですが、とりあえず記述した機能については動作確認(Macの標準カレンダー)もしているのでおそらく間違い無いと思います。

補足や修正があればコメントで教えていただけると嬉しいです:sweat:

#参考にした記事
[RFC-2445](http://www.asahi-net.or.jp/~CI5M-NMR/iCal/rfc2445.txt)