見出し画像

【GAS】会議のリマインドメール自動送信するコードを紹介【コピペOK!!】

”会議開催○営業日前にリマインドメールを送る”

こんな仕事はありませんか?

特に定期的な会議だと、
毎月のことだから地味に面倒です。

送り忘れたときは「リマインドが遅くなり申し訳ありません」と付け加えなくてはならないのでさらにメンドウ。

そんな悩みを解決するリマインドメールを送るGASを紹介します。

スプレッドシートの作成

まずはスプレッドシートを作成していきます。

シート名を”会議日程”として以下のようなスプレッドシートを作成してください。

  • A列:ID(なくてもOK)

  • B列:開催日

  • C列:開始時間

  • D列:終了時間

  • E列:参加可否〆切

  • F列:会議名

  • G列:会議室

  • H列:議論内容

  • I列:送信予約日

  • J列:メール送信

I列には関数が入っています。
=WORKDAY.INTL(B2,-7,1,'祝日'!B2:B)

↑B2のところは同じ行の一致させてください。

B列の日数の7営業日前を計算する関数です。

-7は”7営業日前”を表しているので、
5営業日前がいい場合は-5となります。


このままだと日本の祝日が考慮されないので、さらに”祝日”のシートを追加しておきます。

以上がスプレッドシートの準備です。

GASコードの紹介

ツールバーの”拡張機能”→”Apps Script”を開いて、以下のGASコードを貼り付けます。

function sendMail() {
  //アクティブなスプレッドシートの取得
  const ss = SpreadsheetApp.getActiveSpreadsheet();

  //シートの指定
  const sheet = ss.getSheetByName('会議日程');

  //シートの内容を取得
  const items = getItems(sheet);

  //当日の日付を取得する。
  const today = new Date();
  today.setHours(0, 0, 0, 0);

  for (i = 0; i < items.length; i++) {

    //todayとメール送信日が一致し、
    //かつ、メール送信列に送信済みと書いていない。
    if (items[i]['送信予約日'].getTime() === today.getTime()
      && items[i]['メール送信'] != '送信済み') {

      items[i]['開催日'] = changeJpDate(items[i]['開催日']);
      items[i]['参加可否〆切'] = changeJpDate(items[i]['参加可否〆切']);
      items[i]['開始時間'] = changeJpTime(items[i]['開始時間']);
      items[i]['終了時間'] = changeJpTime(items[i]['終了時間']);

      //送信先のアドレスを取得する。
      let to = getAddress();

      //メールタイトルを決める。
      let subject = `【${items[i]['開催日']}開催】${items[i]['開催日']}${items[i]['会議名']}に関して`;

      //本文を取得する。
      let body = getBody(items[i]);

      //下書き作成
      //createDraft→sendEmailに変更するとメール送信
      GmailApp.createDraft(to, subject, body);

      //”送信済み”と書き込む。
      let targetCol = sheet.getRange('1:1').createTextFinder('メール送信').matchEntireCell(true).findNext().getColumn();
      sheet.getRange(items[i]['行数'], targetCol).setValue('送信済み');
    }
  }
}

//0000年00月00日(〇)の形に変える。
function changeJpDate(date) {
  const jpnWeekday = ["日", "月", "火", "水", "木", "金", "土"];
  const jpnNotation = Utilities.formatDate(date, 'JST', 'yyyy年M月d日');
  const changedDate = jpnNotation + '(' + jpnWeekday[date.getDay()] + ')';

  return changedDate;
}

//00:00の形に変える。
function changeJpTime(time) {
  const jpnNotation = Utilities.formatDate(time, 'JST', 'HH:mm');

  return jpnNotation;
}

/*
  送信先のメールアドレスを取得する。
  メンテナンスしやすいように独立させている。
  改行するときは,(カンマ)をつけ、最後は不要。
*/
function getAddress(){
  const address = [
    '★★★@example.co.jp',
    '▲▲▲@example.co.jp',
    '●●●@example.co.jp'
  ];

  return address;
}

/*
  本文を取得する。
  メンテナンスしやすいように独立させている。
*/
function getBody(items) {
  const body = `関係者各位

お疲れ様です。
${items['会議名']}の開催が近づいてまいりました。

会議名:${items['会議名']}
開催日程:${items['開催日']} ${items['開始時間']}${items['終了時間']}
場所:${items['会議室']}
内容:${items['議論内容']}

お忙しいところ恐縮ですが、${items['参加可否〆切']}までに
参加の可否をご連絡いただけると幸いです。

よろしくお願いします。
  `

  return body;
}

//スプレッドシートの内容と、
//取得した行数を追加情報として取得する。
function getItems(sheet) {
  const values = sheet.getDataRange().getValues();
  const headers = values.shift();
  const items = [];

  for (const [index, value] of values.entries()) {
    const item = {};
    item['行数'] = index + 2;
    headers.forEach((header, index) => {
      item[header] = value[index];
    });
    items.push(item);
  };

  return items;
}

あとはトリガー設定を設定していきます。

  1. トリガーを追加

  2. 実行する関数を選択:sendMail
    実行するデプロイを選択:Head
    イベントのソースを選択:時間主導型
    時間ベースのトリガーのタイプを選択:日付ベースのタイマー
    時刻を選択:(お好きな時間帯に設定してください。おすすめは10~11時)
    エラー通知設定:今すぐ受け取る(送れなかったときのために)

  3. 保存する

  4. (初回のみ)Googleから許可を求められるので、すべて許可する。

これで送信予定日になったら、配信者に自動的にメールが送られるGASコードの完成です。


トリガーについては、ときどきGoogle側のエラーで動かないことがあるので、1日2回動くようにしておくと、さらに安心です。

私は10~11時と14~15時の2つのトリガーをセットしています。

10~11時で動けば”送信済み”と記入されるので、14~15時に同じメールが届くことはありません。


さぁ、面倒なリマインドメールを送る仕事から解放されて、あなたの自由時間を増やしましょう。

本職に集中するもよし、思い切って休みを取るもよし。

以上、参考になれば幸いです。

この記事が参加している募集

仕事のコツ

with 日本経済新聞

この記事が気に入ったらサポートをしてみませんか?