こんにちは。
キャスレーコンサルティングのSI(システム・インテグレーション)部の田中(雅)です。
これまでも技術ブログでは、
・実務で使えるGoogleAppsScript 入門編
・Google Apps Scriptで、心温まる年賀状を作ろう!
・Google Apps Scriptとラベルで実現する業務効率化のすゝめ
・Google Apps Scriptでカレンダー連動リマインドのすゝめ
・Google Apps Scriptで未回答のイベントをリマインド
と過去に取り扱っていますが、
今回は、「イベントの参加者の回答状況を一覧化」する方法をご紹介させていただきます!
背景
弊社では、会議やイベントなどの出欠を、Googleカレンダーから行っています。
例えば、忘年会などの参加者数が多いときに、
誰がどういう状況か一覧で把握したいと思い、このツールを作成いたしました。
処理の流れは、下記のようになります。
①スプレッドシートから、確認したいイベントの検索ワードを取得
②検索したいワードのイベントを取得
※今回は、ボタンを押下した日から30日後のイベントを対象としています。
③イベントごとの参加者を取得
④参加者の回答ステータスをスプレッドシートに記述
それでは、使い方とソースコードの中身を見ていきましょう。
事前準備
イベントの参加者一覧と、検索ワードを書き込むためのスプレッドシートを用意します。
スプレッドシートから、確認したいイベントの検索ワードを取得
検索ワードを、スプレッドシートから取得します。
// 今開いているシートを呼ぶ var sheet = SpreadsheetApp.getActiveSheet(); // セルB2から検索ワードを取得 var range = sheet.getRange("B2"); var searchKey = range.getValue();
これで「searchKey」に、検索ワードが入ってきます。
検索したいワードのイベントを取得
「CalendarApp.getEvents」 を利用し、取得していきます
var calendarId = "自分@casleyconsulting.co.jp"; var calendar = CalendarApp.getCalendarById(calendarId); var eventList = calendar.getEvents(検索開始日時, 検索終了日時, {search: searchKey});
「eventList」に検索ワードを含む、イベントのリストが入ります。
イベントごとの参加者を取得
配列形式で取得できるので、ループします。
for each(var event in eventList) { var guestList = getGuestList(event.getId()); }
getGuestList内の処理
var searchEventId = eventId.split("@"); var event = Calendar.Events.get(calendarId, searchEventId[0]); return event.attendees;
「eventId」については、”xxxxxx@ドメイン”のような形で取得できるのですが、
「Calendar.Events.get」にて利用できる、eventIdは「@」の前の部分ですのでsplitします。
ここで取得できた「event.attendees」が、参加者の情報になります。
参加者の回答ステータスを、スプレッドシートに記述
ゲストも配列で返ってきているのでループし、セルに合わせた形で書き込んでいきます。
var columnTitle = 'A'; var columnEmail = 'B'; var columnStatus = 'C'; for each(var guest in guestList) { // 参加可否を和名に変換 var responseStatus = transResponseStatus(guest.responseStatus); sheet.getRange(columnTitle+rowNum).setValue(eventTitle); sheet.getRange(columnEmail+rowNum).setValue(guest.email); sheet.getRange(columnStatus+rowNum).setValue(responseStatus); rowNum++; }
columnTitle、columnEmail、columnStatusについては
書き込みたいセルの列名(A,B,C)を、入れています。
transResponseStatusでは、参加者ごとの回答ステータスを和名に変換しています。
transResponseStatus内の処理
switch (responseStatus) { case 'accepted': return '参加'; case 'needsAction': return '返答待ち'; case 'declined': return '不参加'; case 'tentative': return '未定'; default: return '不明'; break }
全ソースコード
上記ソースコードを、まとめたものになります。
// カレンダーIDでカレンダーを取得 var calendarId = "自分@casleyconsulting.co.jp"; var calendar = CalendarApp.getCalendarById(calendarId); // 今日から30日後まで var searchFrom = new Date(Utilities.formatDate(new Date(),"JST","yyyy/MM/dd")); var searchTo = new Date(Utilities.formatDate(new Date(),"JST","yyyy/MM/dd")) searchTo.setDate(searchTo.getDate() + 30); // 今開いているシートを呼ぶ var sheet = SpreadsheetApp.getActiveSheet(); // セルB2から検索ワードを取得 var range = sheet.getRange("B2"); // 検索結果の設定行を指定 var rowNum = 5; // 検索結果の設定列を指定 var columnTitle = 'A'; var columnEmail = 'B'; var columnStatus = 'C'; // ボタン押下時 function buttonPush() { var searchKey = range.getValue(); var eventList = searchGuestList(searchKey); // イベントのリストからゲストリストを取得しスプレッドシートに記入 updateSheet(eventList); } // イベントのリストを取得 function searchGuestList(searchKey) { var eventList = calendar.getEvents(searchFrom, searchTo, {search: searchKey}); return eventList; } // シートを更新 function updateSheet(eventList) { for each(var event in eventList) { var eventTitle = event.getTitle(); var guestList = getGuestList(event.getId()); if ( ! guestList ) { continue; } // シートに値をセット for each(var guest in guestList) { // 参加可否を和名に変換 var responseStatus = transResponseStatus(guest.responseStatus); sheet.getRange(columnTitle+rowNum).setValue(eventTitle); sheet.getRange(columnEmail+rowNum).setValue(guest.email); sheet.getRange(columnStatus+rowNum).setValue(responseStatus); rowNum++; } } } // イベントのゲストリストを取得 function getGuestList(eventId) { var searchEventId = eventId.split("@"); try { var event = Calendar.Events.get(calendarId, searchEventId[0]); } catch(e) { return false; } return event.attendees; } // 参加可否を和名に変換 function transResponseStatus(responseStatus) { switch (responseStatus) { case 'accepted': return '参加'; case 'needsAction': return '返答待ち'; case 'declined': return '不参加'; case 'tentative': return '未定'; default: return '不明'; break } }
おわりに
Calendar、CalendarAppなどについては、Google Apps Scriptからのカレンダーへのアクセス、
Google Calendar APIの利用の許可などが必要ですので、適宜確認し、設定してください。
いかがでしたでしょうか。
忘年会、新年会などの出欠確認に役立てていただければ幸いです。
最後までお読みいただきありがとうございました。