📧

【GAS】メールを自動送信するスプレッドシートテンプレート

に公開

はじめに(リマインドメールは自動送信がよい)

私はリマインドメールの送信が非常に苦手です。
「会議開催の5営業日前になったらリマインドを送る」みたいなやつです。

以下のような理由で苦手です…

  • 送信日を覚えておくに脳のリソースがとられる
  • メールを1通送る5分のために集中力が途切れるのが嫌い
  • 忘れたときに「5営業日前を過ぎてしまって申し訳ありません」の一文を加えないと(社会人としては)いけないのがメンドウ

リマインドメールが重要なのも理解していますが、苦手なものは苦手。

そこでスプレッドシートに情報を記入しておいて、GAS(GoogleAppsScript)で自動送信することを覚えました。

テンプレート化して公開しますので、同じように”リマインドメールを送るのが苦手な人”のためになれば幸いです。

プログラマーじゃなくても大丈夫

私は理系ですが、学生時代の専攻は生物です。

プログラムのプの字もわからない状態から「メールを自動化し(てラクし)たい!!」という想いだけでGASを勉強しました。

この記事の対象者

  • GAS初心者
  • GASで業務効率を改善したい人
  • リマインドメールが嫌いな人!!

プログラミングがわからない人でも、スプレッドシートの作り方を真似して、コードをコピペすれば、イチから書くよりもかなり楽に使えるように工夫しています(過去に自分が困ったから!!)。

準備


会議の情報をいれたスプレッドシートを用意します。

閲覧リンク(コピーすればGASコードも使えます):https://docs.google.com/spreadsheets/d/1numDV0pJjF0aFv3cH6TVN4F_387PUHxYMDx36oOLsxI/edit?usp=sharing

1列目:GAS内で使う変数名
2列目:日本語のヘッダー

使用するときにあなたの会社のメールに合わせて調整してください。

E列(参加可否回答〆切)と
I列(送信予約日)にはWORKDAY.INTL関数を使用しています。

WORKDAY.INTL関数は”○営業日前”を計算してくれるスプレッドシート関数です。

例えばE3セルには下記のように入力されています。
=WORKDAY.INTL(B3,-2,1,'祝日'!$A2:A)

カッコ内の引数は以下のような意味です。

  • B3:B3セルを参照する
  • -2:2営業日前
  • 1:土日休み(ほかの数字にすると休みをずらせる)
  • '祝日'!$A2:A:祝日シートの日付も休みとする(日本の祝日、会社の祝日をいれられる)

コード紹介


ツールバーの拡張機能から、AppsScriptを選択して、下記のコードをコピペしてください。

const DAY_OF_WEEK = ['日', '月', '火', '水', '木', '金', '土'];

const TO = [
  'aaa@example.co.jp',
  'bbb@example.co.jp',
  'ccc@example.co.jp',
];

const CC = [
  'ddd@example.co.jp',
];

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

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

  //シートの内容を取得
  const items = getItems(sheet).slice(1);
  // console.log('items', items);

  //今日の00:00を取得
  const now = new Date();
  const y = now.getFullYear();
  const m = now.getMonth();
  const d = now.getDate();
  const today = new Date(y, m, d, 0, 0, 0, 0);

  //今日と一致する送信予約日を検索
  const sendItem = items.find(item => {
    item.send_date.setHours(0, 0, 0, 0);
    return item.send_date.getTime() === today.getTime();
  });
  // console.log('sendItem', sendItem);

  //今日と一致する送信予約日がなければ終了
  if (!sendItem) return

  //日付と時間を日本語表記にフォーマット
  sendItem.mtg_date = writeJPNDate(sendItem.mtg_date);
  sendItem.mtg_deadline = writeJPNDate(sendItem.mtg_deadline);
  sendItem.mtg_start = writeJPNTime(sendItem.mtg_start);
  sendItem.mtg_end = writeJPNTime(sendItem.mtg_end);

  //メールタイトル
  const title = `${sendItem.mtg_date}開催】${sendItem.mtg_name}に関して`;

  //メール本文
  const body = `
    関係者各位<br><br>

    お疲れ様です。<br>
    ${sendItem.mtg_name}の開催が近づいてまいりました。<br><br>

    会議名:${sendItem.mtg_name}<br>
    開催日程:${sendItem.mtg_date} ${sendItem.mtg_start}${sendItem.mtg_end}<br>
    場所:${sendItem.mtg_room}<br>
    内容:${sendItem.mtg_content}<br><br>

    お忙しいところ恐縮ですが、${sendItem.mtg_deadline} 15:00までに<br>
    参加の可否をご連絡いただけると幸いです。<br><br>

    よろしくお願いします。<br>
  `;

  const options = {
    cc: CC.join(','),//ccを設定
    htmlBody: body//本文をhtml形式に設定
  };

  GmailApp.createDraft(TO.join(','), title, body, options);//下書き作成
  // GmailApp.sendEmail(TO.join(','), title, body, options);//メール送信
}

//日付を日本語表記にするFunction
function writeJPNDate(date) {
  const jpnDate = Utilities.formatDate(date, 'JST', 'yyyy年M月d日');

  return `${jpnDate}${DAY_OF_WEEK[date.getDay()]}`;
}

//時間を日本語表記にするFunction
function writeJPNTime(time) {
  return Utilities.formatDate(time, 'JST', 'HH:mm');
}

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

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

  return items;
}

TOとCCには送信したいメールアドレスを入れてください。

宛先を増やしたり減らしたりするときは、メールアドレスをシングルクォーテーション(')で囲むことと、改行前にカンマ(,)をいれるのがルールなので気を付けてください。

本文の中身を変えたり、スプレッドシートから入れる情報を追加したいときは、コード全体をChatGPTに入れて、修正方法を聞いたら教えてくれます。

実行ボタンを押して、権限を承認して、メールの下書きができればOKです(送信予約日と実行日が一致しているとき)。

※誤爆を防ぐため、メールの下書きがされるコードをONにしています。実際に動かしだすときはメール送信のコードをONにして使ってくださいね。

トリガーセット


最後にトリガー(GASを勝手に作動させるボタン)をセットします。

画面右下の”トリガーを追加”から下記の設定にしてください。

  • 実行する関数を選択:sendMail_main
  • 実行するデプロイを選択:Head
  • イベントソースを選択:時間主導型
  • 時間ベースのトリガータイプを選択:日付ベースのタイマー
  • 時刻を選択:(あなたがメールを送りたい時間帯)
  • エラー通知設定:今すぐ通知を受ける

設定すると下記のように表示されます。

お疲れさまでした。
あとはメールが届くのを待つばかり。

おわりに

リマインドメールの送信ストレスから解放されると、本当に気持ちいいからです。

あなたのメール送信が自動化されることを心から応援しております。

Discussion