Gmail에서 수신한 예약 완료 이메일에서 Google 캘린더에 이벤트를 추가하는 GAS 스크립트
경위
Skype 영어 대화 예약 완료 이메일에서 Google 캘린더에 추가하는 스크립트를 작성하여 작년부터 사용하고 있습니다.
거기의 메일이 조금 포맷이 바뀌거나 하는 것과 새롭게 피트니스에도 다니기 시작해 그쪽의 예약 메일에도 대응하고 싶었으므로 조금 재작성해 보았습니다.
참고한 기사
【GAS】DMM영화의 예약 완료 메일로부터 자동적으로 캘린더 이벤트를 작성하는 스크립트
이 사람은 모든 메일에서 대상 메일을 검색하는 스크립트를 쓰고 있었지만, 자신의 환경에서는 메일 수가 너무 많았기 때문에 잘 돌아 가지 않았기 때문에 Gmail의 라벨을 검색용 + 처리된 플래그에 사용 같이 해 보았습니다.
사전 준비
【GAS】DMM영화의 예약 완료 메일로부터 자동적으로 캘린더 이벤트를 작성하는 스크립트
이 사람은 모든 메일에서 대상 메일을 검색하는 스크립트를 쓰고 있었지만, 자신의 환경에서는 메일 수가 너무 많았기 때문에 잘 돌아 가지 않았기 때문에 Gmail의 라벨을 검색용 + 처리된 플래그에 사용 같이 해 보았습니다.
사전 준비
사용법
코드
calendar.gs
/*
* Gmailに受信した予約完了メールから自動的にGoogle Calendarにイベント登録する
* サービス/会社ごとに微妙に日時・タイトルフォーマットが違うので設定できるようにしてみた
*/
// 日時の正規表現パターン
var RegExpPattern = {
1: { // 例: FeelCycleの予約完了メールパターン
regExp_date: /(\d{4}年\d{1,2}月\d{1,2}日)/gm,// 日時形式(ex: 2016年6月25日)
regExp_time: /(\d{2}:\d{2})/gm,// 時刻書式(ex: 20:15)
regExp_replace: /[年月日]/gm, // 日時に含まれる、「年,月,日」を「/」に置換する
regExp_pos: 0 // 本文中何回目に出てくる日時・時刻を開始日・時刻とするか(通常は0=1回目)
},
2: { // 例: QQ Englisの予約完了メールパターン
regExp_date: /(\d{4}-\d{2}-\d{2})/gm,// 日時形式(ex: 2016-06-25)
regExp_time: /(\d{2}:\d{2})/gm, // 時刻書式(ex: 20:15)
regExp_replace: /-/gm, // 日時に含まれる、「-」を「/」に置換する
regExp_pos: 1 // 以下の文例のように、受付日時が最初に来るので1(2回目)を指定
}
}
// QQ Englishのメール文例
// 日頃はQQイングリッシュをご利用頂き、ありがとうございます。
// 下記の内容でご予約を受け付けました。内容をご確認下さい。
//
// 【ご予約内容】受付日時: 2016-07-28 15:56
// ------------------------------------------------
// 日付: 2016-08-06
// 時間: 07:30-08:00
// 教師: Saravi
// カリキュラム: ビジネスイングリッシュ
// ------------------------------------------------
function main(){
createEventFromGmail("QQENG","English", "レッスン予約完了", 2,30)
// イベント名: QQENG
// カレンダー名:English
// タイトルに含まれるキーワード: 予約
// 日時の正規表現パターン: 1
// 一回あたりのレッスン時間: 30分
createEventFromGmail("FeelCycle","Excercise", "予約", 1,45)
// イベント名: FeelCycle
// カレンダー名:Excercise
// タイトルに含まれるキーワード: 予約
// 日時の正規表現パターン: 2
// 一回あたりのレッスン時間: 45分
}
function createEventFromGmail (EventName, CalendarName, Keyword,RegExpPatternNo,DurationMin) {
// EventNameのラベルがついているメールスレッドを取り出す
var threads = GmailApp.getUserLabelByName(EventName).getThreads();
// それぞれのスレッドに関して
for (var i = 0,thread; i<threads.length; i++) {
thread = threads[i]
// 含まれるメッセージを取り出し、
var messages = thread.getMessages();
for(var j = 0,message; j<messages.length; j++){
var message = messages[j]
// メッセージのタイトルにKeywordが含まれていた場合は
if(message.getSubject().indexOf(Keyword)>0){
// 本文を取り出して、
var body = message.getBody();
// 設定したパターンにマッチする日時を探して、
var regExp_date = RegExpPattern[RegExpPatternNo].regExp_date;
var regExp_time = RegExpPattern[RegExpPatternNo].regExp_time;
var regExp_replace = RegExpPattern[RegExpPatternNo].regExp_replace;
var regExp_pos = RegExpPattern[RegExpPatternNo].regExp_pos;
var date = body.match(regExp_date);
var time = body.match(regExp_time);
// イベント開始時刻
var from = new Date(date[regExp_pos].replace(regExp_replace,'/')+" "+time[regExp_pos])
// イベント終了時刻 = 開始時刻 + レッスン時間
var to = new Date(+from + DurationMin*60*1000);
// 追加したいCalendarNameという名前のカレンダーを取得し、
var myCalendar = CalendarApp.getCalendarsByName(CalendarName)[0];
// ちゃんと存在したら
if(myCalendar){
// 同じ時刻に、同じイベント名で登録されているイベントを探してみて、
var existingEvents = myCalendar.getEvents(from, to, {search: EventName})
// なかったらイベントを作成する
if(existingEvents.length == 0){
myCalendar.createEvent(EventName, from,to, {description: body});
} else {
Logger.log(from)
Logger.log("イベント登録済みです");
}
}else{
Logger.log("カレンダーが見つかりませんでした: "+CalendarName);
}
}
}
// 繰り返し処理がされないためにラベルを削除
thread.removeLabel(GmailApp.getUserLabelByName(EventName));
}
}
Reference
이 문제에 관하여(Gmail에서 수신한 예약 완료 이메일에서 Google 캘린더에 이벤트를 추가하는 GAS 스크립트), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/chkk525@github/items/d7e739361fd7f78cb7cf텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)