Google Homeに話しかけてGoogle Sheetsに授乳記録を残す

Google Homeを使って育児ログを手を使わずに記録しよう計画。
第一弾は「Google Homeに話しかけてGoogle Sheetsに子のおむつ交換ログを残す

 つぎは、授乳編。

できるようになったこと

  • 「OK Google, 授乳開始 右/左」 で、授乳開始時刻と胸の左右をGoogle Sheetsに記録する。
  • 「OK Google, 授乳終了」 で、授乳終了時刻をGoogle Sheetsに記録する。
  • 授乳開始時刻と授乳終了時刻の差分を、授乳時間としてGoogle Sheetsに記録する。

実現のために利用する技術・サービス

  • IFTTT(Google Assistant と Google Sheets)
  • Google Apps Script

おむつ記録同様、サクッと作ってすぐに使えるようにすることが目的なので、なるべくIFTTTにあるパーツだけで作ります。
時刻の記録と授乳時間の計算は、Google Apps Scriptを使ってGoogle Sheetsにコードを埋め込みます。
おむつ記録よりも、Google Apps Scriptが若干複雑になりますが1時間くらいで使えるようになりました。

前提条件

  • Google Homeのセットアップを終えていること。
  • IFTTTのSign Up済みであること。
  • Googleアカウントがあること。

How To

IFTTTに授乳の開始を記録するAppletを追加

  1. IFTTTのMy Appletsで「New Applet」を選択。
  2. 「+this」をクリックし、「Choose a service」で「Google Assistant」を選択。

    “google” で検索すると最初に出てくる。

    Google Homeとの連携がまだの場合、認証画面が表示されるので、IFTTTへの権限許可を行う。
  3. 「Choose trigger」で「Say a phrase with a text ingredient」を選択。
  4. フレーズと応答メッセージを入力する。Languageは”Japanese”。フレーズは数パターン登録できるので、使いそうなものを幾つか入れておく。
    左右どちらの胸かを可変となる言葉として入力可能にしたいので、”$”を使う(”$”前後にスペースを入れること)。”$”は応答メッセージにも使用できる。
    入力を終えたら「Create trigger」をクリック。
  5. 「+that」をクリックし、「Choose action service」で「Google Sheets」を選択。

    “sheet”で検索すると早い。

    Google Sheetとの連携がまだの場合、認証画面が表示されるので、IFTTTへの権限許可を行う。
  6. 「Choose action」で「Add row to spreadsheet」を選択。
  7. スプレットシートのファイル名、出力内容、シートの場所を入力する。すでに存在するファイルを使用する場合はそのファイル情報を入力する。
    出力は”|||”が行の区切りとなる。開始、終了がわかるよう固定文字”start”を出力するよう設定する。
    胸の左右は”{{TextField}}”キーワードを使用して指定する。“{{CreatedAt}}”は準備されているのだけど実際は出力されない。
    2018.05.25 バグが修正されたようで日付が出力されるようになりました。Google Sheetのスクリプトを追加せずとも現在時刻は入力されます。下記の様にスクリプトを設定している場合は、うまく動作しないので出力から”{{CreatedAt}}”を外したほうが良いです。

    入力を終えたら「Create action」をクリック。

  8. 「Review and finish」でApplet名を入力する。わかりやすいものに変更したら「Finish」。

ここで一度、Google Homeに話しかけてみます。

  • 問題なく応答メッセージが返ってくること
  • Google Sheetに指定ファイルができていること
  • Google Sheetに指定どおり列が出力されていること

を確認します。

IFTTTに授乳の終了を記録するAppletを追加

基本的な流れは授乳の開始と同じ。

  1. IFTTTのMy Appletsで「New Applet」を選択。
  2. 「+this」をクリックし、「Choose a service」で「Google Assistant」を選択。
  3. 授乳終了時は左右の情報は不要なので、「Choose trigger」は「Say a simple phrase」を選択。
  4. フレーズと応答メッセージを入力する。Languageは”Japanese”。フレーズは数パターン登録できるので、使いそうなものを幾つか入れておく。
    入力を終えたら「Create trigger」をクリック。
  5. 「+that」をクリックし、「Choose action service」で「Google Sheets」を選択。
  6. 「Choose action」で「Add row to spreadsheet」を選択。
  7. スプレットシートのファイル名、出力内容、シートの場所を入力する。授乳開始のアプレットと同じファイル情報を入力する。
    出力は”|||”が行の区切りとなる。終了がわかるよう固定文字”stop”を出力するよう設定する。
    入力を終えたら「Create action」をクリック。
  8. 「Review and finish」でApplet名を入力する。わかりやすいものに変更したら「Finish」。

動作確認のため、Google Homeに話しかけてみます。

  • 問題なく応答メッセージが返ってくること
  • 授乳開始時と同じファイルが更新されていること
  • Google Sheetに指定どおり列が出力されていること

を確認します。
ファイルが作成されたあと、背景色を変えたりヘッダを追加したりしても出力への影響はありません。

Google Sheet側で現在時刻の出力と授乳時間の計算を行う

