Obsidian:他のノートを一部引き継ぐ

ツール活用

Image by Stable Diffusion

三日坊主にデイリーノートを続けさせるコツは、なるべく書く手間を省くことだと思う。

Obsidian:続・デイリーノートに◯◯メーターを入れる(1)
Image by Stable Diffusion なんだかんだ継続できたデイリーノート ノート/メモアプリ「Obsidian」を使い始めて、もうすぐ一年。 Obsidianの利用例として挙げられることの多いデイリーノートは、いわゆるブログ...

なので以前紹介した○○メーターの類は、サイドタブに表示させてるプロパティ(YAMLフロントマター)にチェックをつけるだけ、カーソル合わせて矢印キー上下で数字をいじるだけでその日を振り返られるようにした。

デイリーチェックは、プロパティにチェックをつけるだけ
モチベーションメーターは、項目上で矢印キー上下で数字が変動する

現在運用しているデイリーノートで、たまに面倒と思うのが「Work In Progress(WIP)」の項目だった。
主に編集している動画の進捗管理なのだが、項目や作業量が都度違うため、テキストで編集している。

Templaterプラグインで現在編集している動画に沿った内容を差し込むようにはしたのだが、昨日までの進捗反映は自分で編集しなければならない。
そこで、Templaterにスクリプトを組み込むことにした。

現状を観察

まずは現状を整理して、実装したいことと、できること・できないことを考える。

  1. 昨日の進捗があれば、その内容をそのまま本日部分に差し込みたい。
  2. 昨日の進捗がなければ、項目ごと削除していることが多いので、別途用意したWIPサブテンプレートから本日部分を生成する。
  3. 進捗完了(動画投稿後)の場合は前日から完了分がコピーされてしまうが、これは直接WIPサブテンプレートから写そう。
  4. WIPサブテンプレートの内容は更新あれば直接編集する。
資料1:昨日の進捗状況がある場合
資料2:昨日進捗がなかったので項目ごと手動削除している場合
資料3:差し込み用のサブテンプレート

テンプレート案を作成

ChatGPT君に相談しながら、Templaterスクリプトを作成してもらった。

こちらの設問にも問題はあるが、彼は最初からすんなり100%の回答をくれることはない。

大枠から始めて段階を踏み、エラーが出たら別の提案をしてもらう、自分でこうじゃないかと試して上手くいったらそのように修正を伝えて先を進める、などして、とりあえずの答えを得た。

<%*
const yesterday = tp.date.now("YYYY-MM-DD(ddd)[.md]", "-1"); // 前日の日付のファイル名を生成
const yesterdayFile = tp.file.find_tfile(yesterday); // 前日のファイルを取得

if (yesterdayFile) {
  const content = await tp.file.include(yesterdayFile); // ファイルの内容を読み込む

  // "### Work In Progress"から"### Motivation"までのテキストを抽出するための正規表現
  const match = content.match(/### Work In Progress\n([\s\S]*?)\n### Motivation/);

  if (match && match[1]) {
    tR += "前日の『Work In Progress』セクション:\n\n" + match[1]; // 該当部分を書き出す
  } else {
    tR += "前日の該当項目は存在しませんでした。"; // 該当部分がない場合
  }
} else {
  tR += "前日のノート (" + yesterday + ") は存在しませんでした。";
}
%>

上記をデイリーノートのテンプレートに書き込んで試すと、前日の進捗有無で以下のような結果となる。

前日の進捗部分がある場合
前日の進捗部分がない場合

テンプレートを完成させる

テンプレート案では、現状2の該当項目がなければサブテンプレートを差し込む内容になっていないので、別途下調べしていた内容を反映させる。

さらに現状3の進捗完了(動画投稿後)かどうかの判定は、進捗の未作業分「☆」が該当箇所にあるかないかで判断できると思ったので、カスタマイズしてみた。
動画タイトルに「☆」が含まれる場合は未完了と解釈されてしまうのだが、まぁ許容の範囲だと思う。

これで、デイリーノートの運用がさらに楽になった(笑)

以下が、完成したテンプレートスクリプトの該当箇所です。

### Work In Progress
<%*
const yesterday = tp.date.now("YYYY-MM-DD(ddd)[.md]", "-1", tp.file.title, "YYYY-MM-DD(ddd)[.md]"); // 前日の日付のファイル名を生成
const yesterdayFile = tp.file.find_tfile(yesterday); // 前日のファイルを取得
let wipNew = 0; // サブテンプレートから差し込むかどうか

if (yesterdayFile) {
  const content = await tp.file.include(yesterdayFile); // ファイルの内容を読み込む

  // "### Work In Progress"から"### Motivation"までのテキストを抽出するための正規表現
  const wipOld = content.match(/### Work In Progress\n([\s\S]*?)\n### Motivation/);

  if (wipOld && wipOld[1]) {
    const wipFin = wipOld[1].match(/☆/); // 未進捗の☆が残っているか
    if (wipFin) {
      tR += wipOld[1]; // 進捗部分を書き出す
      wipNew = 1;
    }
  }
}
if (wipNew == 0) {
  // 進捗部分がない場合はサブテンプレートを書き出す
  tR += await tp.file.include("[[stp_wip]]");
}
%>
### Motivation