Google カレンダーに入れた予定の15分前に、Google homeがしゃべるようにしてみた

# はじめに
- まず、[Gmailが届いたらGoogle homeがしゃべるようにしてみた](https://qiita.com/ezmscrap/items/7a7f555faf7371a56e9d#長かったけど以上)
- つぎは、入力したスケジュールを教えてくれるようにしたい
- 以前の機能をフルに活用して、楽してGoogle Homeがしゃべるようにしたい

# 前提
- Windows 10 pro バージョン1803
- [以前の記事](https://qiita.com/ezmscrap/items/fb98334c9c73c69aa768)にしたがって、Gmailが届いたら、Google homeがしゃべってくれるようになっていること

# 概要

- まず、大雑把な流れを考える

1. IFTTTで、スケジュールのタイトルと説明と場所と開始時刻と終了時刻をGoogle Drive Spreadsheetに書き込む
2. cronで毎分起動するnode.jpツールで Google Drive Spreadsheetから情報を取得する
3. 取得した新着タイトルと送り主を、「Google home喋らせサーバ」に送る

- ざっくりした流れは以前の記事と同じだが、1と2は手が加わる
- 3の面倒くさい「Google home喋らせサーバ」は[以前の記事](https://qiita.com/ezmscrap/items/7a7f555faf7371a56e9d)そのまま流用できるので、[以前の記事](https://qiita.com/ezmscrap/items/7a7f555faf7371a56e9d#)が実現されていれば今回は作業なし

# IFTTTで、スケジュールのタイトルと説明と場所と開始時刻と終了時刻をGoogle Drive Spreadsheetに書き込む
- [IFTTT](https://ifttt.com/)にアクセスしてsigninする
- My Appletsをクリック
- New Appletをクリック
- Thisをクリック
- Google Calendarをクリック
- Any event startsをクリック
- Time before event startsを15 minutesに選択
- Create triggerをクリック
- Thatをクリック
- google sheetsをクリック
- Add row to spreadsheetをクリック
- Formatted rowを{{Title}}|||{{Description}}|||{{Where}}}|||{{Starts}}|||{{Ends}}に変更
- Create Actionをクリック
- Turn Onをクリック

# Windows Subsystem for Linux(WSL)でubuntuを入れる
- [以前の記事](https://qiita.com/ezmscrap/items/fb98334c9c73c69aa768)を参照

# nodo.jsをWSLに入れる(最新にする)
- [以前の記事](https://qiita.com/ezmscrap/items/fb98334c9c73c69aa768)を参照

# cronで毎分起動するnode.jpツールで Google Drive Spreadsheetから情報を取得する


- 前提モジュールをインストール

```
sudo npm child_process sleep google-spreadsheet 
```


- googleの[デベロッパーコンソール](https://console.developers.google.com/flows/enableapi?apiid=sheets.googleapis.com)に行って、[プロジェクトを作成]を選ぶ
- [同意して続行]をクリック
- [認証情報に進む]をクリック
- [キャンセル]をクリック
- 「認証情報」のタブを選択し、 [認証情報を作成]をクリック
- 「サービスアカウントキー」をクリック
- サービスアカウントを作成
- KeyTypeはjsonを選択
- jsonを保存
- jsonの中の、"client_email"を調べておく
- [Googleスプレッドシート](https://docs.google.com/spreadsheets)に行く
- [Any event starts]と言う名前のスプレッドシートを作る
- urlから、スプレッドシートのIDを調べておく(https://docs.google.com/spreadsheets/d/スプレッドシートのID/edit#gid=0となっている)
- A1にtitle、B1にdescription、C1にwhere、D1にstarts、E1にendsと入力する
- [共有]をクリック
- 「ユーザー」に、上で調べた"client_email"を追加する
- 上のjsonを、WSLの適当なディレクトリに置く
- jsonを置いたディレクトリに以下のスクリプトを作成

``` spreadsheet_wacher.js
const execSync = require('child_process').execSync;
var sleep = require('sleep');
var GoogleSpreadsheet = require('google-spreadsheet');
var mail_spreadsheet_id = '[Any new email]のスプレッドシートのID'
var calendar_spreadsheet_id = '[Any event starts]のスプレッドシートのID'
var path = 'フルパスのjsonファイル'
var my_mail_sheet = new GoogleSpreadsheet(mail_spreadsheet_id);
var my_calendar_sheet = new GoogleSpreadsheet(calendar_spreadsheet_id);
var credentials = require(path);

my_mail_sheet.useServiceAccountAuth(credentials, function(err){
    my_mail_sheet.getInfo(function(err, data){
        data.worksheets[0].getRows(function( err, rows ) {
                for(var i in rows) {
                        var name = rows[i].name;
                        var title = rows[i].title;
                        var text = name+'さんから'+title+'と言うメールが来ています';
                        console.log(text);
                        text = text.replace(/\'/g, '');
                        text = text.replace(/\&/g, '');
                        execSync("curl -X POST -d 'text="+text+"' http://localhost:8080/google-home-notifier");
                        rows[i].del();
                        sleep.sleep(10);
                }
        });
    });
});

my_calendar_sheet.useServiceAccountAuth(credentials, function(err){
        my_calendar_sheet.getInfo(function(err, data){
                data.worksheets[0].getRows(function( err, rows ) {
                        for(var i in rows) {
                                var title = rows[i].title;
                                var where = rows[i].where;
                                var starts = rows[i].starts;
                                var text = starts+'に、'+where+'で、'+title+'というスケジュールが入っています';
                                console.log(text);
                                text = text.replace(/\'/g, '');
                               text = text.replace(/\&/g, '');
                                execSync("curl -X POST -d 'text="+text+"' http://localhost:8080/google-home-notifier");
                                rows[i].del();
                                sleep.sleep(10);
                        }
                });
        });
});
```

- gmailとgoogle calendarをまとめてしゃべってくれるようにまとめた
- node.jsのフルパスを調べる

```
which node
```

- cron用のファイルを編集する

```
vi ~/crontab  
```

- 中身はこんな感じ。nodeとスクリプトのフルパスは適切に変更してください

``` crontab
*/1 * * * * /usr/local/bin/node  /home/google_home/spreadsheet_wacher.js >> /var/log/cron.log
```

- cronに登録する

```
crontab < ~/crontab 
```

- cronが起動しているか調べる

```
sudo /etc/init.d/cron status
```

- 起動していれば、念のため再起動

```
sudo /etc/init.d/cron restart
```

- 起動していなければ起動する

```
sudo /etc/init.d/cron start
```

# google-home-notifierを入れる
- [以前の記事](https://qiita.com/ezmscrap/items/fb98334c9c73c69aa768)を参照

# example.jsを編集する
- [以前の記事](https://qiita.com/ezmscrap/items/fb98334c9c73c69aa768)を参照

# nohupで動かしておく
- [以前の記事](https://qiita.com/ezmscrap/items/fb98334c9c73c69aa768)を参照

# おわりに
- 基本的に、以前の記事にあるものをちょっと改造するだけで出来た。
- [IFTTT](https://ifttt.com/)は[Microsoft flow](https://japan.flow.microsoft.com/ja-jp/)に比べて、回数制限やテストの即時性などの面で勝っており、IFTTTで出来るものは積極的にIFTTTを使っていきたいと思った
- メールとスケジュールをしゃべらせたら大体満足した自分の生活の底の浅さに衝撃を覚えざるを得ない

# 追記
- 読み上げる項目に、アポストロフィが含まれているとcurlがコケる問題に対応するため、'spreadsheet_wacher.js'の2カ所に'text = text.replace(/\'/g, '');'を追加した