とにかくサクっとメモりたい!
最近は,というかもう何年も前からですが、私は何か知りたいことがあったらとりあえずググる癖がついています。目の前の本に載ってると分かってる情報でもググります。だってその方が楽で速いから。
ググった情報をメモる時にはEvernoteをよく使います。
簡単にクリップできるブラウザの機能拡張があるし、保存の仕方もフルページ、簡易版、ブックマークとか保存の形式も色々選べて便利。一カ所で完結してる情報をメモる用途にはバッチリです。
ただ、色んなページから細切れの情報をちょこちょこコピペして来るような時にはちょっと不便なんですよね。
Evernoteではクリップする度に新しいメモが作られるので、10個の情報があると10個のメモができちゃいます。後からマージもできるのですが、細かい情報の寄せ集めは、できればひとつのメモに追記していきたいです。
ローカルなメモ帳とかGoogleドキュメントとかにコピペするときもありますが、これがまぁ面倒くさい。
テキストを選んでコピーして、アプリやウインドウを切り替えてペーストして、またアプリを切り替えて、の繰り返し。ザ・単純作業という感じです。
選択したテキストをワンタッチでどんどん追記
というわけで、こういう情報収集作業をちょっとは楽にしようとして作ったのがこのAutomatorのクイックアクションです。
操作は、
ブラウザでメモりたいテキストを選択
右クリックメニューの[サービス]からこのクイックアクションを起動(もしくはショートカットで起動)
これで終わり!
この作業を繰り替えすと、あらかじめ設定したGoogleスプレッドシートに、選択したテキストが追記されていきます。ついでに日付も付けてあります。Googleドキュメントに保存してもいいのですが、断片的な情報はスプレッドシートの方が後処理がしやすいかなと思ってスプレッドシートにしてあります。
さっき挙げたようにあちこちのページから小さな情報を集める時にはとにかく便利です。
AutomatorクイックアクションとGoogle Apps Scriptの組み合わせ
この追記メモは、Macの自動実行機能であるAutomator クイックアクションとGoogle Apps Scriptの組み合わせで実現しています。
Automatorクイックアクションとは右クリックやアプリケーションメニューの[サービス]に登録できるスクリプトです。
今回作ったAutomatorクイックアクションでは、テキストをURIエンコードしてcurlでGoogle Apps Scriptのアドレスにpostします。
Google Apps Scriptは、postされたデータからテキストを取り出して、Googleスプリッドシートに追記します。
Google Apps Script(GAS)はいわゆる"サーバーレス"という実行環境で、面倒なサーバー管理をしなくてもサーバー的な処理が行えます。
GASのいいところはドキュメントやスプレッドシートなど様々なGoogleサービスと連携・自動化できることです。
今回はGoogleスプレッドシートにデータを保存することで、データベースとかファイル保存といった複雑な処理を書く必要がなくなります。
保存したデータをどの端末からでも見られるとか、セキュリティ対策が自動的に施されるといったメリットもあります。
Google Apps Scriptの欠点は実行が滅茶苦茶遅いことです。複雑な事をさせたい時にはサーバーへのリクエスト回数を最小限にしてなるべくブラウザ側のJavascriptで処理させるといった工夫が必要です。
テキストをURIエンコードしてpostするAutomatorワークフロー
Mac側のAutomatorクイックアクションは次のようになっています。
1.ブラウザ上でテキストを選択してサービスメニューからクイックアクションを起動
2.コピーしたテキストを受け取ってstdinへ渡す(Automator ワークフローの一番上の設定)
3.sed で改行コードをlinux/macの"\n"に統一(シェルスクリプトを実行)
[入力の引き渡し方法]を[stdinへ]としてあるので、上のステップから受け取ったテキストがsedの入力として渡されます。
sed -e 's/\r?\n/\\n/'
Macのsedは標準と違うらしくて、たまに使うと苦労します。とりあえずこれで動いてます。
4.perlでテキストをURIエンコード(シェルスクリプトを実行)
改行の混じった複数行にわたるテキストをきちんとURIエンコードしてPOSTするのに苦労しました。なかなか改行がGASに渡せないのです。いろんなエンコード手法を探して試してみた結果、以下のブログにあるperlを使った変換がうまくいきました。
モザイク部分は投稿するGoogleスプレッドシート固有のアドレスです。
テキストファイルを URL エンコードして保存する perl のワンライナー – OTCHY.NET
5.URIエンコードしたテキストをcurlでGoogle Apps Scriptにpost
data=`cat | perl -ne 's/([^\w ])/"%".unpack("H2",$1)/eg;s/ /%20/g;print;'` curl -F "memo="$data -L https://script.google.com/macros/s/******Google Apps Script
memoパラメーターに記録したいテキストを設定してpostします。
curlコマンドに設定するアドレスはスプレッドシートに固有のものです。アドレスはGoogle Apps Scriptで"Webアプリケーションとして導入"するときに表示されます。
6.通知センターにお知らせ
AppleScriptでMacOSの通知機能を呼び出しています。
引数 input にはサーバーから返されたpostリクエストの結果が入っています。通常は"done"となります。
on run {input, parameters} display notification input with title "memo" subtitle "to google spread sheet" sound name "Purr" end run
postされたデータをスプレッドシートに追記するGoogle Appls Script
Google側にMacからcurlコマンドでpostされたデータを受け取ってスプレッドシートに書き込むスクリプトを設定します。
Google Apps Scriptは、スクリプト単体で作る場合と、スプレッドシートやドキュメントにスクリプトを添付する場合があります。
出来ることにはそんなに違いはないと思いますが、スプレッドシートやドキュメントに付随したスクリプトだと、自分の属する書類へのアクセスが簡単になります。
例えば SpreadsheetApp.getActiveSpreadsheet();
というコードひとつで自分の属するスプレッドシートのオブジェクトが取得できます。
独立したスクリプトの場合はアクセスしたいシートやドキュメントを固有のIDなどで指定する必要があります。
今回はスプレッドシートにスクリプトを設定します。
データを記録するスプレッドシート上で[ツール][スクリプトエディタ]を選択してスクリプトを入力します。
1.postされたデータからパラメータ"memo"を取り出してURIデコード
Google Apps Scriptでは、doPost()関数を使ってpostリクエストの処理を設定します。
e.parameter.memoでmemoパラメーターを取り出して、decodeURIcomponent()でデコード、日付(変数 now)と一緒にスプレッドシートの最後に追記しています。
たったこれだけでサーバー的なWebアプリができるのですから、便利なものですね。
2.デコードしたテキストをスプレッドシートに追記
function doPost(e) { var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet = ss.getSheetByName('シート1'); var memo = e.parameter.memo; // シートの最後に値を追加 var now = new Date(); sheet.appendRow([now,decodeURIComponent(memo)]); return ContentService.createTextOutput('done'); }
最後に"done"という結果を返します。Mac側ではこれを受け取って通知センターに表示します。
3.Webアプリケーションとして導入
出来たスクリプトを動作させるには"Webアプリケーションとして導入"をする必要があります。
Google Apps Scriptのスクリプトエディタで[公開][ウェブアプリケーションとして導入]を選択
GASにはバージョン管理機能があって、コードを変更したときには必ずプロジェクトバージョンを"New"にして公開します。
そうしないと直しても直しても古いバージョンのまま公開され続けるので注意が必要です。
公開時に表示されるURLがAutomatorのcurlコマンドで指定するURLになります。
これで完成。
毎日使うツールではないのですが、たまに情報収集するときに便利です。