次の2つの処理をするスクリプトを設定します。

  • ファイルに新規に行が追加されるなど、スプレットシートの値が変更されたタイミングで指定列に現在時刻を出力させる
  • 最終入力が授乳の終了であれば、開始時刻との差分を計算して表示させる
  1. 「ツール」メニュー > 「スクリプトエディタ」選択。別タブにスクリプト入力画面が開きます。
  2. 以下のコードを入力し、適切な名前をつけてプロジェクトを保存する。
    var sheet = SpreadsheetApp.getActiveSheet();
    
    function addDate() {
      setDate();
    }
    
    function setDate(col, format) {
      var lastrow = sheet.getLastRow();
      var dateRange = sheet.getRange(lastrow, 1);
      var timeRange = sheet.getRange(lastrow, 2);
      var now = new Date();
      // 最終行に時刻が設定されていない場合、現在時刻をセットする
      if (dateRange.getValue() == "") {
        dateRange.setValue(formatDate(now, "yyyy/M/d"));
        timeRange.setValue(formatDate(now, "H:m:s"));
      }
      var actionRange = sheet.getRange(lastrow, 4);
      // 授乳時間の計算
      if (actionRange.getValue() == "stop") {
        var startTimeRange = sheet.getRange(lastrow-1, 2);
        var resultTimemil = timeRange.getValue() - startTimeRange.getValue();
        // フォーマットするときAsia/Tokyoを指定すると+9hされるので、UTC指定
        sheet.getRange(lastrow, 5).setValue(Utilities.formatDate(new Date(resultTimemil), 'UTC', 'H:m:s'));
      }
    }
    
    function formatDate(date, format) {
      return Utilities.formatDate(date, 'Asia/Tokyo', format)
    }
    

  3. 「編集」メニュー > 「現在のプロジェクトのトリガー」選択。「トリガーが設定されていません。今すぐ追加するにはここをクリックしてください。」をクリック。
  4. 「実行:addDate(実行したいfunction名)」、「イベント:スプレットシートから、値の変更」を選択し、保存。

    保存の際「承認が必要です」というダイアログが表示されます。

    「許可を確認」し、Googleアカウントを選択すると、マクロの追加のためか、セキュリティの警告画面が表示されます。

    「詳細」→「[プロジェクト名](安全ではないページ)に移動」をクリックし、Google ドライブのスプレッドシートの表示と管理に対するマクロの実行を許可してください。

これで、行が増えるなどスプレットシートの値が何か変更されたタイミングで、最終行の1列目に日付・2列目に時刻が自動入力されるようになります。ただし、すでに最終行の時刻が入力済の場合は、更新されないようになっています。
同時に、4列目(D列)に入力された値が”stop”だった場合、一つ上の行の時刻との差分を授乳時間として5列目(E列)に出力させるようになっています。

同じことをAmazon Alexaでできないの?

IFTTTのAmazon Alexaのパーツは、日本語の音声入力に未対応の模様(2018.01.30現在)。
なので、IFTTTを使ってパパっと作るのであれば、Google Assistant使うのが良いです。

運用状況

こんな感じで運用されています。

授乳の記録は、開始は忘れないのだけど終了はちょいちょい言い忘れますが、終了を入れ忘れていても次の開始に影響のない仕組みなので、問題なし。

IFTTTはスマホアプリもあるので、ときどき応答メッセージを変えたりして楽しんでいます。
(今は授乳を開始する我が子に「がんばれ♡」と言うようになってます。)

Google Homeに話しかけてGoogle Sheetsに子のおむつ交換ログを残す

12月に子供が生まれ、絶賛育児中です。 赤子のおむつや授乳の記録をつけているのですが、育児中は両手が塞がることが多く、スマホでの記録は不便。 この記事を参考に、声による入力で赤子の育児記録をできるようにしました。 Qii […]

せきゅぽろ ナイトセミナー #11に参加しました

2016年9月27日(火)に開催された、せきゅぽろ ナイトセミナー #11に参加しました。 平日夜に開催されている勉強会に参加するのは、2016年で3ヶ月ぶり2回めです。 会場に到着した時、既に参加者がびっちりで驚きまし […]

OSS Gateワークショップin札幌2016-09-24に参加しました

2016年09月24日(土)に開催された、OSS Gateワークショップin札幌2016-09-24に参加しました。 このワークショップはOSSの開発「ビギナー」が「メンター」と共に、OSS開発に参加してみよう!(門:G […]

平鍋さんと考える、自分の過去・現在・未来に参加しました

2016年06月23(木)に開催されたえにしテックのイベント、「平鍋さんと考える、自分の過去・現在・未来」に参加した時の備忘録です。 (3ヶ月前に参加したイベントの話になります) その時の気持ちのスナップショットを残せれ […]

オープンソースカンファレンス2016 Hokkaidoに参加しました

2016年6月17日、6月18日に開催された、オープンソースカンファレンス2016 Hokkaidoに参加していました。 私が参加したのは6月18日(土)の午後のみです。自堕落。 かなり前なのですが、ブログを書いていなか […]

PHPカンファレンス北海道2016に参加しました

2016年4月16日開催のPHPカンファレンス北海道2016に参加したときの備忘録です。 (久しくこのブログを書いていなかったので実に半年前!に参加したイベントの話になります) 聴いたセッション PHP7ブートキャンプ […]

第23回北海道情報セキュリティ勉強会に参加しました

3月4日に開催された「第23回北海道情報セキュリティ勉強会」に参加しました。 話題は不正プログラムの解析とメモリフォレンジックについて。どちらも普段仕事で関わることのない分野でしたがとても興味深い内容でした。 Sessi […]

Java Doでしょう #04に参加しました

2月13日(土)に開催された、Java Doでしょう #04に参加しました。 最近、お仕事でJavaを使う機会が減ったのもあり、Java勉強会はとても久しぶり。 この日は、来札した日本マイクロソフト株式会社の寺田佳央さん […]