GoogleHome・スマホ(音声入力)  ×  LINE で家事力アップ  第3回（音声入力された内容をLINEで報告）

最終回はGoogleホームまたはGoogleアシスタントで音声入力で記録されたGoogleスプレッドシートを整理して週１回LINEで報告します。

■システム全体の流れ
失敗ミスをしたら、GoogleHome またはスマホのGoogleアシスタントで内容を音声入力

<img width="341" alt="001.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54870/f298ce3a-f049-1219-5570-74217cf43284.jpeg">


毎週一週間の内容をLINEで通知

<img width="195" alt="002.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54870/15c6451f-a502-1149-a152-1bff862272c6.jpeg">

一週間を振り返り改善策を考える

<img width="119" alt="003.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54870/c9c58eae-c36b-f718-7ab1-65f934e0ae90.jpeg">

■目次
<a href="https://qiita.com/nossan3/items/08fcc0914bc685f21165">第1回　システム概要</a>
<a href="https://qiita.com/nossan3/items/8eeba1fd5d2b8c7dae7b">第2回　音声入力からGoogleスプレットシートへ記録</a>
<a href="https://qiita.com/nossan3/items/eee62d99bd2f6ff99fe0">第3回　Googleスプレットシートへ記録された内容をLINEで報告</a>

■作成手順(第3回)
1.整理用のGoogleスプレッドシートを作成します。
   1-1. Googleドライブにアクセスします。
　　  　　https://drive.google.com/drive/u/0/my-drive

   1-2. マイドライブ画面で前回作成したIFTTTフォルダをダブルクリックします。

   1-3. 画面左上の「新規」→「Google スプレッドシート」を選択します。
　　　　<img width="144" alt="007.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54870/3920d27b-74cc-7946-0e94-29cbac6038e6.jpeg">

   1-4. 新規スプレッドシート画面が表示されます。
　　  　　画面左上のタイトル欄に今回は「失敗記録」と入力します。

   1-5. 作成した「失敗記録」のURLを後で使用しますので控えておいてください。

2.事前に作成した一時記録用のGoogleスプレッドシート「errorlist」のURLを調べます。

   2-1. Googleドライブにアクセスします。
　　    　https://drive.google.com/drive/u/0/my-drive

   2-2. マイドライブ画面で前回作成したIFTTTフォルダをダブルクリックします。

   2-3. 「errorlist」をダブルクリックします。

   2-4. 「errorlist」が表示されます。
　　  　　URLを後で使用しますので控えておいてください。

3.一時記録用のGoogleスプレッドシートに記録された内容を整理用のGoogleスプレッドシートに移動します。
  Google Apps Scriptを利用します。
　Googleドライブにアクセスしてマイドライブ画面でIFTTTフォルダをダブルクリックして「失敗記録」をダブルクリックして開きます。

   3-1.Google Apps Scriptエディタ画面を開きます。
　　  　　「ツール」→「スクリプトエディタ」をクリックします。

   3-2.デフォルトで設定される「コード.gs」にコードを書いていきます。
        コードの詳細な説明は省略させて頂きますが、「errorlist」の内容を「失敗記録」に転記して「errorlist」の内容をクリアしています。

