こんにちは。
キャスレーコンサルティングのSI(システム・インテグレーション)部の高橋です。

これまでも技術ブログでは、
Google Apps Script入門
Google Apps Scriptで、心温まる年賀状を作ろう!
Google Apps Scriptとラベルで実現する業務効率化のすゝめ
Google Apps Scriptでカレンダー連動リマインドのすゝめ

と過去に取り扱っていますが、
今回は、「未回答のイベントをリマインド」する方法をご紹介させていただきます!

背景

弊社では、Google Calendarでイベントの管理を行っています。
参加不参加の登録は、招待メールからもすぐできるのですが、
イベント開催よりかなり早めに告知されることもあり、つい後で返答しようと思って忘れてしまうことがあります。

さらに、リマインドメールもいただくのですが、
返答有無に関わらず、全員宛で送信されるため、参加ボタンを押したつもりになり、確認を怠ってしまうことがあります。

そんな自身の経験から、
未回答のイベントをリマインドができたら良いなと思い、スクリプトを作ってみました!

処理の流れは、下記のようになります。
①今日から一週間後までのイベントを、取得する。
②イベントの回答ステータスを、確認する。
③未回答のイベントのタイトルを、メールで送信する。

以下、ソースコードを交えてご説明させていただきます!

今日から一週間後までのイベントを取得

今日から一週間後までのイベントを取得するには、
まずカレンダーを取得し、その後期間を指定してイベントを取り出す必要があります。
自分のカレンダーは、【CalendarApp#getDefaultCalendar()】で取得できます!
カレンダーからイベントを取得するには、【Calendar#getEvents(startTime, endTime)】ですね!

  var fromDate = new Date();
  var toDate = new Date();
  toDate.setDate(toDate.getDate() + 7);

  var calendar = CalendarApp.getDefaultCalendar();
  var calendarEvents = calendar.getEvents(fromDate, toDate);

イベントの回答ステータスを確認

ステータスは、Enum【CalendarApp.GuestStatus】で下記の5つが定義されています。
「INVITED(未回答)」
「MAYBE(未定)」
「YES(出席)」
「NO(欠席)」
「OWNER(オーナー)」

今回は、「INVITED(未回答)」と「MAYBE(未定)」の場合にメールを送信したいので、
取得したイベントから、「INVITED(未回答)」と「MAYBE(未定)」であるものをfilterします。

  var unansweredEvents = calendarEvents.filter(
    function (calendarEvent) {
      return calendarEvent.getMyStatus() == CalendarApp.GuestStatus.INVITED ||
             calendarEvent.getMyStatus() == CalendarApp.GuestStatus.MAYBE;
    }
  );

未回答のイベントのタイトルをメールで送信

「INVITED(未回答)」と「MAYBE(未定)」であるイベントから、イベントタイトルを取得し、
メールタイトルと本文を相応しいものにして、【MailApp#sendEmail(recipient, subject, body)】で送信しましょう!

  var eventTitleText = '';
  unansweredEvents.forEach(
    function (unansweredEvent) {
      eventTitleText += unansweredEvent.getTitle() + '\n';
    }
  );

  var sendAddress = '自分@casleyconsulting.co.jp';
  var subject = 'イベント未回答リマインド'
  if (eventTitleText) {
    var body = '下記イベントに未回答です。\n\n';
    body += eventTitleText;
    MailApp.sendEmail(sendAddress, subject, body);
  }

最後に、トリガーを設定すれば自動化も完了ですね!
トリガーについては、過去の記事をご参考に設定してみてください!

Google Apps Scriptとラベルで実現する業務効率化のすゝめ

全ソースコード

  var fromDate = new Date();
  var toDate = new Date();
  toDate.setDate(toDate.getDate() + 7);

  var calendar = CalendarApp.getDefaultCalendar();
  var calendarEvents = calendar.getEvents(fromDate, toDate);

  var unansweredEvents = calendarEvents.filter(
    function (calendarEvent) {
      return calendarEvent.getMyStatus() == CalendarApp.GuestStatus.INVITED ||
             calendarEvent.getMyStatus() == CalendarApp.GuestStatus.MAYBE;
    }
  );

  var eventTitleText = '';
  unansweredEvents.forEach(
    function (unansweredEvent) {
      eventTitleText += unansweredEvent.getTitle() + '\n';
    }
  );

  var sendAddress = '自分@casleyconsulting.co.jp';
  var subject = 'イベント未回答リマインド'
  if (eventTitleText) {
    var body = '下記イベントに未回答です。\n\n';
    body += eventTitleText;
    MailApp.sendEmail(sendAddress, subject, body);
  }

おまけ・メンバーの回答ステータスを確認する

5行目のカレンダー取得を下記に置き換えることで、メンバーが未回答のイベントを知ることができます。

  var calendar = CalendarApp.getCalendarById("メンバー@casleyconsulting.co.jp");
  if (calendar == null) {
    Logger.log("「他のカレンダー」に追加しないと取得できません");
    return;
  }

ただし、メンバーのカレンダーを取得するには、
自分のカレンダーに、メンバーのカレンダーを追加する必要があります。


2017-07-28_011338

「未回答のイベントをリマインド」する方法については、以上となります。
ご一読頂き、ありがとうございました。