8
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

はじめに

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

8
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?