カレンダー登録方法について比較してみた(ICS/Google/Outlook/Yahoo)

もっぱらGoogleカレンダー派な私。
仕事の予定からゴミの日まで全ての予定を管理しています。
そんな私にとってイベントページなどでたまに見かける「カレンダーに登録」機能の存在はとても有難いのです。
今回はそんな「カレンダーに登録」機能について、推しカレ('推しカレンダー'の意)であるGoogleカレンダー以外の手段も含めて調べてみました。

# カレンダー登録方法のあれこれ
カレンダーの登録方法としては
- iCalendarデータ形式(ICSファイル)
- URLリンク

によるものの2種類があります。

以下に特徴やメリット・デメリットについてまとめてみました。
(メリット・デメリットについては個人の主観が含まれます。)

## iCalendarデータ形式(ICS)
- 予定の件名や日時、場所などの情報を収めたファイルをiCalendarファイルあるいはICSファイル(以下、ICSファイル)という
    - ICSファイルの実態は、予定の件名や日時などが決められたルールで書かれたテキストファイルで、その拡張子を``.ics``としたもの
    - 文字コードはUTF-8
- カレンダーアプリやGoogleカレンダー等のWebサービスにICSファイルをインポートすることでスケジュールが登録できたり、逆にICSファイルにエクスポートして他者と共有することが可能
- 上述インポート/エクスポートに対応しているアプリ・サービスが多数あり、汎用性が高い
- ファイルのやりとりが必要であり、スマホユーザーやICSファイルの扱いに不慣れなユーザーにとっては利用しづらい(主にビジネスユーザーの利用に向いていると思われる)

## URLリンク
- Googleカレンダー等のURLに予定の件名や日時、場所などの情報をURLパラメータとして含めアクセスすることで、当該カレンダーの登録画面に必要事項が入力された状態で表示される(つまりあとは登録するだけの状態)
- ファイルのやりとりが要らずリンクを選択すればよいだけなので、スマホユーザーやライトユーザーでも利用しやすい(...はずなのですが、Outlookはスマホでは上手く動きませんでした(後述))
- テキストなのでQRコードで印刷するなど利用用途は多数ありそう
- URLリンクに対応したサービス(Google,Outlookなど)のユーザーでなければ利用できない

# 各種仕様
## iCalendarデータ形式(ICS)
以下のテキストファイルを作成し、上述の通り拡張子を``.ics``にして保存します。

