NotionTimeRecording の作成 : Notion 解説 (53)

はじめに

Twitter にこんな記事が出ていました。

また、Tsuburaya さんもアカウンタビリティ・チャートを運用しています。

note.com

現在時刻を記録するというのは、実は要求高いのではと感じたので、ショートカットで作ってみました。説明は適当にして、作成したショートカットのスクリーンショットを並べます。

最終的にはこんな感じになりました。バグ修正前のものなので、「A new task」が表示されていません。

作成したスクリプト

いつもの定数宣言です。Authorization はいつもの「Bearer」文字列との連結をしていますが、それ以外はいつものものです。また、普通に日付で検索すると、UTC で検索するため明日の9時以前のものも表示されてしまいました。そこで、UTC offset の文字列も設定してもらうことにしました。赤字はそれぞれの結果につけた定数名です。後でこの名前で参照します。

定数宣言

これらの値はスクリプトを編集するのではなく、読み込むための質問(Import Question)で設定できるようにしています。インストール時に一度だけ、これら 6 つの質問がされるので、ユーザが設定できるようになっています。後から変更することも可能です。

読み込みための質問

次に設定するタスクの候補とその ID の関連付けをする辞書を設定します。初期状態では「A new task」だけ入れておきます。これを選んだ時には、新規タスクを作成します。こちらは titleIdHash という変数に入れておきます。変数にしているのは随時更新するためです。

titleIdHash

次に現在の時間から、今日のローカルタイムゾーンにおける 23:59:59 の時刻文字列(todayLastStr)と、現在時刻の ISO8601 文字列(iso8601time)を作成します。

時間文字列の作成

タスクデータベースから未完了のタスク一覧を取得します。結果は unfinishedTask にJSON で記録されます。

未完了のタスク一覧を取得

取得した JSON を使って、タイトルから id を引くための辞書を作成します。値を登録する度に newTitleIdHash 変数を更新します。unfinishedTask が一つもなかったときに newTitleIdHash が設定されずにエラーになっていたので修正しました。

title から id を引く辞書を作成

作成した辞書 newTitleIdHash のキーだけを使って、ユーザに選択肢を提示します。選んだものが「A new task」の場合には、さらにタスクのタイトルを入力してもらいます。入力されたら、そのタイトルと現在時刻を使って、タスクを新規作成します。新規作成されたページの URL は url変数に登録しておきます。

新規タスクを登録

その他の場合には、タスクの ID を titleIdHash から取得します。定数名は selectedId としておきます。

タスクidの取得

id 以外の情報も取得したいので、先に取得した unfinishedTask から selectedId のものを検索していきます。二度手間なのですが、使わない情報をハッシュ化しておくのも無駄なのでこうしています。見つかったら、selectedId を使って更新用の API URL (updatePageUrl) を作成しておきます。

ID の検出と updatePageUrl の作成

タスクの JSON ファイルから開始時刻を取得します。開始時刻が日付のみの場合、文字列に「T」が含まれていません。この時は、開始時刻を現在時刻に設定します。

開始時刻の設定

開始時間にすでに時間が設定されている場合には、終了時間を設定します。終了の場合にはタスクも完了と考えていいので、タスクのチェックも入れてしまいます。

終了時刻の設定

それぞれの場合で作成・更新したページの url が変数に入っているので、https という文字列を notion に書き換えることで、Notion アプリでページが開かれます。

Notion を開く

終わりに

作成したものはこちらから取得できます。6/7 1:50 に再度作り直しました。ご確認ください。

www.icloud.com


www.notion.so