こんにちは。
キャスレーコンサルティングの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の利用の許可などが必要ですので、適宜確認し、設定してください。

いかがでしたでしょうか。
忘年会、新年会などの出欠確認に役立てていただければ幸いです。

最後までお読みいただきありがとうございました。