ObsidianのTemplaterプラグインでDaily note作成時に定期タスクを自動追加するやり方


ObsidianのコミュニティプラグインTemplaterは、 テンプレートファイルにJavaScriptコードを埋め込み、ノート作成時にコードの実行結果をノートに埋め込める。 もちろんライブラリ関数の呼び出しや変数定義、ifやforといった制御構文も使える。

ObsidianのDaily note作成時に定期タスクを自動追加する方法のメモ。

Daily noteには、次のようなタスクがある。

  1. 曜日ごとに実施するタスク
    • 月曜には可燃ごみの廃棄、金曜日には業務用カレンダーからミーティング時間を個人カレンダーにコピーする、など
  2. 特定の日付に実施するタスク
    • 毎月25日に給与振込口座を確認する
  3. 月初めのある曜日に実施するタスク
    • 毎月第1土曜日にmonthly noteを作成する

Daily noteのファイル名はyyyy_MM_dd(例2022_08_02)とする。 この3種類のタスク作成をTemplaterを使ってどのように自動化するか。

1. 曜日ごとに実施するタスク

まず、1. 曜日ごとに実施するタスクについて。これはまずファイル名から曜日を取得し、if elseで条件分岐すればよい。

TemplaterにJavaScriptコード(コマンド)を埋め込むには、<%* ... code ... %>で記述する。末尾が-%>の場合、コマンド記述の直後の改行を削除する。

コマンド内でファイル名を取得するには、Templaterが提供する組み込みコマンドtp.file.titleを使用する。

日付はtp.date.now()コマンドで解析できる。第1引数から順に取得したい要素(曜日や年月日など)、オフセット、解析対象の日付の文字列、解析対象の日付フォーマットをしていする。 フォーマットの指定はMoment.jsに従っているので詳細はそちらを参照。

条件分岐はJavaScriptと同じif (contition) { statement }の書き方。

上記を使って曜日ごとに実施するタスク生成を記述するとこんな感じになる。Daily noteの曜日が水曜の場合、some taskを追加してくれる。

<%* dow = tp.date.now("ddd", 0, tp.file.title, "YYYY_MM_DD") -%>
<%* if (dow == "Wed" ) { -%>
- [ ] some tasks
<%* } -%>

2. 特定の日付に実施するタスク

これも基本的には1. と同じ考え方でできる。tp.date.now()の第1引数で曜日ではなく日付を取得するように変更するだけ。

<%* if (tp.date.now("DD", 0, tp.file.title, "YYYY_MM_DD") == "25" ) { -%>
- [ ] 給与振込口座を確認
<%* } -%>

3. 月初めのある曜日に実施するタスク

これは少し面倒。月初めかをチェックする関数は用意されていないっぽいので、自分で記述する必要がある。いろいろやり方はあるかもしれないが、今日の月数と1週間前の月数が一致しているかをチェックし、異なっていれば月が替わった(月初め)としている。 1週間前の月の取得するにtp.date.now()の第2に引数でオフセットに-7(7日前)を指定しているところがポイント。

<%* this_week = tp.date.now("MM", 0, tp.file.title, "YYYY_MM_DD") -%>
<%* last_week = tp.date.now("MM", -7, tp.file.title, "YYYY_MM_DD") -%>
<%* if (this_week !== last_week ) { -%>
- [ ] monthly noteを作
<%* } -%>

おわりに

今回はObsidianTemplaterプラグインで、Daily note作成時に定期タスクを自動追加するやり方をまとめた。ノード作成時にJavaScriptを実行できるため、より高度な自動化も実現できそう。