答:dataviewでObsidianの月別ノート数をカウントします。
蔵書データベース
データベースのファイル数を数えたら、買った本の冊数を月ごとに集計できるかなと。 dataviewでできそうに思ったけど、組み立てようとしたら途中でわからなくなって放っていました。 「月ごと」ってどう絞り込むんだろう。
別の文脈で x.cday.month
という月だけ抜き出す方法を見つけたので、これを応用すれば判定できそうだ。
再度チャレンジしてみます。
Notes.md
dataviewの中でループして配列を作ります。
```dataviewjs const FOLDER = "" const notes = [] for(i=0; i<12 ; i++){ const m = moment().subtract(i, "month") const year = m.format("YYYY") const month = m.format("MM") const d = dv.pages(`"${FOLDER}"`).file .filter(x => x.cday.month == month && x.cday.year == year) notes.push([`${year}/${month}`, d.length, `<progress value=${d.length} max=100></progress>`]) } dv.table(["月別", "ノート数", ""], notes) ```
変数FOLDERに対象フォルダを設定すれば蔵書にも使えます。
使い方
progressのmaxを100にしているので、100を超えた月はフルスコア。 去年の7月8月が暇だったらしい。 猛暑だったから外に出るのをサボっていたと思われます。
dataviewはmoment.jsの関数が使えるので、年をまたいだ計算でも大丈夫。 月と年を取り出しフィルタにかける。 これで月ごとにノートを絞り込めるので、その数を配列notesにプッシュし、最後にdv.tableで表にします。
簡単そうに見えますが、これ、何度もエラーが出て挫けそうになったんですよ。
NotesBar.md
さらにChartsプラグインと組み合わせて棒グラフにしてみました。
```dataviewjs const FOLDER = "" const dates = [] const notes = [] for(i=0; i<12 ; i++){ const m = moment().subtract(11-i, "month") const year = m.format("YYYY") const month = m.format("MM") const d = dv.pages(`"${FOLDER}"`).file .filter(x => x.cday.month == month && x.cday.year == year) dates.push(`${year}/${month}`) notes.push(d.length) } const Chart = {data:{datasets:[{backgroundColor:"brown"}]}} Chart.type = "bar" Chart.data.labels = dates Chart.data.datasets[0].label = "ノート数" Chart.data.datasets[0].data = notes window.renderChart(Chart, this.container) ```
dataviewで下ごしらえしてChartsでグラフ化。
ほら、いいでしょ。