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

One comment:

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください