【GAS】Googleカレンダーを取得してGmailで送信する

スキルアップ

はじめに

Google Workspaceを導入している会社では、スケジュールをGoogleカレンダーで管理/登録しているケースが多いと思います。

目的を持って個別に登録されたスケジュールならばタイトルを見れば会議内容は容易にイメージできるでしょう。
しかし、週次/月次で開催される定例会だと「今日は何を話すのだろう?」と思うことはないでしょうか?

その改善策として、カレンダーの説明欄を利用してアジェンダを共有することができます

しかし、欲を言えばこの内容を自動通知してくれると嬉しいですよね。
今回は、Google Apps Script(GAS)で実現する方法を紹介します。

この記事を読んで分かること
・GASを利用して、Googleカレンダーに登録されたイベントを取得する方法
・取得したイベントからタイトルに「キーワード」を含む物を選別する方法
・選別したイベント情報を主催者/参加者へGmailからメールで自動送信する方法

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

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

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

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

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

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

//イベントタイトルにキーワードを含む場合、参加者へ会議内容をGmailで送付
function sendEventsDescriptionByKeyword() {
  //イベント検索のためのキーワードを設定
  var targetWord = '【定例会】';

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

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

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

    //取得したイベントを全て繰り返して処理
    myEvents.some(function(myEvent){
      //イベントのタイトルを取得
      var title = myEvent.getTitle();

      //イベントの開始/終了の日時を取得して、「hh:mm〜hh:mm」形式に変換
      var startDate = myEvent.getStartTime();
      var endDate = myEvent.getEndTime();
      startTime = Utilities.formatDate(startDate, 'Asia/Tokyo', 'HH:mm');
      endTime = Utilities.formatDate(endDate, 'Asia/Tokyo', 'HH:mm');
      time = '${startTime}〜${endTime}'.replace('${startTime}', startTime).replace('${endTime}', endTime);

      //イベントの主催者/参加者を取得
      var guests = myEvent.getGuestList(true);

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

      //取得したイベントのタイトルにキーワードを含むかを判定
      if(title.indexOf(targetWord)!=-1){
        //メールの件名を作成
        var subject = '<GAS通知>${time}:${title}'.replace('${time}', time).replace('${title}', title);

        //メールの宛先を作成
        var sendTo =''
        guests.forEach(function(guest){
          emailAddress = guest.getEmail()
          sendTo += emailAddress + ',';
        });

        //メールの本文を作成
        var body = '';
        body += '本日のミーティングの内容は次の通りです。\n';
        body += '\n';
        body += description.replace(/<br>/g, '\n').replace(/<("[^"]*"|'[^']*'|[^'">])*>/g,'');

        //Gmail送信関数を呼び出す
        sendGmail(subject, sendTo ,body);
      };
    });
  });
}

//Gmailを送信
function sendGmail(subject, sendTo ,body) {
  GmailApp.sendEmail(sendTo, subject, body);
}

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

実行結果の確認

Gmailを確認すると、Googleカレンダーに登録されたイベント内容がメールで通知できていました。

宛先(To)も確認すると、Googleカレンダーに設定した参加者が設定されています。
※画像はメールアドレスをマスキングしているため分かりにくいですが、正しく設定されています。

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

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();

  //イベントの開始/終了の日時を取得して、「hh:mm〜hh:mm」形式に変換
  var startDate = myEvent.getStartTime();

  //イベントの主催者/参加者を取得   ※主催者を除外したい場合は[true]を削除
  var guests = myEvent.getGuestList(true);

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

キーワードを含むイベントタイトルの判定

文字列にキーワードを含むかを判定するために「indexOf([キーワード])」を利用します。

indexOf」は、キーワードが文字列に含まれていれば「インデックス番号」を、含まれていなければ「-1」を返します。

//イベント検索のためのキーワードを設定
var targetWord = '【定例会】';

//取得したイベントのタイトルにキーワードを含むかを判定
if(title.indexOf(targetWord)!=-1){
  ~~~~~~~~~~~~~~~~~
};

文字列の編集(変数の利用/HTMLタグの除去)

変数を用いて文字列を組み立てるために「replace([置換前], [置換後])」を利用します。

<GAS通知>${time}:${title}」という文字列を設定し、その後に「replace」を記述することで文字列への置換処理を行います。
replace」は複数記述することもでき、その場合は左から順に処理されます。
${xxxxx}は、誤置換を防ぎ、可読性を向上させるためであり、自由に設定できます。
 例えば、日本語(タイトル)や記号(★)でもOKです。

//文字列を変数で置換
subject = '<GAS通知>${time}:${title}'.replace('${time}', time).replace('${title}', title);

「Googleカレンダーの説明」はHTML表記で取得されるので、正規表現を利用した置換処理でHTMLタグを除去します。
はじめに<br>タグを改行コード(\n)に置換し、その後に他のHTMLタグを[空白]に置換します。

//正規表現でHTMLタグを除去
body += description.replace(/<br>/g, '\n').replace(/<("[^"]*"|'[^']*'|[^'">])*>/g,'');

Gmailを送信

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

//Gmailを送信
function sendGmail(subject, sendTo ,body) {
  GmailApp.sendEmail(sendTo, subject, body);
}

最後に

今回のツールを応用すれば、会議のアジェンダを取り纏めて事前通知する作業を、各自がGoogleカレンダーに記入すればGASに自動通知させることができます。

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

コメント

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