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