Notion で(自分なりの)タスク・時間管理を始めよう!(拡張編②)
前回は、タスクに「予定時刻」を設定したり、「セクション」を追加して「時間帯」で分類したりできるように、拡張を行いましたが、
今回は「開始予定」ではなく「終了予定」について、考えてみましょう。
現状だと、ついつい「タスクを詰め込み過ぎてしまう」という人も少なくないのではないでしょうか?
ここまで作ってきたシステムでは、あえて、実行できなかったタスクを翌日に移動させたりはせず、未着手という「記録」として残しておき、
今日やるつもりなら、昨日の続きをやる場合やルーチンと全く同じように、改めて「新しいタスクを作成する」という方針なので、
何度も「先送り」を繰り返していれば「このタスク、毎日のように作成してるけど、どうせ実行しないな」ということが、身に沁みて分かってきます。
そうしたら、その原因や対策を考えればいいわけですが、基本的には、本当に「できる日」にタスクを入れて、実行するだけです。
例えば、プロジェクトリストに加えておいて、毎朝「今日やること」を決める際に「タスクを追加」ボタンを押すかどうか、判断すると良いでしょう。
あるいは、ルーチンにしておいて、毎朝、そのタスクを削除するかどうかを決断するのでも構いません。
重要なのは、なんとなく「先送り」してしまう自分を責めるのはやめて、
自分の意思で「やると決めたけどできなかった」のかどうかを、明確に見極めておくことでしょう。
本当の要因が分からなければ、根本的な解決もあり得ません。
しかし、そのタスクを実行できない理由の一つが「タスクの詰め込み過ぎ」かどうかというのは、どうして分かるのだと思いますか?
それを考える時、優先順位に従って、何をいくつまで「今日のタスク」に追加しても、無理なく実行できるのかといった、目安があると便利です。
また、タスクごとに必要な時間を見積もってみて、その誤りやズレの程度を経験し続けなければ、
人は、頭の中で考えるだけでも、ある程度は正しく見積もりを行うことが可能だという幻想から、なかなか逃れることはできないでしょう。
時間がないと嘆くのではなく、実は「自然と時間を過ごせばこうなる」と気づいて、納得できることが大切であり、それこそが正しい認識なのです。
というわけで、今回は、その日のタスクを調整していく手掛かりとして有用な「見積もり」機能の導入について、説明していきたいと思います。
見積もりプロパティを追加する
もちろん、プロパティとして「見積もり」を入力できるようにすること自体は、至って簡単です。
例えば「数値」プロパティを使うなら、分単位などで記入する必要がありますが、後から計算に使ったりするのは楽になります。

しかし、もし「1:30」のような形式で入力したければ、前回の「予定時刻」と同様に「テキスト」プロパティを利用して、
それとは別に「数式」プロパティで「見積もり値」を算出し、表示しておくのも良いでしょう。

ここで入力した数式は、以下のようなもので、
toNumber(at(split(prop("見積もり"),":"),0)) * 60 + toNumber(at(split(prop("見積もり"),":"),1))テキストで入力した「prop("見積もり")」を「:」で分割(split)して、「at(〇〇,0)」で「時」を、「at(〇〇,1)」で「分」を取得し、
当然「時」の方には「60」を掛けて、「分」と足し合わせているだけです。
ただし、数値計算を行う前に、テキストを「toNumber()」で数値に変換する必要がある点には注意してください。
また、逆に「見積もり値」の方から「見積もり」を「1:30」というような形式で表示させることも可能であり、

その場合は、次のような数式で、
floor(prop("見積もり値") / 60) + ":" + prop("見積もり値") % 60例えば「prop("見積もり値")」を「60」で割った値から「floor()」で小数点以下を切り捨て、余りの値と「:」で連結するなどします。
しかし、これだと「prop("見積もり値") % 60」の計算結果が「0」になった時「1:0」のように表示されてしまうので、
以下のように「if()」を使って場合分けするなどしておくと良いでしょう。
floor(prop("見積もり値") / 60) + ":" + if(prop("見積もり値") % 60 == 0, "00", prop("見積もり値") % 60)ともあれ、ここまでで、なんとなく「数式」プロパティの使い方は分かってきたでしょうか?
終了予定時刻を導出する
さて、タスクを開始する「予定時刻」と、新たに追加した「見積もり値」があれば、もちろん「終了予定時刻」を算出することもできます。
紛らわしいので、先に、既存の「予定時刻」プロパティの名前を「開始予定時刻」と修正しておきましょう。
そして、いよいよ「終了予定時刻」の計算ですが、実は、上で説明した二つの数式が理解できていれば、
ほとんど、それらを組み合わせるだけで済むということに気付いた方もいるかもしれません。
まず「開始予定時刻」を「:」で分割して、分単位に変換し、「見積もり値」と足し合わせてから、
その合計値(分)を「1:30」といった形式に戻すというわけです。