```
function Data_Move() { 
  
  //音声入力用のスプレッドシートファイル
  //控えて置いた「errorlist」のURLを記載します
  var url = "https://docs.google.com/spreadsheets/d/xxxxxxxxxxxxxxxxxx/edit#gid=0";
  var SpreadSheet_Input = SpreadsheetApp.openByUrl(url);
 
  //ファイル中のシートを指定
  var Sheet_Input_Input = SpreadSheet_Nyukin.getSheetByName("errorsheet");
  
  //失敗記録のスプレッドシート
  //控えて置いた「失敗記録」のURLを記載します
var SpreadSheet_Output = SpreadsheetApp.openByUrl('https://docs.google.com/spreadsheets/d/1-xxxxxxxxxxxx/edit#gid=0');
 
  //シートを指定
  var Sheet_Output = SpreadSheet_Output.getSheetByName("errorrecord");
 
  //音声入力シート内で入力がある最後の行数を取得
  var Lastrow_Input_Input = Sheet_Input_Input.getLastRow();　　　//音声入力シート
  
  //失敗記録の変数
  var Start_Row = 2;  　　　　 //最初の行の最初の行
  var Counter = 0;  　　　　　 //空白のカウンター
 
  var today;  　//今日の日付
  var EntryDate;  //登録日
  var Tekiyou;  //内容
  
  var Tekiyou_Num = 10;    //検索できる摘要の数  
 
 
  //失敗記録のある最後の行数を取得
  for(var i = 1; i <= 10000; i++) {
    
    var x = Sheet_Output.getRange(Start_Row + i - 1, 1).getValues();
    
    if(x==""){
    
      Counter++;
      
      if(Counter==5){
        var Lastrow_Output = Start_Row + i - 1 - 5; 
        break;
      }
      
    }else{
    
      Counter = 0;
    
    }
    
  }
  
   
  //音声データを失敗記録に書き出し
  for(var i = 1; i <= Lastrow_Input_Input; i++) {
 
    today = new Date();  //今日の日付
    EntryDate = Sheet_Input_Input.getRange(i, 1).getValue();  //登録日    
    Tekiyou = Sheet_Input_Input.getRange(i, 2).getValue();  // 内容   
   
    Sheet_Output.getRange(i + Lastrow_Output, 1).setValue(today);    //日付
    Sheet_Output.getRange(i + Lastrow_Output, 2).setValue(EntryDate);  //登録日 
    Sheet_Output.getRange(i + Lastrow_Output, 3).setValue(Tekiyou);  //内容 
    
  }
  
  if(Lastrow_Input_Input>0){
    Sheet_Input_Input.deleteRows(1, Lastrow_Input_Input);  //音声データを削除
  }
  
  Lastrow_Output = Lastrow_Output + Lastrow_Input_Input;
  
  
}

```

　動作確認をしてみましょう。
　画面左上の「▲」実行ボタンをクリックしましょう。
　　<img width="233" alt="017.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54870/c7e3383e-4c0b-9468-5770-3ee6cda5784e.jpeg">
　「errorlist」の内容が「失敗記録」に移動しています。

4.このままだと毎回手動で「 Data_Move()」を実行しないといけないのでトリガーを使って自動的に実行されるようにします。

   4-1. プロジェクト名を入力します。画面左上の「無題のプロジェクト」を「失敗記録」と上書きで登録します。

   4-2.　Google Apps Scriptエディタ画面で「編集」→「現在のプロジェクトのトリガー」をクリックします。

   4-3. 画面右下の「+トリガーを追加」をクリックします。

   4-4. トリガーの設定を行います。
　　　　　実行する関数を選択「 Data_Move」
　　　　　デプロイ時に実行「Head」
　　　　　イベントのソースを選択「時間手動型」
　　　　　時間ベースのトリガーのタイプを選択「分ベースのタイマー」
　　　　　時間の間隔を選択（分）「５分おき」
　　　　　「保存」をクリック

　　　　　これで５分おきに「erroelist」に新しく入力がないか確認するようになります。

5.週間レポート用のGoogleスプレッドシートを作成します。

   5-1. Googleドライブにアクセスします。
  　　　　https://drive.google.com/drive/u/0/my-drive

   5-2. マイドライブ画面で前回作成したIFTTTフォルダをダブルクリックします。

   5-3. 画面左上の「新規」→「Google スプレッドシート」を選択します。
　　　　<img width="144" alt="007.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54870/3920d27b-74cc-7946-0e94-29cbac6038e6.jpeg">

   5-4. 新規スプレッドシート画面が表示されます。
　　  　　画面左上のタイトル欄に今回は「週間レポート」と入力します。

   5-5. 作成した「週間レポート」のURLを後で使用しますので控えておいてください。

6.「失敗記録」の内容から週間レポートを作成します。
  Google Apps Scriptを利用します。
　Googleドライブにアクセスしてマイドライブ画面でIFTTTフォルダをダブルクリックして「失敗記録」をダブルクリックして開きます。

   6-1.  Google Apps Scriptエディタ画面を開きます。
　　　　「ツール」→「スクリプトエディタ」をクリックします。

   6-2.  先ほど利用した「コード.gs」にコードを追記していきます。
　　　　「Createweeklyreport」というメソッドを作成して１週間分のレポート作成処理を記載します。

