はじめに
Twitter にこんな記事が出ていました。
Notionで時刻入力しようとすると果てしなく面倒なのはどうにかならんのかな。
— さとうあまみ👾CTO@necco (@PentaPROgram) 2022年6月5日
トグルで終了時間ONにして時刻を手入力…
トラッカーとして使うならNotion内で完結する『スタート/ストップ』ボタンが欲しいところ。
また、Tsuburaya さんもアカウンタビリティ・チャートを運用しています。
現在時刻を記録するというのは、実は要求高いのではと感じたので、ショートカットで作ってみました。説明は適当にして、作成したショートカットのスクリーンショットを並べます。
最終的にはこんな感じになりました。バグ修正前のものなので、「A new task」が表示されていません。
背面タップすると未完了タスクが表示されて、現在時刻を開始または終了時刻に設定します。終了時刻を設定した時にはタスクも自動的に完了にします。新規タスクを作成することもできます。この時は開始時刻は設定済です。こんな感じでどうでしょう? @PentaPROgram さん。#notion #notiontwt pic.twitter.com/M7RPhKoBHX
— hkob|Notion Ambassador (@hkob) 2022年6月6日
作成したスクリプト
いつもの定数宣言です。Authorization はいつもの「Bearer」文字列との連結をしていますが、それ以外はいつものものです。また、普通に日付で検索すると、UTC で検索するため明日の9時以前のものも表示されてしまいました。そこで、UTC offset の文字列も設定してもらうことにしました。赤字はそれぞれの結果につけた定数名です。後でこの名前で参照します。
これらの値はスクリプトを編集するのではなく、読み込むための質問(Import Question)で設定できるようにしています。インストール時に一度だけ、これら 6 つの質問がされるので、ユーザが設定できるようになっています。後から変更することも可能です。
次に設定するタスクの候補とその ID の関連付けをする辞書を設定します。初期状態では「A new task」だけ入れておきます。これを選んだ時には、新規タスクを作成します。こちらは titleIdHash
という変数に入れておきます。変数にしているのは随時更新するためです。
次に現在の時間から、今日のローカルタイムゾーンにおける 23:59:59 の時刻文字列(todayLastStr
)と、現在時刻の ISO8601 文字列(iso8601time
)を作成します。
タスクデータベースから未完了のタスク一覧を取得します。結果は unfinishedTask
にJSON で記録されます。
取得した JSON を使って、タイトルから id を引くための辞書を作成します。値を登録する度に newTitleIdHash
変数を更新します。unfinishedTask が一つもなかったときに newTitleIdHash が設定されずにエラーになっていたので修正しました。
作成した辞書 newTitleIdHash のキーだけを使って、ユーザに選択肢を提示します。選んだものが「A new task」の場合には、さらにタスクのタイトルを入力してもらいます。入力されたら、そのタイトルと現在時刻を使って、タスクを新規作成します。新規作成されたページの URL は url
変数に登録しておきます。
その他の場合には、タスクの ID を titleIdHash
から取得します。定数名は selectedId
としておきます。
id 以外の情報も取得したいので、先に取得した unfinishedTask
から selectedId
のものを検索していきます。二度手間なのですが、使わない情報をハッシュ化しておくのも無駄なのでこうしています。見つかったら、selectedId
を使って更新用の API URL (updatePageUrl
) を作成しておきます。
タスクの JSON ファイルから開始時刻を取得します。開始時刻が日付のみの場合、文字列に「T」が含まれていません。この時は、開始時刻を現在時刻に設定します。
開始時間にすでに時間が設定されている場合には、終了時間を設定します。終了の場合にはタスクも完了と考えていいので、タスクのチェックも入れてしまいます。
それぞれの場合で作成・更新したページの url が変数に入っているので、https
という文字列を notion
に書き換えることで、Notion アプリでページが開かれます。
終わりに
作成したものはこちらから取得できます。6/7 1:50 に再度作り直しました。ご確認ください。