2015/11/08 16:17
|
【GAS】DMM英会話の予約完了メールから自動的にカレンダーイベントを作成するスクリプト
|
**2017/01/08: maxさんのコメントを受けて一部修正しました**
**2019/10/14: yuki_iwnrさんのコメントを受けて修正し、下記のgithub repository に最新版を掲載しました。**
[git hub repos](https://github.com/koucs/dmm-eikaiwa-calendar)
DMM英会話で英会話レッスンを始めました。
10月からDMM英会話で毎日30分の英語レッスンを受講しています。
レッスンサービスには大変満足しているのですが、*毎日の予約を行ってからレッスンの開始時間を受講前に忘れてしまい、受講できなかったという事*が何度かありました。
これには何点か問題が有るのですが、その中のひとつはスマートフォン用の専用アプリが無いことでしょうか。(私の知る限りではですが)
毎回レッスンの予約が完了すると以下の画像のようなメールが送られてくるのですが、それ以外の事前通知はありません。

もちろん、「スマートフォンのSkypeの通知を常にONにしておく」「このメールから手動でスケジュールを作成」などの解決法はあるけど、少し面倒だ。。。と感じたわけです。
そこで、*Google Apps ScriptでGmailとGoogleカレンダーを連携してこれをラクに自動化しよう*というのが本記事の目的です。
### Google Apps Scriptでのスクリプト作成
(※本記事は[y_kohさんの記事](http://yoonchulkoh.hatenablog.com/entry/2013/06/21/123348)を参考に作成しています)
#### 1.Google ドライブでスプレッドシートを作成

<br />
<br />
#### 2.スクリプトエディタを開く

<br />

<br />
<br />
#### 3.ソースを貼り付ける
```javascript
// 【件名フォーマット(恐らく固定)】
// 【DMM英会話】レッスン予約完了のお知らせ
// 【予約内容フォーマット】
// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// ■ 英会話 レッスン予約完了のお知らせ
// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// 講師名:XXXX XXXX
// 講師Skype名:online.teacher.xxxxxx
// ご予約日:2015年11月04日
// 開始時間:21時30分
var CALENDAR_NAME = 'DMM_English_Lessons';
var MAIL_SEARCH_QUERY = 'newer_than:1d subject:"【DMM英会話】レッスン予約完了のお知らせ"';
var BODY_SEARCH_QUERY = '■ 英会話 レッスン予約完了のお知らせ';
var EVENT_TITLE = '【DMM英会話】';
function registDmmCalendar() {
// 指定したカレンダーを取得(無ければ作成)
var calendars = CalendarApp.getCalendarsByName(CALENDAR_NAME);
var calendar;
if (calendars.length === 0) {
calendar = CalendarApp.createCalendar(CALENDAR_NAME);
} else {
calendar = calendars[0];
}
var row = 1;
// Gmailから指定文字列でスレッドを検索する
var threads = GmailApp.search(MAIL_SEARCH_QUERY);
// スレッドで繰り返し
for (var i = 0; i < threads.length; i++){
// スレッド内のメッセージを取得
var messages = threads[i].getMessages();
// メッセージで繰り返し
for (var j = 0; j < messages.length; j++) {
// メッセージ本文
var body = messages[j].getBody();
var splitedBody = body.split("\n");
for (var k = 0; k < splitedBody.length; k++) {
// メール本文にDMM英会話のレッスン予約完了の旨が書いてあるかの確認を行う
if (splitedBody[k].indexOf(BODY_SEARCH_QUERY) != -1) {
// 講師名(skype名)
var str = splitedBody[k+2];
var teacher_name = str.match(/講師名:([\s\.0-9a-zA-Z]+)/);
var str = splitedBody[k+3];
var teacher_skype = str.match(/講師Skype名:([\s\.0-9a-zA-Z]+)/);
// 予約日
str = splitedBody[k+4];
var date = str.match(/(\d+)年+(\d+)月+(\d+)日/);
// 開始時間
str = splitedBody[k+5];
var time = str.match(/(\d+)時+(\d+)分/);
Logger.log(str + " -> " + time[1] + time[2]);
var content = EVENT_TITLE + " " + teacher_name[1] + " (" + time[1] + ":" + time[2] + ")"
var date_arg = date[1] + "/" + date[2] + "/" + date[3]
var time_arg = time[1] + ":" + time[2]
// カレンダーに追加する
_addToCalendar(calendar, content, date_arg, time_arg);
break;
}
}
}
}
}
// カレンダーに追加する
// date : "yyyy/mm/dd"
// time : "hh:mm"
function _addToCalendar(calendar, content, date, time) {
// イベントの日付
var startDate = new Date(date + " " + time);
var endDate = new Date(date + " " + time);
endDate.setTime(endDate.getTime() + 30*60*1000)
// その日のイベント
var eventsForDay = calendar.getEvents(startDate, endDate);
var exsists = false;
// 既存のイベントに存在するか確認する
for (var l = 0; l < eventsForDay.length; l++) {
// 存在したらフラグを立ててループを抜ける
if (content === eventsForDay[l].getTitle()) {
exsists = true;
break;
}
}
// 既存のイベントが存在しなかった場合のみイベントを登録する
if (!exsists) {
var event = calendar.createEvent(
content,
startDate,
endDate
);
}
}
```
<br />
上記の内容をコピーして貼り付けます。
##### 一部解説
```javascript
var MAIL_SEARCH_QUERY = 'newer_than:1d subject:"【DMM英会話】レッスン予約完了のお知らせ"';
```
ここでは、メールの検索条件を指定していますが、自分の場合は1日に1レッスン(30分)のみで、毎日朝にサイトで予約している状況ですので、newer_than: 1dで直近1日前までのメールのみ取得してカレンダーに反映しています。
ここの検索条件は個々の設定の行い方にも依る部分もあると思います。
<br />
その後、ファイルの保存、関数名の設定は適当な名前を設定するだけでOKです。
<br />
<br />
**2017/01/08追記: 修正前のコードではDMM英会話用のカレンダーに登録されていないようでしたので、修正しました。**
<br />
#### 4.実行

<br />
この後、アプリケーションの連携の認証を尋ねられますが、そのまま許可して実行します。

<br />
このように、カレンダーに追加されていれば成功です。
<br /><br />
#### 5.定期処理に反映

<br />

<br />
その後、「保存」をクリック。そして処理予定時間を楽しみに待つ。
<br />
**2017/01/08追記: 実際に使ってみると1日1回の実行だと心もとないです。本記事のコードでは重複してイベントが登録されることもありませんので、1時間毎の実行にしても特に問題はありません。**
### 終わりに
今回は初めてのGoogle Apps Script(GAS)を活用してみましたが、かなり簡単に作ることが出来ました。
ただ、スレッドにまとめられたメールの処理や、二重登録の仕方など改善の余地はあるので、改善したらコードの修正版をアップしたいと思います。