こんにちは。
キャスレーコンサルティングの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; }
ただし、メンバーのカレンダーを取得するには、
自分のカレンダーに、メンバーのカレンダーを追加する必要があります。
「未回答のイベントをリマインド」する方法については、以上となります。
ご一読頂き、ありがとうございました。