あんパン

こしあん派

Google Homeで血圧を記録できるようにした

f:id:masawada:20171011024618p:plain

Google Homeを購入したのは日記に書いたとおり。

ぼくは高血圧ぎみで薬を飲んでいて最近は毎日血圧を測っているのだけれど、億劫で記録はしていなかった。いちいちノートにつけるのは面倒だしスマートフォンを開いてメモアプリを立ち上げるのも挫折した。

Google HomeならIFTTT連携でGoogle Spreadsheetに血圧を記録できるのではないかということに気づいたので、早速やってみた。

Google Assistantをトリガーにして出力先をGoogle Spreadsheetのadd row to spreadsheetに向ける。全体の設定としては以下の通り。

f:id:masawada:20171011022241p:plainf:id:masawada:20171011022244p:plain
IFTTTの設定

これで「ねえGoogle、血圧80の120を記録して」と発話すると、Google Homeが 80の120 の部分を抜き出してGoogle Spreadsheetに記録してくれる。上記の設定だとGoogleフォルダが自動で作られて、その中に血圧マスタというSpreadsheetが作られる。ここのB列に血圧が80 の 120といった形で記録される。

一応CreatedAtを記録するように設定しているのだけど何故かうまく記録されないので、この動画の通りにやる。

www.youtube.com

具体的には、血圧マスタのScript editorを開いて

function addDate(e) {
  var lr = SpreadsheetApp.getActiveSheet().getLastRow();
  SpreadsheetApp.getActiveSheet().getRange(lr, 1).setValue(new Date());
}

このスクリプトを保存してトリガーを追加する。トリガーの設定は以下の通り。

f:id:masawada:20171011022807p:plain
トリガーの設定

ここまでで血圧のマスタが完成する。

f:id:masawada:20171011024201p:plain
血圧マスタにGoogle Homeから入力されたデータの様子

どうも同一のファイルに別シートを追加するとIFTTTでうまく行を追加してくれなくなってしまうようだったので、このマスタとは別にデータを整形するためのスプレッドシートを作成する。

新たなシートを作成してSheet1とSheet2を作成しておいて、Sheet2の方にはA1のセルに=IMPORTRANGE("https://docs.google.com/spreadsheets/.../edit","Sheet1!A:B")を入力する。URLの部分は、血圧マスタのスプレッドシートのURLを入れる。これで血圧マスタから整形用シートのSheet2に全く同じデータを取り込むことができる。

Sheet1にはA列が時刻、B列が下の血圧、C列が上の血圧という感じで整形してデータを入れる。1行目には見出しを書いておいて、A2には=Sheet2!A1と入れる。B2には=IF( ISBLANK(Sheet2'!B1) , "", SPLIT(Sheet2!B1, " の "))と入れる。最後にA, Bそれぞれの列について下の方まで内容を複製する。セルを複数選択してcmd+dで複製することができる。A1とかB1とかの数字部分が行に応じて勝手に書き換わってくれて便利。

これでデータをうまく整形できたかと思う。

f:id:masawada:20171011024618p:plain
整形後の血圧の様子

あとはやる気の問題だけなので頑張って声を張って毎日血圧を記録していこう。


追記: Google Homeの認識がちょいちょい変わって、「80の114」というと「80 - 114」だったり「80 の 114」だったりするので、スクリプト部分を少し変えました。

function formatRow(e) {
  var sheet = SpreadsheetApp.getActive().getSheetByName('Sheet1');
  var lr = sheet.getLastRow();
  
  sheet.getRange(lr, 1).setValue(new Date());
  
  var value = sheet.getRange(lr, 2).getValue();
  var formattedValue = value.toString().replace(/\s(から|-)\s/, ' の ');
  sheet.getRange(lr, 2).setValue(formattedValue);
}