LoginSignup
0
4

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-07-20

はじめに

前提

  • Windows 10 pro バージョン1803
  • 以前の記事にしたがって、Gmailが届いたら、Google homeがしゃべってくれるようになっていること

概要

  • まず、大雑把な流れを考える
  1. IFTTTで、スケジュールのタイトルと説明と場所と開始時刻と終了時刻をGoogle Drive Spreadsheetに書き込む
  2. cronで毎分起動するnode.jpツールで Google Drive Spreadsheetから情報を取得する
  3. 取得した新着タイトルと送り主を、「Google home喋らせサーバ」に送る
  • ざっくりした流れは以前の記事と同じだが、1と2は手が加わる
  • 3の面倒くさい「Google home喋らせサーバ」は以前の記事そのまま流用できるので、以前の記事が実現されていれば今回は作業なし

IFTTTで、スケジュールのタイトルと説明と場所と開始時刻と終了時刻をGoogle Drive Spreadsheetに書き込む

  • IFTTTにアクセスして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を入れる

nodo.jsをWSLに入れる(最新にする)

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

  • 前提モジュールをインストール
sudo npm child_process sleep google-spreadsheet 
  • googleのデベロッパーコンソールに行って、[プロジェクトを作成]を選ぶ
  • [同意して続行]をクリック
  • [認証情報に進む]をクリック
  • [キャンセル]をクリック
  • 「認証情報」のタブを選択し、 [認証情報を作成]をクリック
  • 「サービスアカウントキー」をクリック
  • サービスアカウントを作成
  • KeyTypeはjsonを選択
  • jsonを保存
  • jsonの中の、"client_email"を調べておく
  • Googleスプレッドシートに行く
  • [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とスクリプトのフルパスは適切に変更してください
*/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を入れる

example.jsを編集する

nohupで動かしておく

おわりに

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

追記

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
4