LoginSignup
10
17

More than 5 years have passed since last update.

Gmailに来た特定のメールを読んでカレンダーにイベント登録するGASスクリプト

Last updated at Posted at 2016-10-21

こういう処理をたまに書きたくなった時のための備忘録。

具体的には、某オンライン英会話スクールでレッスンを予約すると受付完了メールが届くので、これを勝手に(5分おきに)読んでGoogle Calendarにイベントとして登録するためのスクリプト。

レッスンを予約すると

aaaaaa 様

いつも◯◯◯◯◯◯をご利用いただき、ありがとうございます。
下記のとおり、予約レッスンを承りました。

------------------------------------------------------
講師名:Xxxxxx
ご予約日:2016年10月20日(木)
開始時間:06:00
------------------------------------------------------

...

みたいなメールが届くので、これを適宜Google Calendarにぶち込みたい。
(もしかして今のGmail/Google Calendarってこんな事しなくても勝手にやってくれたりする?)

スクリプト(Google Apps Script)の編集

https://script.google.com/ でスクリプトを編集。
(↑今までGoogle Spreadsheetに紐付いたスクリプトしか書いたことがなかったから新鮮)

プロジェクト名は適当につける。(英会話ヘルパーとか。後でアクセス許可を求められた時に自分のものだと気づける名前がいい)
ファイル名はどうでもいい。reservation_mail_to_calendar.gs にしてるけど。

reservation_mail_to_calendar.gs
//
// Gmailに来た予約受付完了メールを読んでカレンダーに登録する
//
function reservation_mail_to_calendar() {
  var expected_subject = '予約レッスン・受付完了のお知らせ';
  var sender_email_address = 'xxxxxx@xxxxxx.xxx';
  var calendar_name = '英会話';
  var lesson_duration = 25; // minutes

  var threads = GmailApp.search('subject:' + expected_subject + ' from:' + sender_email_address + ' is:unread', 0, 500);
  for (var i=0; i<threads.length; ++i) {
    var msgs = threads[i].getMessages();
    for (var j=0; j<msgs.length; ++j) {
      var msg = msgs[j];
      // if (!msg.isUnread()) continue; // これは効かない
      if (msg.isStarred()) continue;

      var body = msg.getPlainBody();
      var lines = body.split('\r\n');

      var teacher_name = lines[6].slice(4);
      var lesson_start_str = lines[7].slice(5,9) + '/' + lines[7].slice(10,12) + '/' + lines[7].slice(13,15) + ' ' + lines[8].slice(5) + ' +0900';
      var lesson_start = new Date(lesson_start_str);
      var lesson_end = new Date(lesson_start.valueOf() + lesson_duration*60*1000);

      var event_title = teacher_name + '予約';
      var event_details = '予約レッスン(' + teacher_name + ')';

      var cal = CalendarApp.getCalendarsByName(calendar_name)[0];
      cal.createEvent(event_title, lesson_start, lesson_end, {description: event_details});

      msg.markRead();
      msg.star();
      msg.refresh();
    }
  }
}

// GASのnew Date(日付文字列)はISO-8601の日付文字列にフル対応してくれているわけではない事に注意。
// →参考:Google Apps Scriptの日付文字列の変換

件名が同じメールは1つのスレッドにまとめられてしまって未読管理が意図通りに行かない(同じイベントがいくつも立ってしまう!)ので、カレンダーに登録済みのメッセージにはstarを付けて識別している。

スクリプトを実行すると、GmailとGoogle Calendarそれぞれについてアクセス許可が求められるので適宜許可する。

Google Calendar側の準備

Google Calendar側に、それ用のカレンダー(ここでは「英会話」という名前にしている)を用意しておくこと

適当な間隔のトリガーを設定して自動運行。

リソース>現在のプロジェクトのトリガー、で「新しいトリガーを追加」。関数reservation_mail_to_calendarを、時間主導型の分タイマーで5分ごとに実行。

参考

10
17
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
10
17