このスクリプトで何ができるのか?
コマンドの引数にノートタイトルを指定してEvernoteに新規ノートを追加し、そのまま自動処理でノートリンクを取得する、というスクリプトみたいなものを作り上げてみました。
インプットとアウトプットがこういう感じになります。
インプット
アウトプット
「bluewind」(フリー)というコマンドラインランチャーソフト、その関連ソフトとして「getText」(フリー)、文字列の置換にテキストエディタ「秀丸」(シェアウェア)のマクロ機能を使っています。
このスクリプトを作ろうと思った動機
下記のはまラボへの寄稿記事にあるように、タスク管理ツールのタスクとEvernoteを紐付けて使っています。
Evernoteにリマインダ設置!RTMを連携した@neunz19 の使用例
こういうことをやっていると、タスクに関連する内容を入れていくための空のノートを作成し、すぐにノートリンクを取得してタスクにリンクさせておきたい、という要望が生まれます。
直感的に手作業でこれを行うと、Windowsクライアント等で新規ノート追加、同期、(同期完了を待って)ノートリンク取得、という手順となるでしょう。
非力なマシンだと、同期に時間もかかるし、いつ終わるかもわからず、ストレスの元になります。 これをどうにかしてもっとスムーズな作業にしたかった。
スクリプト自作のきっかけ
数ヶ月前のことになりますが、とゆさん(@toyu3)と一緒にtwitter上でマロ。さん(@maro_draft)主催のワークをさせてもらった際、EvernoteのENScript.exeの使い方周りでたくさんのヒントをもらい、「一丁自前で作ってみるか」と思って挑戦を始め、この度ようやく出来上がったものです。
このマロ。さんのワークが無ければ、私単独ではまず実現できなかったことだと思います。toggl_to_TaskChuteにも毎日お世話になっていますし、マロ。さんには足を向けて寝られません。ありがとうございます。
ノートリンクの構造
ノートリンクの構造については、こちらの記事が大変分かり易いと思います。
Web版Evernoteでノートリンクを作成する – s_z_k_3’s Scripts in Tumblr.com
この記事からわかるように、ノートリンクは「アカウント情報+ノート情報」という構成になっています。
アカウント情報は自分一人が使う場合には固定値ですので、個別のノートのノートリンクを取得するにはノート情報の部分だけ判れば良いということになります。
個別のノートのリンクは、新規ノート作成直後にEvernoteの同期をすると、その同期のログの中に出てきます。
それを秀丸のgrep検索を使って拾ってきて、アカウント情報と繋げてノートリンクを取得することができます。
全体の流れ
やっていることはコマンドプロンプトからでも実行できる内容だと思いますが、実行時に便利なのでbluewindというコマンドラインランチャーソフトを使っています。
- (1)ENScript.exeを使って、ノートタイトルを指定して新規ノートを作成
- (2)ENScript.exeを使って同期(この際、同期ログをテキストファイルに出力させる)
- (3)同期ログから、秀丸を用いてノートタイトルでgrep検索
- (4)ノート情報部分を切り貼りしてノートリンクに仕上げる
(1)ENScript.exeを使って、ノートタイトルを指定して新規ノートを作成
ENScript.exe createNote /s (ファイル) /i (ノートタイトル)
というコマンドで、ノートタイトルとノートの内容となるファイルを指定してノートを作ることができます。
好みの分かれるところかもしれませんが、私はノートの1行目とノートタイトルを合わせた方がすっきりするので、下記のようなbatファイルを作りました。
echo %1> C:\tmp\TitleContent.txt "C:\Program Files\Evernote\Evernote\ENScript.exe" createNote /s C:\tmp\TitleContent.txt /i %1 exit
このbatファイル実行時に、ノートタイトルを引数として渡すと、Evernoteに指定したノートタイトルのノートが出来上がります。
(2)ENScript.exeを使って同期(この際、同期ログをテキストファイルに出力させる)
ここでもENscript.exeを使います。
ENscript.exe syncDatabase /l C:\tmp\syncDatabase.log
これを実行すると、同期が行われて、そのlogがsyncDatabase.logに残ります。ここからノート情報を切り出します。
(3)同期ログから、秀丸を用いてノートタイトルでgrep検索
その同期ログの中に、下記のようにノートタイトルとノート情報が続いて出現する部分があります。
まず、ノートタイトルが出てくる行を探し、末尾の改行を削除、その後にノートタイトルを含む行だけをgrep検索で拾ってくる、ということをしています。
(4)ノート情報部分を切り貼りしてノートリンクに仕上げる
ノート情報が得られたら、あとは前後の要らない部分を削り、アカウント情報をくっつけたり、ノート情報を繰り返したりすればノートリンクの完成です。
実際には3.と4.は秀丸マクロにやらせています。
現状は、秀丸マクロに外部から文字列をスマートに渡す方法がわからず、クリップボードを介して処理しています。
ファイルから持ってくる、または引数として渡す、ということができればクリップボードの上書きが避けられると思うのですが、秀丸マクロのヘルプを見てもすぐにはわかりませんでした。素人の限界です。
クリップボードに読み込む方法としては、bluewindのgetTextという単機能を使っています(次回の記事でbluewind周りを説明するので、そこで具体的な内容を書きます。)
同じ事をbatファイルを利用して実現することも可能だと思います。
さて、そんな感じですので、このマクロはとりあえず動くのですが自分でもよくわかっていない処理もあったりします。
切り貼りと試行錯誤だらけで、きれいなものではありませんが載せてしまいます。
「ノートリンク化」の最後の方に出てくる「(アカウント情報)」については、自分のノートリンクを確認して、自分のアカウント情報に置き換えて下さい。
例:"evernote:///view/00000000/s000/"
// 表示の更新抑止 disabledraw; //検索バッファを変数に退避 $b=searchbuffer; #s=searchoption; //クリップボードから変数を読み込む beginclipboardread; $noteTitle = getclipboard; $grepSentence="\.\*" + $noteTitle + "\.\*\\f\\n"; //一行化 setcompatiblemode 0x0F; begingroupundo; replaceallfast $grepSentence , "\\0\\t" , regular, nocasesense; if( ! result ) beep; endgroupundo 1; //元ウィンドウのハンドルを取得する #hwnd=hidemaruhandle(0); //grep localgrep $noteTitle,casesense; clearupdated; #h=hidemaruhandle(0); //前後の削除 setcompatiblemode 0x0F; begingroupundo; replaceall "^.*{" , "" , regular, nocasesense, nohilight; if( ! result ) beep; endgroupundo 1; begingroupundo; replaceall "}" , "" , nohilight; if( ! result ) beep; endgroupundo 1; //ノートリンク化 setcompatiblemode 0x0F; begingroupundo; replaceall "^.*\\f\\n" , "\\0/\\0/\\n" , regular, nocasesense, nohilight; if( ! result ) beep; endgroupundo 1; begingroupundo; replaceall "^" , "evernote:///view/(アカウント情報)" , regular, nocasesense, nohilight; if( ! result ) beep; endgroupundo 1; //変数に退避しておいた検索バッファを戻す setsearch $b,#s; //新ウィンドウのハンドルを取得 #hwnd_new=hidemaruhandle(0); //元ウィンドウを閉じる(強制的に) closehidemaruforced #hwnd; endmacro;
既知の制限事項
- 秀丸マクロにキーワードを取り込む際に、クリップボードを経由しているため、クリップボードが上書きされる。
- ノートタイトルに記号が入ると、途中で文字列が切れたり、最後まで動かなかったりすることがある。
bluewind上で作業を繋げる
bluewindとはどんなソフトか?
一言で表現すると「コマンドライン型ランチャーソフト」
ご存じない方には、とゆさんの記事がわかりやすいと思います。
まるでどこでも窓!bluewindを紹介します [ とゆ空間 ]
例えば、「Evernote」というキーワードでEvernoteアプリを登録しておけば、
- ショートカットキーでbluewindを呼び出して
- bluewindの窓に「ev」と打ち込みEnter
という少ない手間でEvernoteアプリが起動する、という痒いところに手の届くランチャーです。
自分がよく使うアプリや、アプリ以外にもEvernoteのノート等をいくらでも自分の好きなキーワードで登録できます。しかも使わない時には邪魔にならない。
手放せないツールの一つです。
bluewindにて各処理を実行するコマンドを作る
まず、bluewindで新規コマンド登録をする際の、私のデフォルト設定を示しておきます。
特にいじってなかったと思うので、新規インストールされたままなら同じ設定がデフォルトになっていると思いますが、念のため。
以降、この設定から変更が必要な部分についてのみ記載します。
見出し部分の(数字)より後の部分がbluewindの「キーワード」になっています。下記の「(0)getText」で言うところの「getText」部分。
(0)getText
まず、ファイルからクリップボードへ文字列を取り込むためのツールを用意します。
bluewind&単機能ツール集 再配布所
上記リンクの下の方に「クリップボード関連」「テキスト取得」の「gettext.zip(220KB)」をダウンロードして、適切な場所に展開します(私の場合はbluewindを置いているフォルダの近くに置いています)。
展開後のフォルダ内「getText.exe」をリンク先にして「getText」 というキーワードで登録します。これをやっておくと、bluewind内においては「getText.exe」を呼び出すのに「getText」というキーワードを指定すれば済むようになります。
なお、下記の(3)の手順で直接「getText.exe」を指定してやるならば、この「getText」 というキーワードで登録する手順は不要です。
(1)createSingleNote
リンク先:C:\Shared\Dropbox\Apps\bluewind_共通\bat\createSingleNote.bat
パラメータ:(無し)
起動したプログラムが終了するまで待つ:オン
これは、「(1)ENScript.exeを使って、ノートタイトルを指定して新規ノートを作成」で作ったbatファイルです。
(2)syncEvernoteLogOutput
リンク先:c:\program Files\evernote\evernote\ENscript.exe
パラメータ:syncDatabase /l C:\tmp\syncDatabase.log
起動したプログラムが終了するまで待つ:オン
(3)getNoteTitleToClipboard
リンク先:getText
パラメータ:C:\tmp\TitleContent.txt
起動したプログラムが終了するまで待つ:オン
(4)getSingleNoteLinkHidemaruMacro
リンク先:c:\program Files\hidemaru\hidemaru.exe
パラメータ:/xgetSingleNoteLink.MAC C:\tmp\syncDatabase.log
起動したプログラムが終了するまで待つ:オン
「getSingleNoteLink.MAC」が、「(4)ノート情報部分を切り貼りしてノートリンクに仕上げる」の秀丸マクロです。秀丸の「マクロファイル用のフォルダ」に置きます。
秀丸のマクロファイル用のフォルダの場所は、秀丸のメニューの「その他」→「動作環境」→「環境」で確認できます。
グループにまとめる
bluewindには「グループ機能」があり、複数のコマンドを順に実行させることが簡単にできます。
[bluewind] 1つのコマンドでらくらくルーチンワーク!グループ機能の使い方 [ とゆ空間 ]
上記のコマンド達を順に実行させるため、createNoteGetLinkというグループを作り、上記2.のコマンド達を(1)~(4)の順に並べ、グループの設定を下記のようにします。なお、(0)はグループに入れる必要はありません。
「入力時のパラメータにキーワードを使う」はオフ
「ワイルドカードを展開して渡す」はオフ
こうしておいた方が、ノートタイトルに予期せずキーワードやワイルドカードを使ってしまった際にも正常動作を期待しやすくなるのではないかと思っています。
ちなみに、元々オフになっている「全てのコマンドに同じパラメータを渡す」をオンにしてしまうと、syncEvernoteLogOutputが動かなくなったりします。ご注意を。
これで動くはずです。「createNoteGetLink (ノートタイトル)」とbluewindに打ち込むと、順にコマンドが実行され、最後にノートリンクが秀丸に表示されるはず。
コメント