Evernote のノートは HTML 形式でエクスポートできるが、そのままでは編集しづらいので Word 文書にできないか? という相談を受けたので、調べてみた。
基本的には、
- Evernote で対象となるノートを選択し、「複数の Web ページファイル (.html) でエクスポート」にてエクスポート
- Word で HTML ファイルを開き、Word 文書 (.docx) として保存しなおす
でいけるような気がしたが、 手動でいちいち変換するのは面倒なので、VBScript でまとめて処理できるようにしようとした。
ところが、VBScript に不慣れなのと、思わぬ問題も出てきて試行錯誤が必要になったため、その覚え書きとして記事の形にまとめておく。
EvernoteHtmlToWord (VBScript)
最終的にできあがった、Evernote からエクスポートした HTML を Word 文書化するための VBScript。
github.com
使い方
- Evernote から、ノートを HTML Web ページファイル (.html) 形式でエクスポートする(このとき、オプションとして、「作成日」にチェックを入れておく)
- EvernoteHtmlToWord.vbs に、1. でエクスポートした *.html(もしくはそれを含むフォルダ)をドラッグ&ドロップすると、同じフォルダ内に「<作成日を元にしたタイムスタンプ>-*.docx」が出力される
VBScript の処理内容と試行錯誤など
やっていることは、ドラッグ&ドロップされた *.html ファイル(もしくは、フォルダ直下に含まれる *.html ファイル)を順に Word で読み込み、Word 文書 (*.docx) 形式で保存しているだけ……なのだけれど、意外と苦労した。
画像が外部参照になってしまう
Word で HTML を読み込み、そのまま形式を Word 文書 (*.docx) として保存しただけだと、画像が外部ファイルへのリンクのままとなってしまう。
文書内に画像を埋め込もうとすると、 Word 上の操作では、
「ファイル」タブ→(右側の「関連ドキュメント」の)「ファイルへのリンクの編集」で、『種類:図』のリンク元ファイルを選択し[リンクの解除]を実施、「☑ 文書に図を保存する」にチェックをして[OK]をクリック
となるような処理を、VBScript 上でも行う必要があった。
Sub EmbedImages( objDocument ) For Each objShape In objDocument.InlineShapes If Not objShape.LinkFormat Is Nothing Then objShape.LinkFormat.SavePictureWithDocument = True objShape.LinkFormat.BreakLink End If Next End Sub
ファイル名にタイムスタンプを付けたい
ファイル名で並べたときに、時系列順にしたいという要望があった。
これは、Evernote からエクスポートした際、オプションで「☑作成日(C)」にチェックして、*.html ファイル内に「作成日」等を埋め込み、これをファイル名に反映することで対応。
地味に、Wordの全テキスト取得方法を調べるのに手間取った……
Function EvernoteTimeStamp
ファイルの作成日時・更新日時を変えるようにした方がよかったかも?
→更新日時については変更するようにしてみた(作成日時は変更方法がわからなかった)
タイムスタンプの時刻が一桁のときがある
Evernote からエクスポートした *.html の作成日は、「作成日: 2016/11/19 2:34」のように、時刻が一桁の時があるが、ファイル名に使うなら 0 パディングしたかったので、処理を追加。
Function PadLeft
※参考:まいてっくぶろぐ - 【VBS】文字列が指定桁数に満たない場合、0詰めする関数 等
作成日がうまく取得できない(日本語文字列が検索でひっかからない)
"作成日[^\d]*(\d+)/(\d+)/(\d+)[^\d]*(\d+):(\d+)" のような日本語を含む正規表現で検索しようとすると、うまくいかない。
これは、VBScript ファイル (EvernoteHtmlToWord.vbs) を UTF-8 で保存していたため。
ファイル形式を Unicode に変更すると、うまく検索できるようになった。
ファイル形式は Shift JIS でも可。
ファイル名が原因で変換されないファイルがある
ドラッグ&ドロップで指定したファイルのいくつかが変換されていなかった。
調べてみると、ファイル名に『〜』(U+301C)や『プ』(U+30D5 U+309A)等の文字が含まれる場合には、うまく変換できない模様。
これはどうも、WScript.Arguments からファイル名を取り出した時点ですでに化けてしまっているらしく、<FileSystemObject>.FileExists() が False を返す。
当該ファイルを直接ドラッグ&ドロップする場合にはうまい解決策が見つからなかったが、それらのファイルが入ったフォルダをドラッグ&ドロップし、<FileSystemObject>.GetFolder() で取得した Folder オブジェクトのFiles コレクションからパス名(.Path)を取得するようにすると、こちらはうまく処理できる模様。
ドラッグ&ドロップするファイル数が多すぎると実行できない
ファイルをドラッグ&ドロップで指定する場合、数が多すぎると「実行できません。引数一覧が長すぎます。」というダイアログが出て、実行できない模様。
VBScript の制限だと思われる。自分の環境では、495ファイル以上でファイルで発生(494ファイルはOK)。これがマジックナンバーなのか、その他の要因があるのかは不明。
この場合は、対象ファイルが入ったフォルダをドラッグ&ドロップしてやれば、その中に495ファイル以上の *.html があっても、実行可能。