Posted at

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

More than 1 year has passed since last update.


はじめに

Google Home、IFTTT、Googleスプレッドシートを使って独自音声コマンドでログをとる(ついでにNode.jsやngrokやらも使ってLINEやGoogle Homeに通知する)

を読んでいて、痛み止めのような頓服的な薬(一日n回まで、前回からn時間以上経過後服用可能)のチェックに使えないものかと作成してみた。


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

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


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



必ず日付情報は最後の行に一旦書き込まれます


服用チェック


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