```

function Createweeklyreport() { 
  //失敗記録のスプレッドシート
 //失敗記録のURLを記載します
  var SpreadSheet_Report = SpreadsheetApp.openByUrl('https://docs.google.com/spreadsheets/d/1-xxxxxx-dFh4eVFh8EznDBFG2VRY5qYY/edit#gid=0');
  //週間レポートのスプレッドシート
 //週間レポートのURLを記載します
  var SpreadSheet_WeeklyReport  = SpreadsheetApp.openByUrl('https://docs.google.com/spreadsheets/d/1xxxxxxxxx-is8LBw2hEFy2wVp2wu8fJks-HQvBY/edit#gid=0');
  var nowDate = new Date();
  var StartDate = new Date(nowDate.getYear(), nowDate.getMonth(), nowDate.getDate() - 8);
  var EndDate = new Date(nowDate.getYear(), nowDate.getMonth(), nowDate.getDate() - 1);
  var formatStartDate = Utilities.formatDate(StartDate,"JST","yyyy/MM/dd");
  var formatEndDate = Utilities.formatDate(EndDate,"JST","yyyy/MM/dd");
  var StartDate2 = new Date(nowDate.getYear(), nowDate.getMonth(), nowDate.getDate() - 9);
  var EndDate2 = new Date(nowDate.getYear(), nowDate.getMonth(), nowDate.getDate() );


 
  //シートを指定
  var Sheet_Report = SpreadSheet_WeeklyReport.getSheetByName("weeklyreport");
  Sheet_Report.clear();
  var Sheet_error = SpreadSheet_Report.getSheetByName("errorrecord");
  Sheet_Report.getRange( 1, 1).setValue('対象期間：' +  formatStartDate + '　～　' + formatEndDate); 
  Sheet_Report.getRange( 4, 1).setValue('日付'); 
  Sheet_Report.getRange( 4, 2).setValue('内容'); 
 
  //失敗記録のある最後の行数を取得
  var Start_Row = 2;
  var Write_Row = 5;
  var error_count = 0;
  var content = '';
  for(var i = 1; i <= 10000; i++) {
    
    var x = Sheet_error.getRange(Start_Row + i - 1, 1).getValues();
    
    if(x==""){
      break;
    }
    // 処理を記述
    //　対象期間か？
    var x = Sheet_error.getRange(Start_Row + i - 1, 1).getValues();
    var xdate = new Date(x);
    var comment = Sheet_error.getRange(Start_Row + i - 1, 3).getValues();

    var xdate = new Date(x);
    if  ( xdate.valueOf() >  StartDate2.valueOf() &&  xdate.valueOf() <  EndDate2.valueOf() ) {
        Sheet_Report.getRange(  Write_Row  ,1).setValue(x); 
        Sheet_Report.getRange(  Write_Row  ,2).setValue(comment); 
        var formatDatex = Utilities.formatDate(xdate,"JST","MM/dd");

        content = content + formatDatex + '  ' + comment + '<BR>';
        Write_Row = Write_Row + 1;
        error_count = error_count + 1;
    }
    Sheet_Report.getRange( 2, 1).setValue('合計 ' + error_count + '件'); 
    //Sheet_Report.getRange( Start_Row + i - 1, 2).setValue(x); 
    //Sheet_Report.getRange( Start_Row + i - 1, 3).setValue(xdate); 
    //Sheet_Report.getRange( Start_Row + i - 1, 4).setValue(StartDate); 
    //Sheet_Report.getRange( Start_Row + i - 1, 5).setValue(EndDate); 
    //Sheet_Report.getRange( Start_Row + i - 1, 6).setValue(xdate.valueOf()); 
    //Sheet_Report.getRange( Start_Row + i - 1, 7).setValue(EndDate2.valueOf()); 
    
  } 
  var message =  '(今週のレポート)' + '<BR>'  + Sheet_Report.getRange( 1, 1).getValues(); 
  message = message + '<BR>' +Sheet_Report.getRange( 2, 1).getValues() + '<BR>' + content; 

  Sheet_Report.getRange(  3, 1).setValue(message); 

}
```
　動作確認をしてみましょう。
　画面左上の「▲」実行ボタンをクリックしましょう。
　
「週間レポート」の「weeklyreport」シートにに１週間に登録された内容が記録されています。
　　<img width="553" alt="018.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54870/2e678a15-f158-5b3b-45fd-87476626853e.jpeg">


