読者です 読者をやめる 読者になる 読者になる

元エンジニア・ちゃんみどの素人テックブログ

Web系無職がエンジニアに返り咲くための限りなく素人に近いテックブログ。 夢は旦那さんとslackで生活すること。

slackbot開発log。1日のはじめにGoogle Calendarの予定を通知したい!vol.3

slack node.js hubot プログラミング

 

chanmid0.hatenablog.jp

前回、Googleの接続サンプルをもとにしてGoogle Calendar APIの接続に成功しました。今日はサンプルではなく実際に書いてデータを取得したい!

サンプルを置いたscriptsフォルダに「calender.coffee」というファイルを作って、そこに書いていきます。scriptsフォルダに実行するスクリプトを書いておいておけば動くみたい。

 

やりたいことを文にしてみよう

どんなプログラム書いたらいいかを整理します。

  • トリガー:毎朝9:00になったら
  • やること:APIに今日の予定を聞く
  • 予定があったら:ミスタースラックボットが「今日は○○時に「△△」の予定があります」とslackに投稿する
  • 予定がなかったら:ミスタースラックボットが「今日は特に予定がありません」とslackに投稿する

文章にすると、やるべきことが明確になります!APIの取得さえうまくいけば、すんなり書けそうな気がする。

 

サンプルはそのまま持ってきただけだから動いたけど、一からデータ取得まで書けるきがしないので、サンプルを展開して実現することにしました。

quickstartjsにでスタースラックボット氏がしゃべる内容を作って、calender.coffeeにしゃべる内容を渡して、通知してもらう。こんなかんじで進めました!

 

データを取得する

「今日1日の予定を取得する」をもっとプログラム寄りに考えてみます。

  • cronを動かした時間~今日の23:59:59までの予定を取得する

まずはここを組みました。

quickstartjsには、APIに渡す値の中に起動した時点から10件先のデータを取ってくるようになっていたので、取得する予定のおしりを書かなきゃいけません。

今回APIに渡すデータはこちら。追加したのはtimeMaxのみです。解説入れていきます。

auth: auth,
calendarId: 'primary',
timeMin: (new Date()).toISOString(), //取得対象日時の始点。ここでは今日。
timeMax: (max).toISOString(), //取得対象日時の終点。maxは今日の23:59:59。省略可
maxResults: 10, //MAXで取得する件数
singleEvents: true,
orderBy: 'startTime' //取得順はカレンダーの開始時間順

 

maxは今日の23:59:59で、半日くらい悩んだ末、こんなかんじで書けた…

var max = new Date(new Date().setHours(23));
max = new Date(max.setMinutes(59));
max = new Date(max.setSeconds(59));

 取得できたので、出力です。

  • 今日は【時間】に「【予定名】」の予定が入っています。

サンプルには0件だった場合、取得失敗した場合などエラーパターンがもう書かれているので、おいおいいいかんじにしていくとして、成功パターンの文言を考える

var event = events[i];
var start = event.start.dateTime || event.start.date ;
startTime = start.slice(11,16);
console.log('今日は' + startTime + 'に「' + event.summary + '」の予定が入っています。');

startで取れる値が「2017-03-20T16:00:00+09:00」こんなかんじ。startTimeでこの「16:00」の時間部分をスライスしてる。event.summaryは予定タイトル。

今日は16:00に「会議」の予定が入っています。

こんなかんじで吐き出されます。

 

次やること

JSに慣れてないから、時間取得のところとか半日うなって考えてました。

でもローカル上で動くところまで確認出来たので、

次回はcronの設定を書いてミスタースラックボット氏がつぶやくまで出来たらいいなと!

 

JavaScript 第6版

JavaScript 第6版