Google Home でこどものタブレット学習をリマインドする

#やりたいこと
こども（小学校低学年）がタブレット通信教育を受講しています。
毎日やれるといいので、Google Homeを利用してリマインドさせます。

#前提
　Google Homeは自発的に発声することは標準ではできません。
　「Google Home　しゃべらせる」等で検索して、設定しました。
　google-home-notifierをRaspberry Piにインストールし、firebaseの更新をトリガに
　発声させる仕組みにしています。



#概要

![リマインド.png](https://qiita-image-store.s3.amazonaws.com/0/227396/f7882933-fbb0-8094-5f2c-616a762d9f93.png)

###1.学習履歴のログ出力
　タブレット教材に、学習結果をメール通知する機能があります。
　メール通知機能(gmailの受信)を元にIFTTTで、スプレッドシートに記録します。

###2.学習履歴のチェックとリマインド
　Google Apps Scriptでチェック処理を日次実行し、
　スプレッドシートに当日の記録があるかを確認します。
　確認結果を元に、Google Homeで、家にいるこどもに通知します。



#詳細
###1.学習履歴のログ出力
 タブレット教材に、メールで学習状況を通知する機能があります。
 これを利用して、IFTTTで学習履歴をスプレッドシートに蓄積します。

![ifttt001.png](https://qiita-image-store.s3.amazonaws.com/0/227396/9d62ad1e-3af5-7f67-fa89-0525af5442fa.png)

　※１：「xxx@mail.co.jp」は、タブレット教材からメール発信された時の送信元アドレスです。

　このIFTTTの設定で、タブレット教材から連絡メールが送信されると、
　スプレッドシートに以下のように、送信日時、送信者、件名が記録されていきます。
![sheet001.png](https://qiita-image-store.s3.amazonaws.com/0/227396/d9d9263c-bbb1-7f91-7a58-aebf75fc6ac1.png)





###2.学習履歴のチェックとリマインド
　Google Apps Scriptでスプレッドシート上に当日分の学習履歴があるかどうかを
　チェックします。

####1)学習履歴チェックスクリプトの作成


```javascript:コード.gs
function checkZemi() {

  // -- 各種変数関連の宣言(固定値)---------------------------------------------------------
  // タブレット学習のスプレッドシート
  var spreadsheet = SpreadsheetApp.openById('123xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx');
  var sheet = spreadsheet.getSheetByName('シート1');
  
  // シートの日付列
  var posDate = 1;
  // シートのタイトル列
  var posTitle = 3;
  // シートの通知済みフラグの列
  var posNotified = 4;
  // チェック対象の件名(部分一致)
  var chkTitle = "の学習結果のお知らせ"
  // タブレット学習の未完了時のメッセージ
  var message = "今日のタブレット学習が、まだ、終わっていません。タブレット学習を、はじめましょう";
  
  
  // -- 各種変数関連の宣言(可変値)---------------------------------------------------------
  // シートの最終行
  var posLastColumn = sheet.getLastRow();
  // 今日の日付を「December 30, 2017」の形式で取得  
  var formattedDate = Utilities.formatDate(new Date(), "GMT", "MMMMMMMMMMMM dd, yyyy");
  // 現在の操作行  
  var currentRow = posLastColumn;
  // 終了の判定フラグ
  var endFlg = false;
  // スプレッドシート上の日付
  var sDate = "";
  // スプレッドシート上のタイトル
  var sTitle = "";
  // スプレッドシート上の完了通知フラグ
  var sNotified = "";
  

  
  // -- 処理開始-----------------------------------------------------------------------
  // 日付の列の最終行取得
  sDate = sheet.getRange(currentRow,posDate).getValue();
  // タイトルの列の最終行取得
  sTitle = sheet.getRange(currentRow,posTitle).getValue();
  // 完了通知フラグの最終行取得
  sNotified = sheet.getRange(currentRow,posNotified).getValue();
  

  // 最終行から上にセルを確認していき、今日のタブレット学習からの連絡メールの受信を確認する
  while( currentRow > 1 && endFlg == false ) {
    
    // 今日の日付　かつ　タイトルが連絡メールの場合
    // indexOf は 検索文字を見つけた開始位置が返却される（見つからない場合は「-1」が返る
    if ( sDate.indexOf(formattedDate) == 0 && sTitle.indexOf(chkTitle) >= 0 ) {
      endFlg = true;
      message = "今日のタブレット学習は、おわっていることを確認しました。お疲れさまでした。明日も頑張りましょう"
      sheet.getRange(currentRow,posNotified).setValue("済");
      break;
    }
    // 1行上のセルに移動
    currentRow --;
    sDate = sheet.getRange(currentRow,posDate).getValue();
    sTitle = sheet.getRange(currentRow,posTitle).getValue();
    sNotified = sheet.getRange(currentRow,posNotified).getValue();
  }
  
  // 当日分のタブレット学習が未完了 または 
  // 当日分の完了通知がまだなら、
  // メッセージの送信
  if ( endFlg == false || (sDate.indexOf(formattedDate) == 0 && sNotified.equals('')) ) {
    Logger.log(message);
    sendGoogleHomeLiving(message);  
  } else {
    Logger.log("通知済みなので、通知しません");
  }
  
}

```


####2)チェックスクリプトの起動設定
　ツールバーから起動トリガーを設定します。
　毎日、ＰＭ６～７時、ＰＭ７～８時、ＰＭ８～９時の間で、チェックして、
　まだ終わっていないようであれば、実施を促します。

![trigger001.png](https://qiita-image-store.s3.amazonaws.com/0/227396/3b805f54-320c-65b0-7906-9f3bd089d62a.png)



#まとめ
初投稿なので、内容の善し悪し等、改善の余地もあるかと思います。
不明点等あれば、コメントいただければ、改善します。

Google Homeを使って、日常生活のさまざまな改善に取り組めたらと思っています！