📘 hkob-astro-notion-blog

これまではてなブログにて情報発信をしていましたが、令和5年3月22日より、こちらでの情報発信を始めました。2019年以前の古い記事は過去の Middleman 時代のものなので、情報が古いです。記録のためだけに残しています。

NotionToCalendar ショートカットアプリの作成

1. はじめに

これまで Google Calendar から Notion へは自動でタスクが作成・更新できるようにしていました。こちらのシステムは GAS で作成しており、来月販売される私が執筆した書籍に掲載されています。興味があったらご覧ください。


一方、Notion 側のタスクは Google Calendar には同期していませんでした。これは GTD でよくある2分で終わるようなタスクをカレンダーに登録したくないためです。また、ポーリングは Notion 側のシステムにも負荷をかけるので、あまり実施したくないという気持ちもあります。

GTD では「いつかやる」タスクが急に予定が決まり、「カレンダー」タスクに変わることがあります。Notion では日付をつければいいだけですが、Google Calendar に登録することを忘れ、よくダブルブッキングをしてしまっていました。

今日、昼に思い立ってショートカットを使ってさっと作ってしまいました。意外と便利だったので、ここで公開します。「説明はどうでもいいから早く使わせてください」という人は、こちらからショートカットを取得して、以下の質問に答えれば使えます。

  1. インテグレーションキー (タスクデータベースにコネクトしているもの)
  2. タスクデータベースとのタイトルプロパティの名前
  3. タスクデータベースの日付プロパティの名前

あとは、ページを開いて共有ボタンを押すだけです。macOS の場合には、リンクをコピーしてから、ショートカットを起動してもいいです(ショートカットキーを割り当てると楽です)。

2. スクリプトの紹介

まずは、入力部分です。共有シート、クイックアクションなどからページ URL を受け取ります。macOS の場合にはクリップボードからも取得します。取得した URL から最初に ? 以降のオプションを取り除き、末尾の page_id を取り出します。この定数は page_id という名前をつけています。また、最後の3つは質問で回答してもらう定数です。それぞれ、以下の名前をつけています。

  1. NOTION_API_KEY
  2. title_property_name
  3. date_property_name

次に取得した page_id からページを取得します。最初に取得したページの id を取得します。この結果には id と名前をつけています。この id が存在しない場合には、正しい URL ではなかったということで処理を止めます。

「その他の場合」はページが取得できた時です。そのため、まずタイトルの文字列を連結します。装飾などをしている場合には、Rich text の配列になっているので、それらの plain_text を連結します。

次に日付プロパティを確認し、date.end と date.start の値を取得します。それぞれ start_strend_str と名前をつけます。もし、start_str の値がなければ日付が設定されていないということなので、ここで処理を中止します。

「その他の場合」は日付が設定されていることになります。start_str という文字列を日付に変換します。これには start_date という名前をつけます。

start_str が時刻を含むかどうかは T という文字が含まれるかどうかでわかります。T が含まれなければ終日イベントです。この時、end_str が設定されていなければ、end_datestart_date と同一のものを入れます。含まれている場合には、end_str から日付型の end_date を作成します。最後にこれらの情報でカレンダーを登録します。なお、私の Google Calendar 同期の都合で、メモに id:ページid というデータを記述しています。

その他の場合は時刻が存在しているイベントです。終日イベントとほぼ同様ですが、end_datestart_date の 1 時間後の時刻にしています。それ以外は全て同じなので、カレンダーの部分は省略します。通知だけ15分前にしています。

3. 動作の様子

動作の様子を昼に Twitter に紹介しました。

また、心配だったのでアンバサダーの田村さんにもテストしてもらいました。

ということで大丈夫そうなので、これで公開します。