7.このままだと毎回手動で「 Createweeklyreport(()」を実行しないといけないのでトリガーを使って自動的に実行されるようにします。
    7-1.　Google Apps Scriptエディタ画面で「編集」→「現在のプロジェクトのトリガー」をクリックします。

   7-2. 画面右下の「+トリガーを追加」をクリックします。

   7-3. トリガーの設定を行います。
　　　　　　実行する関数を選択「Createweeklyreport」
　　　　　　デプロイ時に実行「Head」
　　　　　　イベントのソースを選択「時間手動型」
　　　　　　時間ベースのトリガーのタイプを選択「週ベースのタイマー」
　　　　　　曜日を選択を選択「毎週月曜日」
　　　　　　時刻を選択「午前８時～９時」
　　　　　　「保存」をクリック

これで毎週月曜日に「週間レポート」が更新されます。

8.最後に「週間レポート」が更新されたらLINEで通知します。「IFTTT」を利用します。
    8-1.IFTTTへサインインして。MY Applets画面を開きます。
　  　　<a href="https://ifttt.com/my_applets">https://ifttt.com/my_applets</a>
    8-2.画面右上のアカウントアイコンをクリックして、「Create」をクリックします。
  　　　<img width="118" alt="011.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54870/7af021ed-e091-0fee-c919-e5647a9b1803.jpeg">
　　
    8-3.IFTTTのトリガーを設定します。IF と Thisの間の「＋」をクリックします。
　　  　<img width="193" alt="012.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54870/7ca92727-7a6f-6022-ea78-d7968fe4c1ba.jpeg">
    8-4.サービス一覧より「Google Sheets」を検索してクリックします。
    8-5.「週間レポート」が更新されたらメッセージを送信するようにするので「Cell updated in spreadsheets」をクリックします。
    8-6. トリガーの設定を行います。
         「週間レポート」→「weeklyreport」シートの「A3」セルが更新されたらメッセージを送信するように設定します。
　　　　　　「 Or copy and paste the spreadsheet URL」に「週間レポート」のURL
           「 Which cell to monitor?」に「A3」
　　　　　　「Create Trigger」をクリック

   8-7.IFTTTのアクションを設定します。Tehn と Thatの間の「＋」をクリックします。
     <img width="273" alt="014.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54870/51ee6dbf-a5ba-a952-a5f9-a3a2198cd9e0.jpeg">

   8-8.サービス一覧より「LINE」を検索してクリックします。

   8-9.「Chosse Action」で「Send Message」をクリックします。

   8-10. アクションの設定を行います。
　　　　　LINEにA3セルの内容を送信します。
 　　　　　「 Recipient」: 「1:1でLINE Notifyから通知を受け取る 」
           「Message」: Cell updated in {{SpreadsheetName}} to "{{Value}}"失敗記録 {{SpreadsheetUrl}}
　　　　　「Create action」をクリック
　　　　　<img width="172" alt="020.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54870/898afcda-7c87-4a03-27bc-03ef8dee605c.jpeg">


これで音声入力した内容から週1回、レポートがLINEに送信されます。
　　　　　<img width="368" alt="021.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54870/79bde1b6-cb34-2746-23ff-d091f4c55312.jpeg">

長文を読んで頂きありがとうございました。
改善すべき点は多々ありますが、これで定期的にこんな失敗してしまったかと振り返りを行っています。
今後は本当はデータが蓄積されないのがよいのですが、データを分析して改善策を提案するなどやってみたいなと考えてます。

■目次
<a href="https://qiita.com/nossan3/items/08fcc0914bc685f21165">第1回　システム概要</a>
<a href="https://qiita.com/nossan3/items/8eeba1fd5d2b8c7dae7b">第2回　音声入力からGoogleスプレットシートへ記録</a>
<a href="https://qiita.com/nossan3/items/eee62d99bd2f6ff99fe0">第3回　Googleスプレットシートへ記録された内容をLINEで報告</a>

<a href="//af.moshimo.com/af/c/click?a_id=1557576&p_id=54&pc_id=54&pl_id=620&guid=ON" target="_blank" rel="nofollow"><img src="//image.moshimo.com/af-img/0032/000000000620.gif" width="468" height="60" style="border:none;"></a><img src="//i.moshimo.com/af/i/impression?a_id=1557576&p_id=54&pc_id=54&pl_id=620" width="1" height="1" style="border:none;">

<a href="//af.moshimo.com/af/c/click?a_id=1557569&p_id=932&pc_id=1188&pl_id=12503&guid=ON" target="_blank" rel="nofollow"><img src="//image.moshimo.com/af-img/0285/000000012503.gif" width="320" height="50" style="border:none;"></a><img src="//i.moshimo.com/af/i/impression?a_id=1557569&p_id=932&pc_id=1188&pl_id=12503" width="1" height="1" style="border:none;">