こんにちは。 キャスレーコンサルティングのSI(システム・インテグレーション)部の金巻と申します。

皆さん、Google Apps Script使ってますか?

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

と過去に取り扱っていますが、今回はGoogle Apps Script(以下GAS)を使って
Googleカレンダーの一括登録術をご紹介します。

<紹介する内容>

・GASでカレンダーを登録するには
・会議室の設定について
・会議室を招待するには
・会議室の空き状況を確認する
・スプレッドシートから情報を読み込む

背景

キャスレーコンサルティングでは、G Suiteを利用しております。
カレンダーにて各種イベントを管理しておりますが、
会議室の空き情報を調べながら、複数のイベントを登録するのはなかなか大変です。

そこで今回は、複数のイベントをうまく会議室を確保しながら、カレンダー登録する方法をGASで実現しました。

GASとは(復習)

次に、本題のGASについてですが、メール・ドライブ・スプレッドシート・ドキュメント・カレンダー・マップなど、
様々なGoogle Appsのアプリケーションに、独自の機能を追加するためのスクリプト言語です。

言語仕様は、JavaScriptをベースにしており、JavaScript + Google APIというイメージです。
各APIについては、GAS公式に網羅されています。

GASでカレンダーを登録するには

カレンダー(イベント)を登録するには、以下の関数を使います。

変数 = Calendar.createEvent( タイトル, 開始日時, 終了日時 );
変数 = Calendar.createEvent( タイトル, 開始日時, 終了日時, オプション );

会議室を追加する場合は、オプションを利用するので、下段を利用することになります。
※オプションは、以下の項目からなる連想配列
description――説明
location――場所
guests――ゲスト(カンマで区切られたテキスト)
sendInvites――真偽値(招待メールを送るか否か)

自分自身のカレンダーオブジェクトを取得したい場合は、下記の引数に自分のメールアドレスを入力する事になります。

var calender = CalendarApp.getCalendarById(ID);

下記のようなイベントを登録する場合

file1

GASでは、以下のように書きます。

var calender = CalendarApp.getCalendarById(ID);
calender.createEvent('title', new Date('2018/01/28 11:00:00'), new Date('2018/01/28 12:00:00'), {description:'テスト'});

会議室の設定について

会議室をカレンダーから使う場合は、以下のように会議室名が表示されているかと思います。

file2

GASでも名称から使う方法もありますが、今回はカレンダーIDと揃えてIDによる使用方法を採用します。

会議室のIDを調べるにはカレンダー上部の設定ボタンを押し、会議室を選択します。
そうするとカレンダーの設定が表示され、下の方にIDが表示されています。
これが会議室のIDとなりますので、控えておいてあとで使いましょう。

file3

file4

file5
file6

会議室を招待するには

イベント登録時に会議室を招待するには、オプションを使います。
guestsにて、会議室のIDを指定すれば良いだけです。

Calendar.createEvent( タイトル, 開始日時, 終了日時, {description:テスト,guests:会議室のID});

会議室の空き状況を確認する

会議室が空いているかどうかは、会議室のカレンダーにてイベントがあるかどうかで判断するのが良いと思います。

イベント情報を取得するには、getEventsを使用します。
指定の開始日時から終了日時に含まれる、全てのイベントを配列で返します。

 var events = Calendar.getEvents(開始日時, 終了日時);

イベントがない場合は、イベント配列のlengthが0となりますので、
会議室ID・開始日時・終了日時を引数とする、以下のような空室チェック関数を作ることができると思います。

function checkOpenRoom(roomID,startDate, endDate) {
  var roomCalender = CalendarApp.getCalendarById(roomID);
  var events = roomCalender.getEvents(startDate, endDate);
  return events.length == 0;
}

スプレッドシートから情報を読み込む

最後に、一括登録のためのスプレッドシートを作成し、情報を読み込ませる方法です。
現在のスプレッドシートのオブジェクトを、GASで取得するには以下を使用します。

 var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();

現在のシートを取得するには、以下を使用します。

  var sheet = spreadsheet.getActiveSheet();

値を取得するには、getValueを使用します

  sheet.getRange(row,col).getValue()

以上となります。意外と簡単ですね。

まとめ

最後に、これらを組み合わせて複数の会議室を、
優先順位順に自動で確保するプログラムとスプレッドシートを作成すると、以下のようになります。

・スプレッドシート

file7

・実行後のカレンダー

file8

・実行後のスプレッドシート

file9

・実行したプログラム

function run(){
  var roomIDs = [
                 "会議室DのID",
                 "会議室CのID",
                 "会議室AのID",
                 "会議室BのID"
                ];// 優先度に合わせて会議室はD,C,A,Bの順

  //1. 現在のスプレッドシートを取得
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  //2. 現在のシートを取得
  var sheet = spreadsheet.getActiveSheet();

  //データが入っている行
  var row = 2;

  while(sheet.getRange(row,1).getValue() != '')
  {
    var startDate = new Date(sheet.getRange(row,1).getValue());//開始時間
    var endDate = new Date(sheet.getRange(row,2).getValue());//終了時間
    for(var i = 0; i < roomIDs.length; i++)
    {
      if (checkOpenRoom(roomIDs[i],startDate,endDate))
      {
        //会議室が空いていれば
        var title = sheet.getRange(row,3).getValue();//タイトル
        var discription = sheet.getRange(row,4).getValue();//説明
        //カレンダーに予定を登録する。
        addEventToMyCalender(roomIDs[i],startDate,endDate,title,discription);
        sheet.getRange(row,5).setValue(getMtgRoomName(roomIDs[i]));//会議室名を記載する
        i = roomIDs;
      }
    }
    row = row + 1;
  }
}

//自分自身のカレンダーに予定を登録する。
function addEventToMyCalender(roomID,startDate,endDate,title,discription){
  var myCalender = CalendarApp.getCalendarById( 自分のID );
  myCalender.createEvent(title, startDate, endDate, {description:discription,guests:roomID});
}

//会議室が空いているかをチェックする
function checkOpenRoom(roomID,startDate, endDate) {
  var roomCalender = CalendarApp.getCalendarById(roomID);
  var events = roomCalender.getEvents(startDate, endDate);
  return events.length == 0;//イベントがなければ会議室が空いている:Trueを返す。
}

//会議室名を取得する
function getMtgRoomName(id){
  //idでカレンダーを取得
  var meetingRoom = CalendarApp.getCalendarById(id)
  //カレンダー名を取得
  return meetingRoom.getName();
}

今回は、GASを使ったスプレッドシートでイベントを一括登録する方法をご紹介いたしました。
登録までせずに空きチェックのみを行うなど、幅広い使い方が出来るかと思います。

ご一読頂き有難うございました。