ぴよログ

↓に移転したのでこっちは更新されません、多分。

Mac版Evernoteにチェックボックス付きのノートを自動生成する

移転しました →

こういった使い方をしている人はたくさんいると思います。前者は買い物リスト、後者は日記が定番でしょうか。

チェックボックスを使うだけならEvernoteのエディタでチェックボックスを置くだけでいいですし、同じ形式のノートを作るならDashなどのスにペットアプリを使えば簡単です。

ところがこれらを組み合わせようとすると急に大変になります。毎日チェックボックス付きの日記を書きたい、というような場合です。まあこれは僕の話なんですが。

そもそもチェックボックス付きのスニペットというのは作ることができません。Evernoteチェックボックステキストエディターにコピーすると[]となりますが、その逆は成り立たないのでテキスト貼り付けでチェックボックスを置くことはできないのです。

「テンプレート用のノートを一個作っておいてそれをコピーして毎日使えばいいじゃん」と思うのがほとんどの人ですが、極度の効率厨である僕にとってはそんなことやってられません。コマンド一発でその日の日付入りのノートを作って欲しいのです。

前置きが長くなりました。結論を言えば、enmlとAutomatorAppleScriptを使います。

enmlってなに?

Evernoteのノートエクスポート機能を使うとXML形式で出力されるはずです。

例えばこんなノート。

エクスポートするとこのように出力されます。これがenmlで、チェックボックスなどのEvernote独自の要素もタグを使って表現できています。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE en-export SYSTEM "http://xml.evernote.com/pub/evernote-export3.dtd">
<en-export export-date="20140218T010326Z" application="Evernote" version="Evernote Mac 5.5.0 (402474)">
<note><title>タイトルタイトル</title><content><![CDATA[<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE en-note SYSTEM "http://xml.evernote.com/pub/enml2.dtd">
<en-note style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;">
<b>太字<br/></b>
<div><br/>
<div><en-todo/>ほげ
<div><en-todo/>ふが<br/></div>
<div><en-todo/>foo<br/></div>
<div><en-todo/>bar<br/></div>
<div><br/></div>
</div>
</div>
</en-note>
]]></content><created>20140218T010211Z</created><updated>20140218T010237Z</updated><note-attributes><author>author</author><reminder-order>0</reminder-order></note-attributes></note>
</en-export>

Automatorの全体の流れ

この2つのアクションを使います。

シェルスクリプトを実行でノートのタイトルに使う日付の文字列、ノートの本文にするenml形式の文字列を出力し、AppleScriptを実行Evernoteにノートを作るという流れです。

AppleScriptEvernoteにノートを作る

まずは後半のノートを作るところから紹介します。コードの全体はこれ

on run {input, parameters}
    set ttl to item 1 of input
    set body to item 2 of input
    tell application "Evernote"
        set notebook1 to notebook "notebookname"
        set note1 to create note title ttl with enml body notebook notebook1
        open note window with note1
    end tell
end run

順番に解説していきます。

最初の2行で標準入力の1行目と2行目をttl(タイトル)body(本文)に割り当てています。titleEvernote側で使われているので苦肉の策でttlとしています。

set ttl to item 1 of input
set body to item 2 of input

次のブロックでEvernoteに対して命令を行うということを示しています。ブロック内に書いたコードはEvernoteに対して実行されます。

tell application "Evernote"
end tell

実際にノートを作るところ。ノートブックを指定し、ttlbodyを持つノートを作ります。最後に作ったノートを開いておしまい。

set notebook1 to notebook "notebookname"
set note1 to create note title ttl with enml body notebook notebook1
open note window with note1

本文と日付を出力するスクリプト

AppleScriptに渡すタイトルと本文を出力スクリプトを書きます。なんでもいいですが、ぼくは慣れているのでRubyを使いました。本文には先ほど紹介したenmlの<en-note></en-note>タグの内部の文字列を使います。

やっていることは日付の文字列生成・出力と本文の出力です。本文は本当は外部ファイルとかにしたほうがいいですね。

wdays = ["", "", "", "", "", "", ""]
day = Time.now
wday = wdays[day.wday]
date_string = day.strftime("%Y/%m/%d(#{wday}")

body = <<-EOS
<b>太字<br/></b><div><br/><div><en-todo/>ほげ<div><en-todo/>ふが<br/></div><div><en-todo/>foo<br/></div><div><en-todo/>bar<br/></div><div><br/></div></div></div>
EOS

puts "#{date_string}の日記"
puts body

このスクリプトAutomatorの1つ目のアクション、シェルスクリプトを実行で実行します。

シェルを/usr/bin/rubyにして直接書いてもいいし、/bin/shにしておいて/path/to/ruby /path/to/script.rbなどとしてあげても大丈夫です。

仕上げ:アプリケーションにする

Automatorで作ったワークフローをアプリケーション形式に変換し、アプリケーションディレクトリに置いておきましょう。そうするとSpotlightなりAlfredなりでコマンド一発で起動でき、Evernote新規作成されたノートのウィンドウが開いてすぐに書き始められます。

さいごにコメント

AppleScript書いたけど相当だるいです。アプリケーションを操作するためには使わざるを得ないんだけど、別の手段も用意されていると嬉しい。URLスキームでいろいろできるとかね。