kei-s@ブログ苦手

苦手だけど書くときは書きます

定期的に買う必要があるものをアラートする仕組みを作った #家庭を支える技術

このエントリは、家庭を支える技術 Advent Calendar 2014 の一日目です。

「家庭を支える技術 Advent Calendar」とは

エンジニアの友人たちとおしゃべりしているうちに、各ご家庭の生活を豊かにするためにしている技術的な工夫や、これからやりたいアイデアが話題に上がることが多くありました。そんななか、誰が言い出したか『家庭を支える技術』というキーワード*1が出てきていました(もちろん元ネタは WEB+DB PRESS plusシリーズ の「〜を支える技術」です)。
仲間うちだけでも面白い話が出てくるので、いろんな家庭の話を聞いてみたいとおもい、せっかく12月なので「家庭を支える技術 Advent Calendar」として世に問うてみた次第です*2
ありがたいことに公開から数日で全日程が埋まり、「家庭を支える技術」への関心の高まりを感じています。

定期的に買う必要があるものをアラートする仕組みの話

本題です。事前に Adventar に予告した話とは変わってしまいました。

私達の家庭での課題のひとつに、消耗品の入れ替え、買い替えを忘れがち、というものがありました。例えばゴミ箱のニオイとりや防虫剤のような、3ヶ月・半年に一度交換するようなものです。入れ替えすること自体を忘れてしまって、いつの間にか効能が切れてニオイが発生したりするなど、イヤな体験が何度かありました。

この課題に対応するために、まず「買い忘れない」というところから始めることにしました。Amazon からモノが届けば、入れ替え作業を忘れることはなさそう、ということにしました。
解決方法はいくつかあると思いますが、私達の家庭ではこのような技術をつかって解決することにしました。

  • Google Spreadsheet に、消耗品と買い替えサイクルの期間を記録する
  • 別のシートに、消耗品を買ったログを残していく
  • Google App Script を使って、最後に買ってからサイクル期間が過ぎていたらメールを投げる

なぜ Google Spreadsheet かというと、ウチで流行っているからです。実際、「データ投入と編集が簡単」「運用コストがゼロ」「Google App Script で結構いろいろできる」という利点があります。

買い替えサイクルのシート

f:id:kei-s:20141201200354p:plain

こんなかんじです。ASIN カラムと商品名カラムは手入力ではなく、IMPORTXML関数でA列のURLのHTMLをフェッチし xpath で切り出して自動入力にしています。

B2 のセル
=IMPORTXML($A2,"//*[@id='ASIN']/@value")

C2 のセル
=IMPORTXML($A2,"//*[@id='productTitle']")
購入記録のシート

f:id:kei-s:20141201201255p:plain

こちらも同じく、C列、D列はIMPORTXML関数を使って自動入力です。Amazon の商品ページの URL は、商品名が入っていたりと正規化が大変なので、商品ページから ASIN コードを切り出すことで一致をラクにしようという意図です。

最後に買ってからサイクル期間が過ぎていたらメールを投げる Google App Script

Google Spreadsheet のメニューから、「ツール」→「スクリプトエディタ」を選択してエディタが開きます。ここの JavaScript を使ってスクリプトを書くことで、シートのデータを取り出したり加工したりなど、いろんなことができます。
スクリプト自体は https://gist.github.com/kei-s/322aeb83f9284396734a にあります。MailApp.sendEmail メソッドを使えば、自由にメールを投げることができます。
また Google App Script では、いわゆる crontab のような時間によるトリガーを作ることができます。上記のスクリプトを一日一回トリガーすることで、もし買う必要があるものがあればメールを投げるようにしました。

f:id:kei-s:20141201204441p:plain

購入記録を投入する Google Chrome extension

購入記録を簡単に投入するための Google Chrome extension も作りました。

f:id:kei-s:20141201202741p:plain

ソースコードhttps://github.com/shiratsuchi/sorosoro-alert です。Amazon の商品ページで「購入ログに記録する」を押すと、ページの URL をポストします。ポストするのは URL だけで、ASIN や商品タイトルの切り出しは面倒なので先のとおり spreadsheet 側でやっています。

この Spreadsheet はプライベートにしているので、そのままだと API 経由でデータを投入することはできません。
そこでまた Google App Script を頼ります。Google App Script には「Web アプリとして公開する」という機能があります。スクリプトで GET や POST を受け取る処理を書き「Web アプリとして公開する」と、GET/POST 先のエンドポイントが与えられます。

まず、POST を受け取って購入記録シートにデータを追加する、というスクリプトを書いて公開し、Chrome 拡張でオプションから POST 先のエンドポイントを登録できるようにしました。
これで、プライベートなシートにデータを投入することができるようになりました。
Google App Script 側のスクリプト
https://gist.github.com/kei-s/69e65376c37202e103db です。*3

まとめ

Google Spreadsheets を使って、定期的に買うものをアラートする仕組みをつくりました。また Google Chrome で簡単に買ったものを記録する拡張をつくりました。
この仕組み一式を共有したいのですが、Spreadsheet のデータ以外の関数セットやスクリプト一式を簡単に使う方法ってあるのでしょうか...?

明日 12/2 は @negipo さんです。

*1:いましらべたら @darashi さんが初出だった様子

*2:技術評論社さま、いつもお世話になっております。パロディ的なタイトル、ご容赦ください。

*3:https://mashe.hawksey.info/2014/07/google-sheets-as-a-database-insert-with-apps-script-using-postget-methods-with-ajax-example/ を参考にしました。