見出し画像

適当にログを集計したい[Obsidian memos x dataview]

何とかObsidianを使いこなそうとしているものです。

Obsidian memosはいいぞ

Obsidian Memosを導入してから日々のログをとても手軽にとれるようになってきました。
まずは情報の取捨選択をせず、1日の出来事を見返せるようにと何でもかんでもログに取っています。

Obsidian memosの一部分

データをまとめたい欲

ログが溜まってくると性格的にまとめたくなってきました。

調べてみるとTrackerやHeatmapといった可視化プラグインが存在しており、
筋トレのログをつけてみたのですが、memosではなくデイリーノートを開いて特定の記法で書かないとグラフのデータとして取れず、いつの間にかやらなくなってしまいました。

途絶えた筋トレログ
```tracker 
# #チェストプレス というタグをキーとしてコロン後のデータを数値として取得し、グラフ化する?
searchType: tag 
searchTarget: "チェストプレス"
folder: "02_Daily" # どのフォルダー内を検索するか
line:
    title: 胸筋鍛えるやつ 
    yAxisLabel: kg 
	yMin: 0 
    lineColor: "#d65d0e"
```

もっと楽に集計したい

何事も継続しないと意味をなさないので、どうにかして集計のハードルを下げたいと試行錯誤した結果、dataviewで簡易的に表を作ることにしました。

```dataviewjs

// デイリーフォルダのファイルから「起きた」が含まれる行を取得する
const pagesIncludeTargetLine = dv.pages('"02_Daily"').file.lists
    .where(l => l.text.includes("起きた"));

// ヒットした行を日付ごとの配列にカンマ区切りで格納する
let dataObj = {};
for (const list of pagesIncludeTargetLine) {
	if(dataObj[list.section]){
		dataObj[list.section] += ', ' + list.text;
	} else {
		dataObj[list.section] = list.text;
	}
	
}
// 連想配列になっているものを1次元配列に変換する
let dataArray = Object.entries(dataObj).map(([key, value]) => [key, value]);

// 実際のテーブル出力部分
dv.table(['日付', 'ログ'], dataArray);

```
プレビュー

1つのデイリーノートの中で複数ヒットした場合はカンマ区切りで出力されるようにしています。

Obsidian memosはメモした時間も出力してくれるので、いい感じにログとして機能しています。
他にも「腹筋」「トイレ」「水」といった単語を対象にすることでいい感じのログになります。

dataviewjsについて

dataviewjsではMarkdownで書いた情報をオブジェクトとして取得できます。
試しに以下の処理を記載することで、今開いているページがどういったオブジェクトとして取得できるのかを確認できます。

どういう中身になっているかさえわかれば、jsが分かる方であればあとはいい感じに処理すればやりたいことができます。
chatGPTに聞いてもdataviewjsのことは知っているみたいなので質問していけばやりたいことができると思います。

```dataviewjs
dv.span(dv.current())
```

出力方法については公式リファレンスを確認すると色々あります。

以上!

ここから先は

0字

¥ 100

この記事が気に入ったらサポートをしてみませんか?