予定をQRコードで配る:iCalendar(VEVENT)をブラウザだけで生成しqrcode.jsでQR化する
イベントの告知チラシやPOPに「読み取るだけでカレンダーに予定が入るQR」を載せたい、という要望はよくある。仕組みは単純で、QRコードに iCalendar(VEVENT)形式のテキストを埋め込むだけだ。スマホのカメラで読み取ると、日時・場所・タイトルが入力されたカレンダー登録画面が開く。
この処理はすべてクライアント側(ブラウザ)で完結できる。サーバーもビルドも要らない。自分のツールサイトで実際に動かしている実装(予定QRコード生成ツール)をもとに、要点を切り出して解説する。
埋め込むテキストの正体
QRに入れるのは、拡張子 .ics でおなじみの iCalendar テキストそのものだ。最小構成はこうなる。
1 | |
ポイントは2つある。行区切りは CRLF(\r\n)であること、そして SUMMARY などのテキスト値はエスケープが必要なことだ。
テキスト値のエスケープ
iCalendar(RFC 5545)では、テキスト値の中の \・;・,・改行をエスケープしなければならない。これを怠ると、カンマを含むタイトルなどで予定が途中で切れる。
1 | |
バックスラッシュの置換を最初にやるのが肝心だ。順番を間違えると、後から足したエスケープ用の \ を二重にエスケープしてしまう。
日時のフォーマット
<input type="datetime-local"> の値は 2026-08-01T18:00 の形で得られる。これを iCalendar の YYYYMMDDTHHMMSS に変換する。タイムゾーンを付けない「フローティング時刻」にしておくと、読み取った端末のローカル時刻として素直に扱われる。
1 | |
終日イベントにするなら DTSTART;VALUE=DATE:YYYYMMDD と日付だけを入れる。
VEVENT を組み立てる
配列に行を積んで \r\n で結合するのが安全だ。文字列連結より、条件付きで行を足したいときに読みやすい。
1 | |
qrcode.js でQR化する
あとは組み立てたテキストを qrcode.js(qrcode パッケージのブラウザビルド)に渡すだけだ。CDNから読み込めば依存はこれ1つで済む。
1 | |
実務での注意点
- 情報量を増やしすぎない。予定のテキストが長いほどQRは複雑(高密度)になり、読み取りづらくなる。タイトルと説明は簡潔に。
- 誤り訂正レベルとサイズはトレードオフ。データ量が多い予定QRでレベルを上げると、さらに密になる。印刷は大きめのサイズで。
- 端末差。読み取り後に「登録画面が開く」までで、保存はユーザー操作が必要。カメラアプリやカレンダーアプリによって挙動が変わる。
入力からQR生成・PNG/SVGダウンロードまでを実際に試せるツールを公開している。動きを確認したい場合はこちらへ。
- 予定QRコード生成ツール(iCalendar/終日対応・すべてブラウザ内で完結): hashitosystem.com/tools/calqr/
VEVENT はテキストの組み立てとエスケープさえ押さえれば、サーバーレスで完結できる手軽なフォーマットだ。連絡先(vCard)やWi-Fi設定のQRも同じ発想で作れる。