【GAS】Googleカレンダーから非開催の会議を自動削除する

スキルアップ

はじめに

朝会や進捗会など議題の有無とは関係なく、定例でスケジュール登録されている会議はありませんか?

たしかに、議題を収集してからスケジュールを登録すると開始直前の調整になるため、このような運用にも一理あります。
しかし、議題がないのに参加者が時間通りに集まってしまうと時間のムダですよね。
※開始早々、「本日は議題がありません!解散!!」は残念ですよね。

この問題を改善するために、Google Apps Script(GAS)を利用して議題がない会議のスケジュールを自動削除する方法を考えました。

この記事を読んで分かること
・GASを利用して、Googleカレンダーに登録されたイベントを取得する方法
・取得したイベントからタイトルに「キーワード」を含む物を選別する方法
・選別したイベントを自動削除する方法

詳細情報やこの記事で紹介しきれなかった情報は、Googleが提供するGASの公式ドキュメントをご参照ください。

プログラム仕様と運用ルール

今回 作成するプログラムのポイントは2つあります。
(1) Googleカレンダーの予定を取得/削除する
(2) 会議に議題があるかを判断する

この内、(2)はプログラムが判断するための情報を用意する必要があります。
そこで、Googleカレンダーのスケジュール作成時に説明欄へ次の文言を設定することにしました。
文言<<協議事項がある場合は、本メッセージを削除して記入してください>>

議題がある人は、この文言を削除して議題を入力するルールとします。
議題をGoogleカレンダー上で共有しつつ、プログラムが判断するための情報も設定できます。

以下の記事で、Googleカレンダーの説明欄をGmailで通知する方法を紹介しています。
自動削除と合わせて、議題の通知を行いたい場合はこちらを参考にプログラムを作成してください。

GASでGoogleカレンダー取得プログラムを作成

Google Apps Script(GAS)を作成するために、Googleドライブを表示します。
そして、右上の[+ 新規]ボタンをクリックします。

新規作成するファイルの種類が表示されるので、[Google Apps Script]を選択します。

Google Apps Script(GAS)のコード作成画面が表示されるので、ここにソースコードを記入します。

Google Apps ScriptのコードはJavaScriptをベースにした記載ルールとなります。
今回のソースコードは以下の通りとなります。

//イベントタイトルにtargetWord、説明にcancelWordをstartInMinutes以内に開始するイベントを削除する
function getEventsByKeyword() {
  //イベント検索のための条件を設定
  var targetWord = '【定例会】';
  var cancelWord = '<<協議事項がある場合は、本メッセージを削除して記入してください>>';
  var startInMinutes = 60;

  //検索対象の日付を設定
  var nowDate = new Date();

  //検索対象のカレンダーIDを設定
  var calenderIds = {
    'トビネズミ':'~~~~~~~~~~@gmail.com'
    };

  //連想配列のデータを全て繰り返してイベントを検索
  Object.keys(calenderIds).forEach(function(key){
    //カレンダーIDと日付からイベント取得
    var myCalendar = CalendarApp.getOwnedCalendarById(calenderIds[key]);
    var myEvents = myCalendar.getEventsForDay(nowDate);

    //取得したイベントが削除対象かを判定
    myEvents.some(function(myEvent){
      var title = myEvent.getTitle();
      var description = myEvent.getDescription();

      //開始時間が何分後かを計算
      var startDate = myEvent.getStartTime();
      var diffMinutes = Math.floor((startDate - nowDate)/1000/60);

      //タイトルと説明にキーワードを含むかを判定
      if(title.indexOf(targetWord)!=-1 && description.indexOf(cancelWord)!=-1){
        //開始時間が指定時間以内かを判定
        if(0 <= diffMinutes && diffMinutes <= startInMinutes){
          //イベントを削除
          myEvent.deleteEvent();
        };
      };
    });
  });

}

ソースコードを作成したら画面上部にある[実行]ボタンをクリックし、プログラムを実行します。
そして、実行ログを確認し、正常終了を示すメッセージが表示されていればOKです。

Googleカレンダーを確認すると、イベントが削除できています。

トリガーによる定期実行の設定

作成したプログラムを自動実行させるために、トリガーを設定します。
※トリガーの詳細説明は以下の記事をご参照ください。

左メニューより[トリガー]をクリックします。

トリガー管理画面が表示されるので、右下の[トリガーを作成]ボタンをクリックします。

トリガーの設定画面が表示されるので、今回は[30分おき]に実行するように設定し、[保存]ボタンをクリックします。
※[1時間おき]だと開始直線(8:59)に実行される可能性があるため

トリガー管理画面に作成したトリガーが表示されればOKです。

作成プログラムのポイント

Googleカレンダーからイベントを取得

検索対象のカレンダーID/日付を指定して、Googleカレンダーからイベントを取得します。

//検索対象の日付を設定
var startDate = new Date();

//検索対象のカレンダーIDを設定
calenderId = 'xxxxxxxxx@gmail.com'

//Googleカレンダーからイベントを取得
var myCalendar = CalendarApp.getOwnedCalendarById(calenderId);
var myEvents = myCalendar.getEventsForDay(startDate);

イベントはオブジェクトの配列で取得されるため、各種メソッドを作用させてイベントの設定値を取得します。

myEvents.some(function(myEvent){
  //イベントのタイトルを取得
  var title = myEvent.getTitle();

  //イベントの開始の日時を取得
  var startDate = myEvent.getStartTime();

  //イベントの説明を取得
  var description = myEvent.getDescription();
});

削除条件に合致するイベントかを判定

文字列にキーワードを含むかを判定するために「indexOf([キーワード])」を利用します。
indexOf」は、キーワードが文字列に含まれていれば「インデックス番号」を、含まれていなければ「-1」を返します。

そして、開始時間が1時間(60分)以内かを判定するためには、現在時刻との差分を計算します
※計算結果はミリ秒で返されるます。

//イベント検索のための条件を設定
var targetWord = '【定例会】';
var cancelWord = '<<協議事項がある場合は、本メッセージを削除して記入してください>>';
var startInMinutes = 60;

//現在時間と開始時間の差分を計算(ミリ秒→分に変換)
var diffMinutes = Math.floor((startDate - nowDate)/1000/60);

//タイトルと説明にキーワードを含むかを判定
if(title.indexOf(targetWord)!=-1 && description.indexOf(cancelWord)!=-1){
  //開始時間が指定時間以内かを判定
  if(0 <= diffMinutes && diffMinutes <= startInMinutes){
    ~~~~~~~~~~~~~~~~~~
  };
};

イベントを削除

Gmailを送信するために「GmailApp.sendEmail([宛先], [件名], [本文])」を利用します。

myEvents.some(function(myEvent){
  //イベントを削除
  myEvent.deleteEvent();
});

最後に

今回のプログラムは、Google Apps Script(GAS)の力だけでなく、運用ルールの力も借りて実現しました。
プログラムは万能ではないので、「人間が行う作業」と「プログラムが行う作業」を適切に整理することが大切です。

このような自動化ツールによって人間が定例作業から解放されれば、本当に必要な仕事に専念できるようになります
是非、本記事を業務効率化の参考にしてください。

コメント

タイトルとURLをコピーしました