skip to content
とらみみ見聞録
Table of Contents

スマホでもPCと同じ日記を書きたい

情報をクラウドストレージに纏めている。日記も同じく毎日日付ごとにMarkdownファイルを作って書いている。

/memo-in-one-pocket

Obsidianにはデイリーノートといってその日のノートをテンプレートから簡単に作る機能がある。 昔はそれを使っていたのだが、一つ問題があった。

朝、PCでデイリーノートを作り忘れると、その日のファイルがまだない状態なので、 スマホで日記を書くのが途端に面倒くさくなるということだ1

Pythonで自動化していた時期もあったが、いつでもPCの電源がついているとは限らないので、自動的に作成されない日があった。

だったら24時間起きているサーバで、デイリーノートを自動で作ってしまえばいい。 できるさ、そう、Google Apps Script (GAS)ならね。

Google Apps Scriptでデイリーノートを毎日作ってもらう

Google Apps Script (GAS)は、Googleが提供しているプログラミング言語。JavaScriptがベースらしい。 GmailやGoogleカレンダー、そしてGoogleドライブなどのアプリケーションを操作できる。

というわけで、日記ファイルをGoogleドライブに置いていることが前提になるが、以下の方法でデイリーノートを作成することにした。 Obsidianを併用しているのでObsidianというフォルダの下にあることになっているが、書き換えればどのフォルダでもいけるはず。

自動化したいこと

以下を毎朝0時くらいに行う。

  1. GoogleドライブのObsidian>Templetesフォルダの中にデイリーノートのテンプレートTemplete for DailyNote.mdを用意しているので、その内容を読み込む

  2. テンプレート内の{{tp_date}}の文字列を今日の日付に置換する2

  3. Googleドライブの「Obsidian>DailyNote」フォルダの中にその日の日付でyyyymmdd.mdという命名規則のファイルを作成して保存(既に同名のファイルがあれば何もしない)

やってみたこと

Google Apps Scriptから、新しいプロジェクトを作って、.gsファイルに以下を書く。

<code class="sourceCode glsl"><span id="cb1-1">function createDailyNote() {</span>
<span id="cb1-2"> //日付のフォーマット</span>
<span id="cb1-3"> var d1 = Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyy-MM-dd');</span>
<span id="cb1-5"> // Obsidian>Templetesフォルダを取得する</span>
<span id="cb1-6"> var tempfolder = getFolder(getFolder(null,'Obsidian'),'Templetes');</span>
<span id="cb1-8"> //デイリーノート用のテンプレートの中身を読み込む</span>
<span id="cb1-9"> var content = tempfolder.getFilesByName('Templete for DailyNote.md').next().getBlob().getDataAsString("utf-8");</span>
<span id="cb1-11"> //中身が空だった時の予備</span>
<span id="cb1-12"> if (content ""){</span>
<span id="cb1-13"> var content = "---\n" + "title: DailyNote\n" + "date: "+ d1 + "\n" + "keywords: \n" + "aliases: " + "tags: \n" + "---\n";</span>
<span id="cb1-14"> }</span>
<span id="cb1-16"> //日付を置換する</span>
<span id="cb1-17"> content = content.replace("{{tp_date}}",d1);</span>
<span id="cb1-19"> // Obsidian>DailyNoteフォルダを取得する</span>
<span id="cb1-20"> var folder = getFolder(getFolder(null,'Obsidian'),'DailyNotes');</span>
<span id="cb1-21"> console.log(folder.getName());</span>
<span id="cb1-23"> //ファイル名は日付</span>
<span id="cb1-24"> var name = d1 +".md";</span>
<span id="cb1-26"> //同名ファイルがないときだけ上書き</span>
<span id="cb1-27"> if (!(folder.getFilesByName(name).hasNext())) {</span>
<span id="cb1-28"> var file = folder.createFile(name, content);</span>
<span id="cb1-29"> console.log(file.getName())</span>
<span id="cb1-30"> }</span>
<span id="cb1-31">}</span>
<span id="cb1-33">function getFolder(parent, folname){</span>
<span id="cb1-34"> //フォルダ取得関数</span>
<span id="cb1-35"> if (parent null) {</span>
<span id="cb1-36"> parent = DriveApp.getRootFolder();</span>
<span id="cb1-37"> }</span>
<span id="cb1-39"> const folders = parent.getFoldersByName(folname);</span>
<span id="cb1-40"> let targetfol;</span>
<span id="cb1-42"> if (folders.hasNext()){</span>
<span id="cb1-43"> targetfol = folders.next();</span>
<span id="cb1-44"> } else{</span>
<span id="cb1-45"> targetfol = null;</span>
<span id="cb1-46"> }</span>
<span id="cb1-47"> return targetfol;</span>
<span id="cb1-48">}</span></code>

「トリガー」(時計のアイコン)の設定に行って、「createDailyNote」関数を以下の条件で実行するようにする。

  • 時間主導型

  • 日付ベースのタイマー

  • 午前0時~1時 GASで毎日デイリーノートを作成する設定

これで毎朝その日の日付で日記のテンプレートが用意されている状態になった。 いわばページが自動補充される日記である。やったね。

まとめ:できるだけ意志力に頼らずに日記を続けたい

ページの補充を自動化することによって、日記ファイルを作る手間がなくなり、日記を続けやすくなる。 日記を続けると頭が良くなるという話もあるので、ちょっとでもいいから自動化して、意志力に頼らず続けたい。

参考リンク

-GASでテキストファイルの内容を読み取る - Qiita

参考にした本

『詳解! Google Apps Script完全入門 第3版』 ネット上の情報だと断片的だから、こういう体系だった本が1冊あると助かる。

Footnotes

  1. 「仮の日記」というファイルを作ってはいるが、そこから本来の日付ファイルに戻すのをかなりの確率で忘れる

  2. 出現が1回だけなのでReplaceをそのまま使っているが、何度も出てくるなら正規表現の方がいいかも