イベントの招待メールを一括送信する Googleカレンダーアプリ②

シリーズ①では、Googleカレンダーに登録する予定が何件あっても、スプレッドシートで予定を管理するだけで、GASがあればワンクリックで全ての予定を登録できてしまうスクリプトを書きました。これで登録の悩みは解決です。
でも、もう一つ面倒なことはありませんか?
そうです。登録した予定を関係者に通知する面倒さです。
例えば、登録する予定が1件、2件だったとしても、その予定を10人の人に連絡しなければならないとなるとどうでしょう?
登録以上に連絡作業の方が大変かもしれません。
10人分のメールアドレスをいちいち入力するのは面倒です。コピペならまだマシだけど、これが20人、30人となったら…
しかし、この悩みもGASなら一発で解決できてしまいます!
シリーズ①のアプリにさらに機能を追加して、複数のメンバーに自動で招待メールを送りましょう!

共通する処理を関数化する

大部分はシリーズ①のコードをそのまま使いますので、まずは①で作ったcreateEventFromSheet関数をコピペします。
そして関数名をcreateEventAndInviteに変更します。

さて、本題のコードに入る前に一つやっておきたいことがあります。
それは共通する処理の関数化です。
オレンジ枠で囲った部分、開始時刻と終了時刻をDateオブジェクトに成形する処理ですが、見て分かる通り、似たような処理を繰り返しています。
こうした共通する処理は、別途関数化して外に出すとコードがシンプルになります。
やってみましょう!

createDateTime関数を作って別途関数化したのが①です。
もともと6行使っていた処理をこの関数内で処理させました。
そしてこの関数に引数を渡して、startDateとendDateオブジェクトを成形したのが②です。
2行でスッキリになりました。

関数を部品化しておくことで、他のスクリプトでの再利用がしやすくなることもメリットです。
関数が機能してちゃんとイベント登録できているか、テストも忘れずに。

スプレッドシートでメールアドレスを管理する

それでは、本題の招待メールを自動送信するための準備をしましょう。
シリーズ①で用意したスプレッドシート「サンプル_イベント_名簿」を開きます。
「名簿」シートを作り、メンバーの名前とメールアドレスをこのシートで管理します。
あとはこのメールアドレスをまとめて取得して、createEventメソッドの引数optionsに設定してあげれば、もう完成です。

メールアドレスを取得してoptionsのguestsにセット

シートから値を取得する方法は基本的に同じですので、43〜46行をコピぺし、シート名、変数名などを適宜変更します。
const mailList = mailData.join(“,")でmailDataを配列から文字列に変換します。
なぜなら、guestsプロパティの型は文字列だからです。
createEventメソッドの引数optionsのguestsプロパティにmailListをセット、sendInvitesプロパティをtrueに設定すれば
完成です。



join( )のMDNリファレンス

テスト実行

では、createEventAndInvite関数をテストしてみましょう。
はじめに、スプレッドシートのカスタムメニューに「カレンダーに登録&招待」を追加しておきます。参照

「イベント」シートに新しいイベントを1つ追加して、カスタムメニューの「カレンダーに登録&招待」をクリックで実行です。

カレンダーを開いてみましょう。
5月1日に新しいイベントが登録されました。
タイトル、開始・終了時刻、場所、説明がシートの通り登録できています。
そして、「名簿」シートの5人分のメールアドレスが1度にまとめて取得され、それぞれがゲストとして招待されました。
イベントの登録とゲストの招待がワンクリックで完了です!
楽ちんですね ファビコン

ゲストのメールアドレスを非表示にする

ただ、一つ気になるのは、デフォルトだと招待されたゲストのメールアドレスがお互いに分かってしまう点です。
クローズドなグループ内で使用する分にはこのままでも問題ないかもしれませんが、できれば非表示の方がやはり安心できますね。
その設定も組み込みのメソッドを使えば簡単にできますので、やっていきましょう。

使うメソッドは setGuestsCanSeeGuests( )
変数 guestsCanSeeGuests をfalseとして引数にセット。
これだけでOKです。

届いた招待メールを開けてみると、ゲストのメールアドレス一覧は非表示になっています。
便宜上、メールアドレスを表示させたい場合は、guestsCanSeeGuests を trueにします。
公式リファレンスはこちら

完成コード

// スプレッドシートからカレンダーに予定を登録し、メンバーを招待する
function createEventAndInvite() {
  const calendar = CalendarApp.getDefaultCalendar();

  // 「イベント」シートからイベントデータを取得する
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('イベント');
  const startRow = 2;
  const numRows = sheet.getLastRow() - 1;
  const values = sheet.getRange(startRow, 1, numRows, 7).getValues();

  // 「名簿」シートからメールアドレスを取得する
  const sheet2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('名簿');
  const numRows2 = sheet2.getLastRow() - 1;
  const mailData = sheet2.getRange(startRow, 2, numRows2, 1).getValues().flat();
  const mailList = mailData.join(",");

  for (let i = 0; i < values.length; i++) {
    const [check, title, day, startTime, endTime, location, description] = values[i];
    if (check == "済") {
      continue; 
    }
    const startDate = createDateTime(day, startTime); // 関数で開始日時を成形
    const endDate = createDateTime(day, endTime); // 関数で終了日時を成形
    const options = {
    location: location,
    description: description,
    guests: mailList, // guestsプロパティにmailListを設定
    sendInvites:true // sendInvitesプロパティをtrueに設定
    };

    const event = calendar.createEvent(title, startDate, endDate, options); // 変数eventに代入
    const guestsCanSeeGuests = false; // 他のゲストの表示を許可しない
    event.setGuestsCanSeeGuests(guestsCanSeeGuests);

    sheet.getRange(startRow + i, 1).setValue("済");
  }
}

シリーズ目次:Googleカレンダーアプリ①〜④

  1. スプレッドシートからGoogleカレンダーに予定を登録する Googleカレンダーアプリ①
  2. イベントの招待メールを一括送信する Googleカレンダーアプリ②
  3. 定期イベントをカレンダーに登録する Googleカレンダーアプリ③
  4. イベントのゲストにリマインドメールを自動送信する Googleカレンダーアプリ④

最後までご覧いただき、ありがとうございます ファビコン

GASGカレンダー

Posted by botw