Gmail로 전송되는 예약 완료 이메일에서 캘린더에 자동 등록

12085 단어 GoogleAppsScriptgmail

무엇을 할 수 있습니까?



Gmail에 특정 이메일이 도착하면 캘린더에 일정이 추가됩니다.
특정 라벨이 붙은 메일을 읽어 내용을 이런 식으로 캘린더에 추가합니다.

계기



수수께끼 풀기 이벤트의 예약을 자주 취하고 있습니다만, 캘린더에 예정을 넣어 가는 것이 귀찮아져 왔기 때문에 자동화한 대로입니다.
자동 추가 되지 않을까라고 생각했습니다만 되는 대상이 한정되어 있네요.
처음에는 IFTTT나 MS Flow만으로 어떻게든 할 수 있을까라고 생각했습니다만, 어떻게든 안 되었기 때문에 GAS를 쓰기로 했습니다.

했던 일



라벨 설정



GAS와는 직접적인 관계는 없지만, 이것이 실패하고 있으면 이후 총 무너지기 때문에 중요합니다.
이번에는 특정 이메일 주소에서 보내지고 특정 키워드가 제목에 포함되어 있음이 확인되었습니다.
from 과 subject 를 검색 조건으로 지정해 주면 잘 되었습니다.

검색 조건의 예

from: 응후 @ 에이 ぇ t. 그래 mpぇ. 이 m subject:예약 완료

메일 받기



특정 라벨이 붙은 메일을 가져옵니다.
// 検索条件。Gmailの検索欄と同じものを指定できる。
var terms = "label:イベント予約 is:unread";
var max = 100;
// スレッド形式で該当するメールを取得する。
var threads = GmailApp.search(terms, 0, max);

검색된 메일은 스레드 형식입니다. 1시간 이내 정도로 여러 번 예약을 하면 스레드에 정리되는 것 같습니다. 어떤 조건인지 알고 싶다.

캘린더에 추가



캘린더 개체를 가져와서 지정된 형식으로 가공하여 이벤트를 등록합니다. 가공 부분은 후술합니다.
그 이외에도, 라벨 첨부나 읽어 들여 상태를 플래그로서 사용하고 있습니다.
// 前項で取得したメール
var threads = getThreads();
var calendar = CalendarApp.getCalendarById("[email protected]");
for(var j in threads){
  for (var k in threads[j]) {
    var message = threads[j][k];
    // 既読を処理済み扱いしてスキップするときはこうする
    if(!message.isUnread()) continue;

    try {
      var result = // ここで加工する

      // タイトルと開始・終了時刻までは必須。
      var event = calendar.createEvent(result.title, result.starts, result.ends, result.metadata);
      Logger.log("Added: %s %s - %s", result.title, result.starts, result.ends);
    }
    catch (ex) {
      Logger.log(ex);
      var failed = GmailApp.getUserLabelByName("Failed");
      // 登録失敗のラベルをつける
      message.getThread().addLabel(failed);
      continue;
    } finally {
      // 既読にして処理済みとする
      message.markRead();
    }
  }
}

본문과 제목에서 약속에 필요한 정보를 얻습니다.



타이틀과 본문을 취득한 뒤는 정규식 검사기 그리고 노력합니다.
// タイトルと本文を取得する
var subject = message.getSubject();
var body = message.getBody();
// あとは正規表現で頑張る。
var order = body.match(/---------------お申込情報--------------([\s\S]+)決済方法/)[1];
var location = order.match(/会場 ?:[\s]+(.+)/)[1];
var title = order.match(/公演名 :[\s]+(.+)/)[1];
var date = order.match(/([0-9]+年[0-9]+月[0-9]+)\([月火水木金土日]\)/)[1].replace(/[年月]/g, "/");
var time = order.match(/[0-9]+:[0-9]+/g);
var starts = new Date(date + " " + time[0]);
var ends = new Date(date + " " + time[0]);
ends.setHours(ends.getHours() + 2);

var result = { title: title, starts: starts, ends: ends, metadata: { location: location } };

트리거 구성



실행할 함수를 결정하고 트리거를 설정합니다. 이번에는 처리 시간이 시비아가 아니지만 가능한 한 빨리 확인하고 싶기 때문에 실행 간격 5 분 간격으로하고 있습니다.



그 후



실행해 보면 무사 등록할 수 있었습니다. 다만, 가끔 서식이 바뀌므로 등록에 실패하는 일이 있으므로, 정기적으로 메인터넌스가 필요하네요. . . .

좋은 웹페이지 즐겨찾기