はじめに
気がついたら前回の投稿からだいぶ時間が空いていた。
このサイトには主にObsidianについて投稿してきたのだが、運用1年位から自分の中で新規性のある話題はなくなってきて、ある意味安定期に入っている。
ただ、色んな方のブログやnoteに助けられたことも多いので、ちょくちょく何かしら投稿したいとは思っている(多分、そこそこ詳しくなってきているので)。
今回は、Obsidianのタスク進捗をプログレスバーで一覧する|⿶⿵⿷⿴⿳で紹介されているタスク進捗バーの作り方を解説する。というのも、こちらの解説記事ではMetadata Menuを使用しているが、Dataviewだけで可能だからだ。
Dataviewjsは今回は使用せず、Dataviewの基本的な使い方は知っているものとする。
複数の知識を組み合わせるので、順番に説明する。
プログレスバーの書き方
下記の通り
<progress value="50" max="100"></progress>
数字に進捗率を記入する。
タスクの情報を取得する
Dataviewでアクセス可能なノートのメタデータは、実はDocumentを読まなくても自分で確認できる。
例えば、Playgroundというタイトルのノートを作ってみて、Dataview tableで下記の様に書いてみる。
table
file
from "Playground"
ここに表示された一覧は全て、Dataviewでアクセス可能なメタデータとなる。
table
file.path, file.frontmatter.date
みたいな感じで使用できる(フロントマターはそのまま書いても使用できるようになっているが)。ここにtasksという項目があり、これがタスクへのアクセスとなる。
更に、このノートに実際にタスクを追加すると、更に下位の項目が表示されるようになる。
ノートのタスクの総数を取得する
length(file.tasks)
file.tasksで、ノート内のタスクのarrayが返ってくるのでlengthで長さを出す。
lengthなどのfunctionは色々使えるが公式documentに解説がある。
完了したタスクの数
length(filter(file.tasks, (t) => t.completed = false))
tasksの更に下位のcompletedがチェックの有無を判別している。ここでフィルターをかけると完了タスク数を表示できる。
プログレスバーと合体してDataview Tableに表示する
table
"<progress value='" + length(filter(file.tasks.completed, (t) => t = true)) + "' max='" + length(file.tasks) + "'></progress>"
プログレスバーを文字列で書いて、数字の部分にタスク数を入れ込む。
これでタスク進捗率のプログレスバーを表示できる。
更に%の表記を追加する
table
"<progress value='" + length(filter(file.tasks.completed, (t) => t = true)) + "' max='" + length(file.tasks) + "'></progress>" + choice(length(file.tasks), round(length(filter(file.tasks.completed, (t) => t = true))/length(file.tasks)*100), 0) + "%" AS Progress
こんな感じ?
デイリーノートに注力する
更にデイリーノートに注力したバージョンを考えてみる。
インラインで書く用。
本日のデイリーノートへのリンクを取得する
`=link(dateformat(date(today), "yyyy-MM-dd"))`
データフォーマットは自由に変えれる。
Dataviewjsで記載したバージョン(2024-12-10追記)
`$=dv.fileLink(moment().format("YYYY-MM-DD"))`
本日のデイリーノートのタスク数を取得する
`=length(link(dateformat(date(today), "yyyy-MM-dd")).file.tasks)`
先程の取得方法にファイルリンクを先頭に付け加える。
本日のデイリーノートのタスク進捗プログレスバーを取得する
`="<progress value='" + length(filter(link(dateformat(date(today), "yyyy-MM-dd")).file.tasks.completed, (t) => t = true)) + "' max='" + length(link(dateformat(date(today), "yyyy-MM-dd")).file.tasks) + "'></progress>" + choice(length(link(dateformat(date(today), "yyyy-MM-dd")).file.tasks), round(length(filter(link(dateformat(date(today), "yyyy-MM-dd")).file.tasks.completed, (t) => t = true))/length(link(dateformat(date(today), "yyyy-MM-dd")).file.tasks)*100), 0) + "%"`
合せ技。
Dataviewjsで記載したバージョン(2024-12-10追記)
`$="<progress value='" + dv.page(moment().format("YYYY-MM-DD")).file.tasks.filter(t => t.completed === true).length + "' max='" + dv.page(moment().format("YYYY-MM-DD")).file.tasks.length + "'></progress> " + (dv.page(moment().format("YYYY-MM-DD")).file.tasks.length > 0 ? Math.round((dv.page(moment().format("YYYY-MM-DD")).file.tasks.filter(t => t.completed === true).length / dv.page(moment().format("YYYY-MM-DD")).file.tasks.length) * 100) : 0) + "%"`
このほうが自動で更新されて良い感じ。
おわりに
ホームページの一番上に追加してみた。
一応DataviewのrefreshボタンもMeta Bindで作って、完了。
そんなことより今日まだ38%なのやばい。
あくまでタスクの数の計算で重み付けはされてないので…