【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,'祝日'!$A
カッコ内の引数は以下のような意味です。
- B3:B3セルを参照する
- -2:2営業日前
- 1:土日休み(ほかの数字にすると休みをずらせる)
- '祝日'!$A
A:祝日シートの日付も休みとする(日本の祝日、会社の祝日をいれられる)2:
コード紹介
ツールバーの拡張機能から、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