Google Apps Script使ってシネマシティの予約をGoogleCalendar上で把握する
4月多忙すぎてこのブログも放置していてすいません。そして、そんな状況なので映画も見にいけてなくてストレス! ということでなんか新しいことをやろう、と思い立ち、前々からやろうやろうと思っていてできていなかった、Google Apps Scriptでのメール→スケジュール連携をやってみました。
参考にさせて頂いたたのはコレ。
TOHOシネマズは基本的に行かないので、やはり頻度の高いシネマシティを最初に作ろうということで。
- 発券はSuicaタッチで済むので、予約番号がわかる必要はない
- キャンセルを頻繁にするので、それをGoogleCalendarに反映できると嬉しい
といったところを踏まえてふにふにコーディング。
function cinemacity() { var calendar = CalendarApp.getDefaultCalendar(); var start = 0; var max = 10; //こんなに一気に予約しないけど。 var threads = GmailApp.search('from:webmaster@cinemacity.co.jp newer_than:2d ',start,max); threads.reverse(); //古いほうから処理 for(var i in threads){ var thread = threads[i]; var msgs = thread.getMessages(); for(var j in msgs){ var msg = msgs[j]; var subject = msg.getSubject(); var body = msg.getPlainBody(); rowbody = body; body = body.replace(/[\n\r]/g,""); //正規表現に改行コード入れると見づらいので削除しておく if (subject.match(/【シネマシティ】チケットご予約.+のお知らせ/)){ var title = body.match(/■作品名([^■]+)■/)[1]; var theatre = body.match(/■劇場([^■]+)■/)[1]; //そいえばイオンシネマだと記載がないよね var seat = body.match(/■座席([^■]+)■/)[1]; var match=null; if(match = body.match(/■上映時間([^■]+)年([^■]+)月([^■]+)日\(.+\) ([^■]+:[^■]+) \- ([^■]+:[^■]+)■/)){ var start_date_time = new Date(match[1]+ "/" + match[2] + "/" + match[3] + " "+match[4]+":00"); var end_date_time = new Date(match[1]+ "/" + match[2] + "/" + match[3] + " "+match[5]+":00"); } //シネマシティは終映時刻も予約メールに入っている。えらい! Logger.log("Title : " + title); Logger.log("Theatre: " + theatre); Logger.log("Seat : " + seat); Logger.log("From : " + start_date_time); Logger.log("To : " + end_date_time); var registed_events = calendar.getEvents(start_date_time, end_date_time, {search: title + " シネマシティ " + theatre + seat}); if(subject.match(/【シネマシティ】チケットご予約完了のお知らせ/)){ if(registed_events.length == 0) { var event = calendar.createEvent(title, start_date_time, end_date_time, {description: rowbody, location: "シネマシティ " + theatre + seat}); Logger.log("Calendar Registered: " + event.getId()); } else { Logger.log("Already registered. (count:"+registed_events.length+") ("+registed_events[0].getTitle()+")"); } }else if(subject.match(/【シネマシティ】チケットご予約削除のお知らせ/)){ if(registed_events.length > 0) { registed_events[0].deleteEvent(); Logger.log("Calendar Deleted " ); } else { Logger.log("Already deleted. "); } } Logger.log("----------------------------------"); } } } }
正規表現がちょいダサいというところはあるものの、目的は足すだけならこんなもんだろ、というところで。使い方は最初に書いたリンク先参照。
あとはイオンシネマとチネチッタを作れば8割カバーできるかな。
(4/30追記)会員期限のお知らせとか届くとエラーになることが判明したので直しました