数式で書くと、次のようになります。
let(minutes, toNumber(at(split(prop("開始予定時刻"),":"),0)) * 60 + toNumber(at(split(prop("開始予定時刻"),":"),1)) + prop("見積もり値"), floor(minutes / 60) + ":" + if(minutes % 60 == 0, "00", minutes % 60))最初の計算結果の値を「let()」で「minutes」という変数に保存し、二つ目の計算の中で利用しているのが、ちょっとした工夫ですね。
ちなみに、計算が複雑になってきたら、「Shift」キーを押しながら改行し、数式を読みやすくしておくのも、地味にオススメです。

終了予定日時を表示する
では、最後に、今日の残りのタスクの見積もり時間を全て合計し、全てのタスクの「終了予定日時」を表示する方法を、ご紹介いたしましょう。
つまり、この「終了予定日時」が翌日の深夜3時とかになっていれば、タスクを詰め込み過ぎていると、即座に判明するわけです。
例えば、適当にタスクをいくつか追加して、「開始予定時刻」や「見積もり値」を入力し、今日のプランを立てたとします。

一応、これだけでも「終了予定時刻」の列を参考にすることはできますが、必ずしも全てのタスクを予定通りの時間に開始できるとは限らないので、
仮に、今すぐ上から順番にタスクを実行していったら、最速で、何時何分に全てのタスクが終わるのか、算出してみましょう!
実は、この計算だけを頼りにするなら「見積もり値」さえあればいいので、全てのタスクに「開始予定時刻」を記入しておく必要もありません。
ともあれ、新しいテーブル(データベースのテーブルビュー)の作り方などは、今まで何回か説明しているので省略しますが、
重要なのは、次のように「タスクリスト」という「リレーション」プロパティを、列として追加しておくことです。

確か、「リレーション」プロパティの設定方法についても、「プロジェクトリスト」を作成した際に紹介しましたね。
行の名前を「計算に含める」としているように、簡単に言えば、これと紐づけられているタスクだけを「終了予定日時」の導出に用いるわけです。
そこで、次に「今日のタスク」かつ「完了していないもの」を「計算に含める」ための「ボタン」を追加しましょう。
まず、一つ目のステップでは、余計なタスクが計算に含まれないよう、「終了予定日時」が「計算に含める」を含むものについて、

その紐づけを、いったん全て解除し、
二つ目のステップとして、例えば「実行日」が「今日」かつ「ステータス」が「完了ではない」全てのタスクを「計算に含める」ようにします。

計算に含めるようにすると言っても、もちろん、ただ単に、各タスクの「終了予定日時」プロパティに「計算に含める」を設定するだけです。
では、この「リストを更新」ボタンを押してみてください。
これで「タスクリスト」列に、該当するタスクが追加されたでしょうか?

それでは、いよいよ、このテーブルに「終了予定日時」を追加しましょう!
お察しの通り「数式」をフル活用しますよ。

以下のように設定すると、「タスクリスト」列にあるタスクのうち、まだ「完了していないもの」だけの「見積もり値」を合計し、
その値を、「now()」で取得した現在日時か、「進行中」のタスクがあればその「開始日時」に「dateAdd()」で足し合わせることができるわけです。
dateAdd(
let(wip, prop("タスクリスト").find(current.prop("ステータス") == "進行中"), if(wip, wip.prop("開始日時"), now())),
sum(prop("タスクリスト").filter(includes(["未着手", "進行中"], current.prop("ステータス"))).map(current.prop("見積もり値"))),
"minutes"
)これで「終了予定日時」が計算され、表示されるようになりましたかね?

ただし、「現在日時」や「終了予定日時」の値は、なんらかのボタンを押すなどして、関連しているデータが更新されたり、
ページをリロードしたりするまでは、表示が変わらないので、その点には、ご注意ください。
また、「リストを更新」ボタンは、毎朝、今日のプランを立てた時はもちろん、途中で新しいタスクを追加した際にも実行する必要がありますが、
別に、何度押しても構わないので、日時の列を更新したい時にも活用していれば、押し忘れることもなくなるかもしれませんね。
まぁ、まだまだ改善の余地はあるのですが、とりあえず、今回は、この辺にしておきましょう。
参考文献
さて、ここまでくれば、一般的な「タスクシュート」の主要な機能は、大体カバーできてきたのではないでしょうか?
運用方法については、これまでの記事と共に、改めて、書籍をご確認いただければと思いますが、
もちろん、今回、最後に追加した「終了予定日時」を使いこなすには、各タスクに「見積もり値」を入力しておき、
同様のタスクを繰り返し実行する中で、その値がより正確になるよう、何度も調整を行なっていく必要があります。
そして、実は、その「見積もり値」を調節する作業こそが、各タスクにどのくらいの時間がかかるかを正しく認識するための、
タスクシュートで「先送り」がなくなっていく仕組みの肝なのです。
最終的に、「終了予定日時」を見て、今日のプランに無理がないことを確認しながら、タスクを進めていけるようになれば、
非現実的な計画を立てていることに気づかず、必然的でしかない「先送り」に悩まされる、といったこともなくなっていくでしょう。
というわけで、説明し足りないことも多いですが、ちょっと長くなってきたので、今回はこの辺で。
ではまた。
