classics.

2022/06/15 Wedflickr

Google フォーム、Google カレンダー、Google Apps Scriptを使って賞味期限ドリブンで献立を決める試み

gyazo

賞味期限自体は記録していたとしても、直前に気づいて一気に消費するよりは計画的に食品を消費したいという気持ちがあり、それを解決するために、タイトルの通りいつ何を何個食べればいいのかを勝手に決めてくれるような予定をGoogle カレンダーに突っ込んでくれる仕組みを作ってみた。

gyazo

予定の詳細に賞味期限情報が記録されてるので、自動で定期的な予定として登録されたあとに個別の日付の予定を手動で変更するとかもGoogle カレンダーのWeb UIでできるしそこそこ便利に使えるのではないかと期待。

gyazo

普通のGoogleアカウントでのGoogle フォームはテンプレートして共有できないようなのでスクショだけれど入力フォームはこんな感じで、雑に書いてとりあえず動いてるコードは以下(フォーム送信時のトリガーに設定する)。以前は広く募集したいのでGoogle フォームを登録インターフェースとして採用したけど、よく考えれば今回は基本個人用途なのでGoogle フォームとかよりchat botとかの方が便利度ありそうなものの、とりあえずすぐできそうだしGoogle製品で完結するのでGoogle フォームでやってみたというところ。

function onSubmit(e) {
  var calendar;
  var calendars = CalendarApp.getOwnedCalendarsByName("賞味期限管理");
  if (calendars.length == 0) {
    calendar = CalendarApp.createCalendar("賞味期限管理");
  }
  else{
    calendar = calendars[0];
  }
  var form = FormApp.getActiveForm();
  var allResponses = form.getResponses();
  var latestResponse = allResponses[allResponses.length - 1];
  var response = latestResponse.getItemResponses();
  var payload = {};
  for (var i = 0; i < response.length; i++) {
      var question = response[i].getItem().getTitle();
      var answer = response[i].getResponse();
      payload[question] = answer;
  }
  var kigen = new Date(Date.parse(payload["賞味期限"]));
  var name = payload["品名"];
  var amount = parseInt(payload["個数"]);
  var place = payload["保管場所"];
  var today = new Date();
  var count = 1;
  var oneday = 1000 * 24 * 60 *60;
  if (kigen < today) {
    count = amount;
  }
  else {
    while (Math.ceil((kigen - today) / oneday) < amount / count) {
      count ++;
    }
  }
  var interval = Math.max(Math.floor((kigen - today) / oneday / (amount / count)), 1);
  var rule = CalendarApp.newRecurrence().addDailyRule().interval(interval).times(Math.max(Math.ceil(amount / count),1));
  var option = { "description":  payload["賞味期限"] + "までに" + name + "を" + amount + "個食べる" };
  if (place != null && place.length > 0) {
    option["location"] = place;
  }
  calendar.createAllDayEventSeries(name + " を" + count +"個食べる",
    new Date(today.getTime() + interval * 1000 * 24 * 60 * 60), rule, option);
}

ということでどうせ似たアプリとかはあったとしてもGoogle カレンダーに登録してくれるのはないだろいうという思い込みにより下調べせずに作ってみたけれど、計画的に消費というところに注目して勝手にいつ食べるか決めてしまうところまでする機能を持ったものも今のところ見つけられてないので概ね良さそう。一人暮らしだと計画的に消費というのが必要になるけれど一家の食生活となると一回の食事で何人前も消費できるのでそんな計画性が必要なく、賞味期限前に気付ければいいというのも大きそうだけど。

2018/12/19 Wedflickr

Google Apps Scriptを使ってAmazonの注文履歴をGoogle Spreadsheetsに保存するようにした

capture20181219015231691

Amazonの注文履歴はAPIがないのでMechanizeでスクレイピングして @oquno_shopping に投げているのだけれど、ちょくちょくログインのCAPTCHAに阻まれて辛かったので、手始めにGmailに届いたAmazonの注文履歴をパースしてSpreadsheet(6年前くらいにGoogle Sheetsにリネームされたとかいう話も見るけれどひとまずSpreadsheetsと呼ぶことにする)に保存していくという部分の自動化がざっくりできたので公開してみる。

どうやってるかというと正規表現でゴリ押しなので仕様が変わったら崩壊するけどスクレイピングでCAPTCHA入れなくて済むのならいいかという気持ちです。正直誰か書いてると思ってたけど軽くググった限りではなかったのと、ゴリゴリ正規表現になるので日本版でしか使えないのがあまり汎用性ない。

ということでGoogle Apps Script使うのだるいという人は手動でお試しできるフォームも作ってそこにライブラリのIDとかも書いておいたのでチェックしてくれ。リンク先でGmailとSpreadsheetの操作許可を求められる仕様だけどボタン押すまで特に読み書きしないし自分にはスクリプトが実行されたとかエラーがあったという程度までしか情報はこないので安心できる人は安心していじってください。その他注意等はリンク先に書いた。

https://script.google.com/macros/s/AKfycbyAwCca0txvvHlxQe2Ir-zxCiIHygqgvtMgOztwKC1QbWT6iOr0/exec

その他既知の問題・課題

  • たまに商品名が販売元になってる(正規表現がおかしい?)
  • 注文一覧・発送情報一覧・商品一覧でシートを分けない方がいいのかもしれない
  • 注文一覧も時系列にソートしたいかもしれない
  • HTMLメールじゃないとちゃんと対応していない(ASIN とかはテキストメールに入ってないし仕方ない)