```
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//ktl/s_kosaka//calendar v1.0//JP
BEGIN:VEVENT
DTSTART;TZID=Asia/Tokyo:20220606T192000
DTEND;TZID=Asia/Tokyo:20220606T212000
SUMMARY:キリンチャレンジカップ2022　SAMURAI BLUE(日本代表) 対 ブラジル代表
DESCRIPTION:日本テレビ系にて全国生中継
LOCATION:国立競技場
END:VEVENT
END:VCALENDAR
```
こんな感じで。(Mac)
![スクリーンショット 2022-05-10 19.52.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123999/8bdf06e8-e418-7bee-ac35-4ad14655205a.png)
例えばこのアイコンをダブルクリックすると、以下のように(有無を言わさず)登録されます。
![ics登録.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123999/ea163fde-865e-2777-efed-2c5d8b3b9674.png)
ガンバレ日本代表。
<br>
上記例の各プロパティ等の内容については以下のとおりです。
![ics仕様.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123999/300b80a2-b362-6835-fc72-f2dd26dfd98c.png)
上記の例以外にも様々なプロパティが用意されています。
詳しくは以下を参考にしてください。
[RFC 5545 - Internet Calendaring and Scheduling Core Object Specification (iCalendar)](https://datatracker.ietf.org/doc/html/rfc5545)
[RFC 5545 - Internet Calendaring and Scheduling Core Object Specification (iCalendar) 日本語訳](https://tex2e.github.io/rfc-translater/html/rfc5545.html)
[カレンダーに使われるiCalendar形式について part1 - Qiita](https://qiita.com/TomOse/items/31b5fb4782f06d19af79)

例では触れていませんが、``RRULE``プロパティで「毎週日曜日」「毎月第四土曜日」といったような繰り返しの設定ができるほか、工夫することで以下のように「毎月月末」といった設定も可能です。
[iCaldendar RFC-5545: 毎月の末日をRRULEで求める - Qiita](https://qiita.com/suin/items/64bd73116d504d78b67c)

なお、ICSファイルの仕様を調べると``RFC 2445``と``RFC 5545``の2種類の仕様を見かけるかと思います。
2022/5/10現在の最新の仕様は``RFC 5545``となり``RFC 2445``は廃止されています。
``RFC 5545``と``RFC 2445``の違いは以下(``RFC 5545``の仕様書の付録)をご覧いただきたいのですが、大きくは変更されていない印象です。ですので、``RFC 2445``の仕様を基にした記事等であっても仕様の違いに少し気をつけておけば大いに参考になるかと思います。
[RFC 5545 - Internet Calendaring and Scheduling Core Object Specification (iCalendar)](https://datatracker.ietf.org/doc/html/rfc5545#appendix-A)

## URLリンク
### (前提知識)URLパラメータとは?
この後ご紹介するURLリンクはいずれもURLパラメータを利用した機能になります。

``パラメータ名``と``パラメータ値``のセットを展開したページに渡すことで様々な動的な処理に利用できます。(いわずもがな、ページ側でパラメータに対応した処理を実装しておく必要があります。対応していないパラメータが渡された場合はスルーされます。)

URLパラメータは、URLの後ろに``?``(半角のクエスチョンマーク)を付け、その後に``[パラメータ名]=[パラメータ値]``と記述します。
渡したいパラメータが複数ある場合は、``[パラメータ名]=[パラメータ値]``と``[パラメータ名]=[パラメータ値]``の間に``&``（半角アンパサンド）で区切ることで複数の指定が可能です。
なお、複数のパラメータを記述する際、その順序は処理には影響しません。

### Googleカレンダー
上述のURLパラメータを含めたURLリンクを作成します。
例えば以下のようなもの。

[Googleカレンダーに登録](https://www.google.com/calendar/render?action=TEMPLATE&text=%E3%82%AD%E3%83%AA%E3%83%B3%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8%E3%82%AB%E3%83%83%E3%83%972022%E3%80%80SAMURAI%20BLUE(%E6%97%A5%E6%9C%AC%E4%BB%A3%E8%A1%A8)%20%E5%AF%BE%20%E3%83%96%E3%83%A9%E3%82%B8%E3%83%AB%E4%BB%A3%E8%A1%A8&dates=20220606T192000/20220606T212000Z&location=%E5%9B%BD%E7%AB%8B%E7%AB%B6%E6%8A%80%E5%A0%B4&details=%E6%97%A5%E6%9C%AC%E3%83%86%E3%83%AC%E3%83%93%E7%B3%BB%E3%81%AB%E3%81%A6%E5%85%A8%E5%9B%BD%E7%94%9F%E4%B8%AD%E7%B6%99&add=test@test.com)

```
https://www.google.com/calendar/render?action=TEMPLATE&text=キリンチャレンジカップ2022　SAMURAI BLUE(日本代表) 対 ブラジル代表&dates=20220606T192000/20220606T212000Z&location=国立競技場&details=日本テレビ系にて全国生中継&add=test@test.com
```

URLパラメータを除いたURL部分(固定部分)は以下のとおりです。
このURLにアクセスすると通常のカレンダー画面が開きます。([こんな感じ](https://www.google.com/calendar/render))
```
https://www.google.com/calendar/render
```

後述しますが、上記URLに必須のパラメータである``?action=TEMPLATE``のみを加えることで全ての項目が空欄の新規追加画面が表示されます。([こんな感じ](https://www.google.com/calendar/render?action=TEMPLATE))
```
https://www.google.com/calendar/render?action=TEMPLATE
```

蛇足ですが、スマートフォンの場合は上記URLをブラウザのURLバーに直接貼り付けるとブラウザ上にPC版のGoogleカレンダーの画面が表示され、HTMLで記述したリンク(``<a href=" https://www.google.com/calendar/render">``)からアクセスした場合はGoogleカレンダーアプリがインストールされている場合はアプリに遷移するようです。


#### 主なURLパラメータ
|パラメーター|必須/オプション|説明|
|-|-|-|
| action | 必須 |action=TEMPLATEと書く(決まりごと)|
| text | 必須 | 件名 |
| dates | オプション |予定の日時<br>開始と終了を指定できる。なお、時間を省略した場合は終日扱いになる。<br>時間指定の場合は、時間の最後には大文字の「Z」を付ける。<br>例) dates=20220606T192000/20220606T212000(2022/6/6 19:20〜2022/6/6 21:20)|
| location | オプション | 場所 |
| details | オプション | 内容 |
| add | オプション | 招待者のメールアドレス |
| recur | オプション | 繰り返しの設定 ※後述 |

#### recur(繰り返し)の使い方
結論から言うと以下のように書きます。
```
recur=RRULE:FREQ=DAILY;COUNT=10
```
上記の書き方で``毎日10回繰り返す``という登録内容となります。

この``RRULE:FREQ=DAILY;COUNT=10``の部分ですが、これは上述のICSファイルの仕様(RFC 5545)で繰り返しの設定に使う``RRULE``プロパティの記述方法に準じたものです。
以下仕様書に様々な``RRULE``の書き方が紹介されています。
[iCalendar spec: 4.8.5.4 Recurrence Rule](https://www.kanzaki.com/docs/ical/rrule.html)
それらの``RRULE:〜``の手前に``recur=``を置いた文字列(``recur=RRULE:〜``)をURLパラメータに加えます。


#### bodyの改行
内容欄での改行は、検証したところ``<br>``か``%0D%0A``で対応できそうです。
``\n``は効きませんでした。

<br>

その他にも紹介していないパラメータがあるので詳しくは[こちら](https://github.com/InteractionDesignFoundation/add-event-to-calendar-docs/blob/main/services/google.md)などをご確認ください。

#### 参考 (Googleカレンダー関連)
[add-event-to-calendar-docs | GitHub](https://github.com/InteractionDesignFoundation/add-event-to-calendar-docs/blob/main/services/google.md)
[Googleカレンダーの予定を追加するURLリンク | Qiita](https://qiita.com/yuta_sawamura/items/738732565e2cfd11fb23)
[How to Send Google and Outlook Calendar Invite Links in Email Templates | Douglas C. Ayers](https://douglascayers.com/2019/06/22/how-to-send-google-and-outlook-calendar-invite-links-in-email-templates/)
[Googleカレンダーに追加するURLリンクを自動生成してくれるツール | Typewriter](https://webasterisk.sakura.ne.jp/googlecalendar_eventbuttonsgenerator/)
↑サクッとURLが作成できて便利でした。


### Outlook
Googleカレンダー同様、URLパラメータを含めたURLリンクを作成します。
ただし、同じ「Outlook」でも、Microsoft Office 365 カレンダー と、Outlook カレンダー の2つのサービスがあり、それぞれURLが異なるので注意が必要です。

登録URLは以下のとおり。

[Microsoft Office 365 カレンダー に登録](https://outlook.office.com/calendar/action/compose?subject=%E3%82%AD%E3%83%AA%E3%83%B3%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8%E3%82%AB%E3%83%83%E3%83%972022%E3%80%80SAMURAI+BLUE%28%E6%97%A5%E6%9C%AC%E4%BB%A3%E8%A1%A8%29+%E5%AF%BE+%E3%83%96%E3%83%A9%E3%82%B8%E3%83%AB%E4%BB%A3%E8%A1%A8&body=日本テレビ系にて全国生中継&location=国立競技場&startdt=2022-06-06T19:20:00:00&enddt=2022-06-06T21:20:00:00&to=test@test.com)

```
// Microsoft Office 365 カレンダー
https://outlook.office.com/calendar/action/compose?subject=キリンチャレンジカップ2022　SAMURAI BLUE(日本代表) 対 ブラジル代表&body=日本テレビ系にて全国生中継&location=国立競技場&startdt=2022-06-06T19:20:00:00&enddt=2022-06-06T21:20:00:00&to=test@test.com
```

[Outlook カレンダー に登録](https://outlook.live.com/calendar/action/compose?subject=%E3%82%AD%E3%83%AA%E3%83%B3%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8%E3%82%AB%E3%83%83%E3%83%972022%E3%80%80SAMURAI+BLUE%28%E6%97%A5%E6%9C%AC%E4%BB%A3%E8%A1%A8%29+%E5%AF%BE+%E3%83%96%E3%83%A9%E3%82%B8%E3%83%AB%E4%BB%A3%E8%A1%A8&body=日本テレビ系にて全国生中継&location=国立競技場&startdt=2022-06-06T19:20:00:00&enddt=2022-06-06T21:20:00:00&to=test@test.com)

```
// Outlook カレンダー
https://outlook.live.com/calendar/action/compose?subject=キリンチャレンジカップ2022　SAMURAI BLUE(日本代表) 対 ブラジル代表&body=日本テレビ系にて全国生中継&location=国立競技場&startdt=2022-06-06T19:20:00+09:00&enddt=2022-06-06T21:20:00+09:00&to=test@test.com
```
Microsoft Office 365 カレンダーと、Outlook カレンダーの違いはURL部分(?より手前)だけで、パラメータについては同じルールで記述します。
なお、以下のURLにアクセスすると全ての項目が空欄の新規追加画面が表示されます。

```
// Microsoft Office 365 カレンダー
https://outlook.office.com/calendar/action/compose

// Outlook カレンダー
https://outlook.live.com/calendar/action/compose
```
#### スマホでの挙動
上記の各サンプルのURLを私のスマホ(iPhone)でアクセスしたところ、どのブラウザでも以下のように動作しました。
- ログイン前の状態でアクセスするとログイン画面が表示される
→ ログインすると画面が真っ白になる(ページ名には「予定表 - (ユーザー名)」と表示されている)
- ログイン中の状態でアクセスすると上述同様の真っ白なページとなる

私の端末だけの挙動なのかもしれませんが、もし導入を検討される場合は十分に検証されることをお勧めします。

#### 主なURLパラメータ
先述のとおりパラメータのルールは共通になっています。

|  パラメータ  | 必須/オプション | 説明 |
| - | - | - |
| subject  | 必須 | 件名 |
| body | オプション | 内容 |
| location  | オプション | 場所 |
| startdt | オプション | 開始日時 ※詳細欄外 | 
| enddt  | オプション | 終了日時 ※詳細欄外 | 
| to  | オプション | 招待者のメールアドレス |
| allday | オプション | 終日<br>値は「true」or「false」|
| uid | オプション | 一意の識別子 |

#### startdt/enddtのフォーマット
サンプルのとおり、日本のタイムゾーンで登録する際のフォーマットは``YYYY-MM-DDTHH:mm:SS+09:00``です。
他のフォーマットもあるようですが、私の環境ではこれでないと上手くいきませんでした。(おま環?)

#### bodyの改行
内容欄での改行は、検証したところ``<br>``で対応できそうです。
``%0D%0A``や``\n``は効きませんでした。
なお、bodyはスペースや日本語がデコードされなかったりと挙動が不安定であるとのこと。
動作検証により上手くいかない場合はICSファイルの利用を検討した方がいいかもしれません。

#### 繰り返しのパラメータ
ICSファイルやGoogleカレンダーにある「繰り返し」のパラメータがないようです。
だからZoomのOutlookへの登録はURLリンクではなくICSファイルなのかもしれません。

![スクリーンショット_2022-05-11_0_12_25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123999/1dc8e2fa-89e3-96db-4712-148fbe02b37e.png)

その他にも紹介していないパラメータがあるので詳しくは[こちら](https://github.com/InteractionDesignFoundation/add-event-to-calendar-docs/blob/main/services/outlook-web.md)などをご確認ください。

#### 参考 (Outlook関連)
[add-event-to-calendar-docs - Outlook | GitHub](https://github.com/InteractionDesignFoundation/add-event-to-calendar-docs/blob/main/services/outlook-web.md)
[Office 365 カレンダーに予定を追加するURLリンクを作る | 物理の駅 by 現役研究者](https://phst.hateblo.jp/entry/2022/02/03/180000)
[Outlookカレンダーの予定を追加するURLリンク | Qiita](https://qiita.com/yuta_sawamura/items/6b52a12f39e0f52143d4)

### Yahoo!カレンダー
調べてみたところ、以下のようなドキュメントを見つけました。
[add-event-to-calendar-docs - Yahoo | GitHub](https://github.com/InteractionDesignFoundation/add-event-to-calendar-docs/blob/main/services/yahoo.md)

こちらで書かれている内容はYahoo!(米国?)が展開されているYahoo!カレンダーについて書かれているのですが([https://calendar.yahoo.com/](https://calendar.yahoo.com/))、Yahoo!Japanではそれとは別に国内向けのYahoo!カレンダー([https://calendar.yahoo.co.jp/](https://calendar.yahoo.co.jp/))を展開しています。

ですが、パラメータは共通のようで、URL部分を変えるだけでそれぞれのカレンダーに対し登録が可能でした。

[Yahoo!版カレンダーに登録](https://calendar.yahoo.com/?v=60&TITLE=%E3%82%AD%E3%83%AA%E3%83%B3%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8%E3%82%AB%E3%83%83%E3%83%972022%E3%80%80SAMURAI+BLUE%28%E6%97%A5%E6%9C%AC%E4%BB%A3%E8%A1%A8%29+%E5%AF%BE+%E3%83%96%E3%83%A9%E3%82%B8%E3%83%AB%E4%BB%A3%E8%A1%A8&ST=20220606T192000&ET=20220606T212000&DESC=日本テレビ系にて全国生中継&in_loc=国立競技場)
```
// yahoo.com
https://calendar.yahoo.com/?v=60&TITLE=キリンチャレンジカップ2022　SAMURAI BLUE(日本代表) 対 ブラジル代表&ST=20220606T192000&ET=20220606T212000&DESC=日本テレビ系にて全国生中継&in_loc=国立競技場
```
[Yahoo!Japan版カレンダーに登録](https://calendar.yahoo.co.jp/?v=60&TITLE=%E3%82%AD%E3%83%AA%E3%83%B3%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8%E3%82%AB%E3%83%83%E3%83%972022%E3%80%80SAMURAI+BLUE%28%E6%97%A5%E6%9C%AC%E4%BB%A3%E8%A1%A8%29+%E5%AF%BE+%E3%83%96%E3%83%A9%E3%82%B8%E3%83%AB%E4%BB%A3%E8%A1%A8&ST=20220606T192000&ET=20220606T212000&DESC=日本テレビ系にて全国生中継&in_loc=国立競技場)
```
// yahoo.co.jp
https://calendar.yahoo.co.jp/?v=60&TITLE=キリンチャレンジカップ2022　SAMURAI BLUE(日本代表) 対 ブラジル代表&ST=20220606T192000&ET=20220606T212000&DESC=日本テレビ系にて全国生中継&in_loc=国立競技場
```
なお、スマホにYahoo!カレンダーアプリをインストールした状態でYahoo!Japan版のリンクにアクセスしましたが、アプリには遷移しませんでした。(iPhone)

なお、Zoomに掲載されているYahoo!への登録用のリンクはYahoo!版カレンダーへのリンクです。
![スクリーンショット_2022-05-11_0_12_25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123999/c4c693d1-f96e-d1f2-09e7-77f5d54dd9b0.png)

#### 主なURLパラメータ
先述のとおりパラメータのルールは共通になっています。
|  パラメータ  | 必須/オプション | 説明 |
| - | - | - |
| v |  必須 | v=60と書く(決まりごと) |
| TITLE | 必須 | 件名 |
| ST | 必須 | 開始日時 ※後述 |
| ET | 必須 | 終了日時 ※後述 |
| DESC | オプション | 内容 |
| in_loc | オプション | 場所 |
| RPAT | オプション | 繰り返しの設定 ※後述 |
| REND | オプション | 繰り返しの終了日<br>※RPATを設定している前提|
| inv_list | オプション| 招待者のメールアドレス |

※一部紹介していないパラメータもありますので、詳しくは上記GitHubのドキュメント([こちら](https://github.com/InteractionDesignFoundation/add-event-to-calendar-docs/blob/main/services/yahoo.md))をご覧ください。

#### ST/ETのタイムゾーン
``YYYYMMDDTHHmmSSZ``でUTC時間に、``YYYYMMDDTHHmmSS``でローカルタイムゾーンに合わせて設定されます。
また、``YYYYMMDD``で終日の設定になります。

#### DESKの改行
内容欄での改行は、検証したところ``%0D%0A``で対応できそうです。
``<br>``や``\n``は効きませんでした。

#### 繰り返しの設定について
上述の通り``RPAT``というパラメータが用意されているのですが、先にご紹介したGitHubのドキュメントによれば2021年8月に非推奨になったとの記載があるのでいつまで使えるのかわかりません。
(``REND``の方には何も書かれていないのですが..)

なお、パラメータ値としては以下のとおりです。
| パターン | 書き方 |
| - | - |
| 1日おき | 01Dy|
| 1週間おき | 01Wk |
| 1ヶ月おき | 01Mh |
| 1年おき | 01Yr |
| 毎週 月・水・金 | 01WkMoWeFr |
| 毎週 火・木 | 01WkTuTh |
| 毎週 平日 | 01WkMoTuWeThFr |
| 毎週 土日 | 01WkSuSa |
| 毎月第二火曜 | 01Mh2Tu |

#### 参考 (Yahoo!カレンダー関連)
[add-event-to-calendar-docs - Yahoo | GitHub](https://github.com/InteractionDesignFoundation/add-event-to-calendar-docs/blob/main/services/yahoo.md)
[カレンダーアプリに予定を追加するボタンをWebサイトに設置するには | びびび備忘録](https://www.chidimaca.com/entry/calendar-add)