アルパカ翻訳者の備忘録

フリーランス翻訳者claponが気になったことをまとめます

DMM英会話のレッスン予約確認メールからGoogleカレンダーに自動登録する

DMM英会話始めました! 毎日レッスンできるので楽しいですね。予約も取れますし。しかし唯一不満な点は、予約した内容をカレンダーに入れる機能が提供されていないことです。

そんなわけでこちらのサイトを参考に、簡略化してカスタマイズしました。
blog.shotarok.com

この技が使えるのは次の人です。

仕組み

レッスン予約したときにDMM英会話から届く「レッスン予約」というメールが未読の中にあると、スクリプトが発動して、あらかじめ指定したカレンダーに予定が自動登録されるようにします。

ではさっそく内容を説明しますよ〜!

作り方

Googleドライブで新規スクリプトプロジェクトを作る

ドライブで新規スクリプトの作り方

「新規」→「その他」→「Google Apps Script」を選びます。


Google Apps Script画面が表示されます。
Google Apps Script画面

ここに、次のコードをコピペします。
一部、
GASでDMM英会話の予約メールから自動的にカレンダーに登録 | shotarok's Tech Blog
さんのソースを拝借しました!

/**
 * 検索結果のそれぞれのメールに対して与えられた処理を行う
 *
 * @param {string} criteria 検索条件。Gmailで絞り込むのと同等の文字列
 * @param {function} callback 1メールに対して行う処理。callback関数への引数にはGmailMessageが渡される
 */
function eachMessage(criteria, callback) {
  GmailApp.search(criteria).forEach(function(thread) {
    thread.getMessages().forEach(callback);
  });
}

/**
 * 検索結果の未読メールに対して与えられた処理を行た後、既読にする
 *
 * @param {string} criteria 検索条件。Gmailで絞り込むのと同等の文字列
 * @param {function} callback 1メールに対して行う処理。callback関数への引数にはGmailMessageが渡される
 */
function eachUnreadMessage(criteria, callback) {
  GmailApp.search(criteria).forEach(function(thread) {
    thread.getMessages().forEach(function (message) {
         if (message.isUnread()) {
             callback(message);
             message.markRead();
         }
     });
  });
}

/**
 * デフォルトのカレンダーにイベントを登録する
 *
 * @param {string} title イベントのタイトル
 * @param {Date} startDate イベントが始まる時刻
 * @param {Date} endDate イベントが終わる時刻
 */
function createEvent(title, startDate, endDate, event) {
  if (!(title && startDate && endDate)) {
      return event;
  }  
  // 指定したカレンダーにイベントを登録
  var cal = CalendarApp.getCalendarById('☆自分のカレンダーID☆');
  var event = cal.createEvent(title, startDate, endDate);
  Logger.log('Event ID: ' + event.getTitle() + '[' + startDate + '~' + endDate + '] is created');
  
  return event;
}

function myFunction() {
  // 予約確認メールの送信者とメール件名
  var criteria = "from:noreply@eikaiwa.dmm.com レッスン予約";
  eachUnreadMessage(criteria, function (message) {
    var body = message.getBody();
    //  「2020/06/27 21:00のTonyとのレッスン予約が完了しました」から抜き出します
    var [matched, year, month, day, sh, sm, teacher] = /様、(\d+)\/(\d\d)\/(\d\d) (\d\d):(\d\d)の(\w+)との/.exec(body);
    var sdate = new Date(year, month-1, day, sh, sm);
    var edate = new Date(sdate.getTime() + 30 * 60000);
    var event = createEvent("DMM英会話:" + teacher, sdate, edate, 'https://eikaiwa.dmm.com/');
    // レッスン15分前にポップアップアラートを表示
    event.addPopupReminder(15);
  }
  );
}


DMM英会話でレッスンを予約すると、その直後に「レッスン予約」という件名で「レッスンの予約が完了しました」というメールが届くはずです。
それからカレンダーのイベントを作りますよ。

登録するカレンダーは、特定のカレンダーに決めてください。
私はGoogleカレンダーに「DMM英会話」というカレンダーを作りました。
そのカレンダーを右クリックして「設定と共有」を選択すると、カレンダーの設定画面になるので、
カレンダーの設定画面

下にスクロールして、「カレンダーの統合」の所にある「カレンダーID」をコピペします。
カレンダーの統合

これを、先ほどのコードの中の「'☆自分のカレンダーID☆'」と置き換えてくださいね。

そして、スクリプトを適当な名前で保存します。

承認

すると、権限の承認を求めるメッセージが出ます。
承認画面

「許可を確認」をクリックして、自分のアカウントを選びます。
すると、「このアプリは確認されていません」というエラーメッセージが出るんですけど…
このアプリは確認されていません

ここで、左側にある「詳細」というリンクをクリックします。
(右側の青いボタンを押さないように!)
「詳細」をクリックした後の画面

すると、下に「(プロジェクト名)(安全でないページ)に移動」というリンクがあるのでそれをクリックします。
アカウントに権限を許可するか確認されるので、「許可」します。

実行してみる

未読のレッスン予約メールを用意して、試しに動くか確認してみてください。
メニューバー
メニューバーの「再生」みたいな記号をクリックすると実行されます。
(もしくは、メニューから「実行」→「関数を実行」→「myFunction」)


うまく動きましたか?

「DMM英会話: Tony」というようなイベントが、指定したカレンダーに、指定どおりの日時にできていれば成功です。
予約の15分前にポップアップで通知するように設定されています。
(そこは自由にカスタマイズしてください)

自動でトリガーされるようにする

DMM英会話からメールが届いたときに起動されるようにしたいので、このプログラムのトリガーを登録します。
「編集」→ 「現在のプログラムのトリガー」を選択すると、トリガー画面になります。

右下の「トリガーを追加」をクリックすると、トリガー設定画面が表示されるので
トリガー設定画面

実行する関数: myFunction
イベントのソースを選択: 時間主導型
時間ベースのトリガーのタイプを選択: 分ベースのタイマー
時間の間隔を選択: 1分(好きな時間に設定してください)


これで完成です!
予約したらカレンダーに登録されるはずですが、どうでしょうか…?

ちなみに

iPhoneの人は、iOSGoogleカレンダーを連携させると幸せになれます!
support.google.com
ポップアップ通知も来ますよ。