GoogleAppsScript
ifttt
GoogleSpreadSheet
GoogleHome

痛み止めの飲み過ぎをGoogleHomeにチェックしてもらう

はじめに

Google Home、IFTTT、Googleスプレッドシートを使って独自音声コマンドでログをとる(ついでにNode.jsやngrokやらも使ってLINEやGoogle Homeに通知する)
を読んでいて、痛み止めのような頓服的な薬(一日n回まで、前回からn時間以上経過後服用可能)のチェックに使えないものかと作成してみた。

Googleスプレッドシートへのrowの追加のIFTTTのレシピ

「this」も「that」もいつもの手順

Googleスプレッドシートの内容

キャプチャ1.PNG
必ず日付情報は最後の行に一旦書き込まれます

服用チェック

addDate.js
function addDate() {
  setDate(1, "yyyy/M/d");
  setDate(2, "H:m:s");
  checkDate();
}

日付と時間をセルにセットした後にcheckDate()を呼ぶように追加しました、

checkDate.js
function checkDate() {
// 宣言
  var lineUrl = "https://maker.ifttt.com/trigger/drug_log/with/key/xxxxxxxx?value1=";
  var googleurl = "https://xxxxxxxx.ngrok.io/google-home-notifier";
  var ansText;

  searchDate(dateRows);//当日と同一日セルの取得

  switch (dateRows.length) {
    case(1):
      ansText = "服用可能です(本日一回目)"
      break

    case(2):
      var dates2 = sheet.getRange(1, 2, lastrow).getValues()
      var m1 = Moment.moment(dates2[dates2.length - 2][0])
      var m2 = Moment.moment(dates2[dates2.length - 1][0])
      var m3 = m2.diff(m1, 'h', false)
      var m4 = 4 - m3

      if (m3 < 4) {
        // 一定時間以上経過していない場合はrowを削除
        sheet.deleteRow(lastrow)
        ansText ="四時間以上間を開けて服用しましょう。あと" + m4 + "時間経過後服用できます"
      } else {
        ansText ="服用可能です(本日二回目)"
      }
      break

    case(3):
      ansText = "服用は一日二回までです。"
      break

    default:
      sheet.deleteRow(lastrow)
      ansText = "服用は一日二回までです。"
      break
  }

  // LINE 
  UrlFetchApp.fetch(lineUrl + ansText);
\
  // GoogleHome
  var payload =
    {
       "text" : ansText
     };
  var options =
    {
      "method" : "post",
      "payload" : payload
    };
  var response = UrlFetchApp.fetch(googleurl, options);

}
  • 当日の行番号配列が一つだけなら一回目メッセージ
  • 2つなら一回目と二回目の時間差を求め(時以下切り捨て)
    • 4時間未満なら警告メッセージ、最終行を削除
    • 4時間以上なら二回目メッセージ
  • 3回目ならエラーメッセージ
  • 4回目以上ならエラーメッセージ、最終行を削除 の判定と行操作を行った後に、LINE Notififyとgoogle-home-notifierへ送信します
searchDate.js
function searchDate(dateRows) {
  var tDate = formatDate(new Date(), "yyyy/M/d");
  lastrow = sheet.getLastRow();
  var dates = sheet.getRange(1, 1, lastrow).getDisplayValues(); 

  for(var lr = lastrow; lr >= 1; lr--){
   if(dates[lr - 1] == tDate){
      dateRows.push(lr);
    }
 }

  return dateRows;
}

今日の日付を取得し、日付行と一致した行番号を配列に追加します
セルに表示している内容を取得するためにgetValues()ではなくgetDisplayValues()

今回ハマったところ

  • MakerChannelに渡すのはLINE NotififyのキーではなくWebhooksのキー
  • google-home-notifierのexample.jsを使用するのであれば、話させたい文字は、"payload" : { "text" : "ほげほげ" }と入れ子になる Class UrlFetchApp

今後に向けて

  • ソースをリファクタリングしたい
  • GoogleHomeに話しかけたら、GoogleHomeに返事、GoogleAssistantに入力したらLINEに返事に分けたい

おわりに

最近IFTTTでGoogleスプレッドシートの行の追加ではなく、セルの値を上書き更新する機能が追加されましたね、セルの値で検索を行い、結果を返してセルの値を消すなんてこともできますね