2018/01/15

Google Homeを使って毎朝の血圧記録を楽にしてみよう(一応完成編)


Google Homeを使って毎朝の血圧記録を楽にしてみるプロジェクト。第2弾は一応完成編です。


前回の試行錯誤編では、Google Homeから血圧を「(収縮期血圧)の(拡張期血圧)」という文字列でGoogle Sheetsのスプレッドシートに記録するところまでは完成しましたが、IFTTT/Google Homeの連携部分のバグにより、タイムスタンプが記録されないという問題が発生していました。


また、自動でタイムスタンプを付加するスクリプトの場合、後でデータを加工するときに不具合が発生する可能性がありました。

もう一段階アクションを加えてみる

IFTTTとGoogle Sheetsを単純に連携させればタイムスタンプを記録することができるわけですから、いったんスプレッドシートに記録したら、その内容を別のスプレッドシートにコピーするようにすれば、そのタイミングでタイムスタンプが記録されるわけです。

つまり、こんな感じでいけるんじゃないかと、ひらめきました。



眺めてみますと、Google SheetsからGoogle Sheetsにコピーするのに、IFTTTを使う意味が分かりませんw

要するに、ここはGoogle App Script(GAS)でなんとかしろってことですね。

ついでに「110の80」となっているのを、「110」と「80」と分割して記録するようにしてしまえば、一石二鳥です。

完成版の概念


完成版はこんな流れになりました。



スクリプトを作ってみる

データの受け渡しをする一時ファイルのスプレッドシートに、スクリプトを仕込んでいきます。配列とか四苦八苦しながらなんとか書き上げました。
お見苦しい感じですが………
function onChange() {

  //日付を取得
  var date = Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyy/MM/dd H:m:s');
  //一時シートと取得データを定義
  //シート名'data'のA1セルからデータを取得

  var sheetFrom = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('data');
  var rangeFrom = sheetFrom.getRange("A1");
  var value = rangeFrom.getValue();

  //出力シートと出力行を定義  //openByIDを用いて出力ファイルを定義
  // シート名'data'の最終行に出力するようにする
  var sheetTo = SpreadsheetApp.openById('hogehogehogehoge').getSheetByName('data');
  var lastrowTo = sheetTo.getLastRow();

  //'の'で文字列を分割して配列化
  //'の'がないときは、入力されたデータとNullで配列化
  try{
    var setValue = value.split('の');
  }catch(e){
    var setValue = [
      [value,'']
      ];
  }

  //時刻を挿入
  setValue.unshift(date);

  //GASの仕様に合わせて2次元配列化
  var arr=[[]];
  for (var i=0; i<setValue.length; i++) {
    arr[0].push(setValue[i]);
  }

 //配列データをセルに書き込み 
  sheetTo.getRange(lastrowTo+1,1,1,arr[0].length).setValues(arr);

  //一時シートのデータを削除
  sheetFrom.deleteRows(1,1);
}
hogehogehogehogeとなっているところには、書き出し先となるスプレッドシートのIDを入れます。

ブラウザでスプレッドシートを開きますと、 https://docs.google.com/spreadsheets/d/(ID)/edit#gid=0 のようになっていますが、この(ID)となっている部分が、スプレッドシートのIDです。

これを保存した後に、プロジェクトのトリガーを設定します。

「編集」「現在のプロジェクトのトリガー」で、「スプレッドシートから」「値の変更」を選択。


これで、データが入力された際に、スクリプトが起動するようになりました。

IFTTTの設定


前回はIFTTTを用いて、Google Sheetsにデータを追加していましたが、今回は、一時シートにはデータを残さず、常にA1セルにデータを上書きしますので、右側の「Update cell in spreadsheet」を使います。


IFTTT上でフォルダのパスと、一時ファイルの名称を設定すれば完成です。

早速、Google Homeに「血圧 110の80」と話してみましょう。


無事、時間と収縮期血圧、拡張期血圧が記録されました。

おまけの設定

機能としては完成しましたが、音声誤認識があったりすると怖いですので、最終的に登録されたデータをSlackで通知するようにしました。

記録ファイルに行が追加されたら、その内容をSlackに通知するようにIFTTTに設定しました。


おわりに

正直もっと簡単にできると思っていたのですが、思ったより大ごとになってしまいました。最終的に、Google App Scriptまで手を出してしまいましたが、ここまでやるのであれば、IFTTT無しでいいんでないの?という疑問もあります。

Googleは、Google Home(Google アシスタント)で独自のアプリを作れる「Actions on Google」という環境を用意していますので、余裕があったら触ってみようと思います。