そして今後の展望としては oquno_shopping に投げるのもサクッとそのへんの GAS 用 Twitter ライブラリ使って置き換えて、あと他のショッピングサイトの注文履歴にも対応したい。

2018/05/17 Thuflickr

Google Apps Script をやっていっている

長らく手を出さないでいたYahoo! PipesでiCalを作る代替としてGoogle Apps ScriptでスクレイピングしてGoogle Calendarをつくるというのにようやく着手した。最終的には正規表現でゴリゴリやるのだけど、ある程度自分用ライブラリもできて量産体制に入っている。

https://scrapbox.io/oquno/Google_Apps_Script%E3%81%A7%E3%82%B9%E3%82%AF%E3%83%AC%E3%82%A4%E3%83%94%E3%83%B3%E3%82%B0%E3%81%97Google_Calendar%E3%82%92%E4%BD%9C%E3%82%8B

↑にノウハウと作ったカレンダーをまとめている。ライブスケジュール以外にも出町座の上映スケジュールなんかもGoogle Calendar化したりしてるのでふと出先で映画見たくなっても何やってるかすぐわかって便利。

2017/08/12 Satflickr

ブログの新着を投稿するTwitterアカウント作った

主にSEOのため実験的に。ポリシーとしては、人間が投稿するアカウントと分けるというのと、Twitter Cards対応してるのでURLだけ投げてタイトルをわざわざ投稿しない。前者は、特に興味のない人に読ませたくて書いてるわけではないというのと、個人の感想として人間の書いてるアカウントにごちゃごちゃ別の投稿が混ざってるのが嫌いなので。後者はTwitter検索とかまで含めてSEOしたいとなると含めた方がいいのだろうけれどクロールさせるのが主な目的なので別にいいというのと、TwitterのUXとしてTwitter Cardsが提供されてるのに再度タイトルを書くのは知性がないという考えによるもの。あと最近ゴミスクリプトをあんま書いてないのでリハビリの手始めとしてというのと、livedoor Readerがついに終わってしまうので一応RSS以外のチャンネルも用意するかという気持ちもある。

2016/08/15 Monflickr

HerokuにデプロイするWebアプリを作りたいメモ

技術的には大したことなくて、大して使われないはずなのでHerokuの無料枠にでも置くかなという感じのWebアプリを作りたくなっているのでそのための事前準備メモ。Heroku使ったこと無いので。

  • Rails前いじったりしていけそうな気がするのでRailsでやる
  • 手元に仮想環境作ったりめんどいので開発作業はさくらVPSでやる
  • TODO: Herokuで使えるRubyとRailsとかのバージョン確認する
  • TODO: 何かあった時のためにHeroku脱出手順も確認
  • DB は無料枠で使えるのがあるらしいので確認

2016/04/26 Tueflickr

Google Latitude の Badge の代わりに Public Location Badge が便利

Google Latitude が終了して3年くらいだけれど現在地を Web API 的に取得できる方法が未だになくて Twitter IRC Gateway からの投稿に現在地の位置情報を付加する機能を停止していた昨今だけれど、Public Location Badge という代替になりそうなのを見つけたので復活させることができた。

http://www.publicbadge.com/

仕組みは Google Latitude と同じで、Android 端末にアプリをインストールして ID を取得したら専用のページを Web Badge として iframe で埋め込んで使えるというもの。JSON をロードしてるのも同じなので、エンドポイントだけ変えれば前のコードがそのまま使える。動かなければ更新間隔も調整してくれてるっぽいのでそんな激しく電池が減ることもなさそう。

ちなみに Google Maps の Timeline から KML を取得するとかも試してはみたのだけれど、キャッシュが効きすぎているのかせいぜい数時間前とかしか取れなくて諦めた。Google Latitude の現在地共有機能は Google+ で使えるし、履歴は Google Maps の Timeline が便利なので、とりあえず Google Latitude が終わって困っていたことはなくなったはず。

2016/04/26 Tueflickr

適当に apt-get upgrade してたら CPAN モジュール再インストールする羽目になったのでメモ

Perlはtiarraとこのブログしか使ってないのだけど、いつの間にかPerlのバージョンが上がってたのかなんかおかしくなっててCPANモジュール再インストールしたのでメモ。もしかしたらまだ足りないかもしれないけど…。

  • Serene Bach
    • Jcode
    • LWP::UserAgent
    • XML::Atom
  • tiarra関係
    • JSON
    • Crypt::SSLeay

2015/07/20 Monflickr

gem で taglib2 を入れるのに失敗する

自宅オーディオプレーヤーの復活を大分先延ばしにしていたので再度着手している…。taglib2 入れようとしたら native extension どうこうでこけたので、その対処をメモ。

$ sudo apt-get install libtagc0-dev

したら普通にいけました。参考 http://stackoverflow.com/q/28418864

2015/06/13 Satflickr

Amazon のログインリンクが変わった気がするので Mechanize で対応したメモ

agent.page.link_with(:text => "サインイン")

で動いていたのだけれど動かなくなっていたので

agent.page.link_with(:text => /サインイン/)

にしたら動くようになった。なんかJSで頑張るように更新されてる気がする。

2015/04/21 Tueflickr

mongo gem を 1.12.0 から 2.0.2 に上げた際にはまったこと

リハビリとして sinatra アプリでも書こうと思って Ruby を 2.2.2 に上げたり gem 入れなおしたりしてたら mongo gem ではまって、find_one メソッドが消滅していた。