## 事象
[[Minerva]]に、[[Obsidian]]のノートのPropertiesに[作成日と更新日を追加するスクリプト](#関連メモ・リンク)があり、たいへんにありがたい。基本的にうまく動いているが、下記が期待通りではないので調整したい。
- カーソルが1行目にあるとき、1行目が空行となり、Propertiesが2行目から挿入される
- Propertiesの下に空行なく本文がはじまる(1行空行を入れてほしい)
- Propertiesが新規に挿入された場合、メッセージが表示されない
## 関連メモ・リンク
作成日と更新日はフロントマターに記載:
- [💿MIN-0019 作成日と最終更新日はフロントマターに記録する - Minerva](https://minerva.mamansoft.net/%F0%9F%92%BFADR/%F0%9F%92%BFMIN-0019+%E4%BD%9C%E6%88%90%E6%97%A5%E3%81%A8%E6%9C%80%E7%B5%82%E6%9B%B4%E6%96%B0%E6%97%A5%E3%81%AF%E3%83%95%E3%83%AD%E3%83%B3%E3%83%88%E3%83%9E%E3%82%BF%E3%83%BC%E3%81%AB%E8%A8%98%E9%8C%B2%E3%81%99%E3%82%8B)
[[Obsidian Publish]]で、プロパティを表示させる方法:
- [📗Obsidian Publishのサイトにプロパティ\(メタデータ\)を表示したい - Minerva](https://minerva.mamansoft.net/%F0%9F%93%97Obsidian%E9%80%86%E5%BC%95%E3%81%8D%E3%83%AC%E3%82%B7%E3%83%94/%F0%9F%93%97Obsidian+Publish%E3%81%AE%E3%82%B5%E3%82%A4%E3%83%88%E3%81%AB%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3(%E3%83%A1%E3%82%BF%E3%83%87%E3%83%BC%E3%82%BF)%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%97%E3%81%9F%E3%81%84)
Templaterプラグインを利用し、自動更新(追加)する方法:
- [📗カレントファイルのフロントマターを今日の日付で更新したい - Minerva](https://minerva.mamansoft.net/%F0%9F%93%97Obsidian%E9%80%86%E5%BC%95%E3%81%8D%E3%83%AC%E3%82%B7%E3%83%94/%F0%9F%93%97%E3%82%AB%E3%83%AC%E3%83%B3%E3%83%88%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E3%83%95%E3%83%AD%E3%83%B3%E3%83%88%E3%83%9E%E3%82%BF%E3%83%BC%E3%82%92%E4%BB%8A%E6%97%A5%E3%81%AE%E6%97%A5%E4%BB%98%E3%81%A7%E6%9B%B4%E6%96%B0%E3%81%97%E3%81%9F%E3%81%84)
- [ノートに作成日と更新日を任意の位置に配置する方法 · Issue #13 · tadashi-aikawa/obsidian-questions · GitHub](https://github.com/tadashi-aikawa/obsidian-questions/issues/13)
## 対応ログ
Templaterのスクリプトを下記に変更。
```javascript
<%*
// Front matterのキー
const KEY = 'updated'
// 値の日時フォーマット
const date = tp.date.now("YYYY-MM-DD")
const UPDATED = `${KEY}: ${date}`
const editor = app.workspace.activeLeaf.view.editor
const updatedFrontMatter = tp.frontmatter.updated
if (updatedFrontMatter) {
const index = await tp.user.replace_line_at_word_starts(KEY + ": ", UPDATED)
if (index !== undefined) {
new Notice("最終更新日を更新しました")
} else {
new Notice("最終更新日を更新しようとしましたが失敗しました")
}
return
}
const frontMatterBody = `
created: ${date}
updated: ${date}
`.trim()
const hasFrontMatter = Object.keys(tp.frontmatter).length > 0
if (hasFrontMatter) {
await tp.user.insert_new_line_at_word_found("---", frontMatterBody)
return
}
const noteBody = `---
${frontMatterBody}
---
`
// await tp.user.insert_new_line_at_first(noteBody)
try {
await tp.user.insert_new_line_at_first(noteBody);
new Notice("Propertiesに作成日と更新日を追加しました");
} catch (error) {
console.error("エラーが発生しました: ", error);
new Notice("Propertiesの追加に失敗しました");
}
-%>
```
## 変更箇所と解決する問題
```javascript
-%>
```
- カーソルが1行目にあるとき、1行目が空行となり、Propertiesが2行目から挿入される
に対し、Templaterが前後に改行を入れないように変更し、解消。
```javascript
const noteBody = `---
${frontMatterBody}
---
`
```
- Propertiesの下に空行なく本文がはじまる(1行空行を入れてほしい)
に対し、新規プロパティを追加する際、1行空行を入れ、解消。
```javascript
try {
await tp.user.insert_new_line_at_first(noteBody);
new Notice("Propertiesに作成日と更新日を追加しました");
} catch (error) {
console.error("エラーが発生しました: ", error);
new Notice("Propertiesの追加に失敗しました");
}
```
- Propertiesが新規に挿入された場合、メッセージが表示されない
プロパティ追加に成功した場合、通知を出すことにして、解消。
## 余談
ユーザスクリプト`tp.user.insert_new_line_at_word_found`などについて、ファイル名はそれぞれ
- `insert_new_line_at_word_found.js`
- `insert_new_line_at_first.js`
- `replace_line_at_word_starts.js`
が正解。`tp.user.insert_new_line_at_first.js`としていてハマったのでここに記す。