こんにちは。 キャスレーコンサルティングのSI(システム・インテグレーション)部のS.Kと申します。
皆さん、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);
下記のようなイベントを登録する場合
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:'テスト'});
会議室の設定について
会議室を招待するには
イベント登録時に会議室を招待するには、オプションを使います。
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()
以上となります。意外と簡単ですね。
まとめ
最後に、これらを組み合わせて複数の会議室を、
優先順位順に自動で確保するプログラムとスプレッドシートを作成すると、以下のようになります。
・スプレッドシート

・実行後のカレンダー

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

・実行したプログラム
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を使ったスプレッドシートでイベントを一括登録する方法をご紹介いたしました。
登録までせずに空きチェックのみを行うなど、幅広い使い方が出来るかと思います。
ご一読頂き有難うございました。