GASでGmailを使ったメールマージ機能を作る

はじめに:GASでGmailメールマージを作る意義
どうも、GASおじです。中小企業の経営者やフリーランスの皆さん、メールマーケティングやお知らせの一斉配信、まだ手作業でやってませんか?Google Apps Script(以下GAS)を使えば、Gmailとスプレッドシートを連携して、効率的なメールマージ機能を自作できますよ。しかも追加の専用SaaS料金は不要。Googleアカウントの利用枠内で使えて、Apps Scriptのquota・実行上限内で動きます。
今回は、既存データを削除せずに安全に動くメールマージの作り方を、GASおじ流に丁寧に解説します。入力検証、バッチ書き込み、バックアップ・ロールバック対応も完備。実践に役立つサンプルコードも紹介するので、ぜひ参考にしてください。
メールマージ機能の概要と初期設定
何をするのか?
スプレッドシートに宛先やメール内容の元データを用意し、そこからGmailで個別メールを送信する仕組みです。送信履歴やエラー情報は新規作成する日時付きシートに書き込み、元データは触りません。これで誤って元データを消すリスクも回避できます。
初期設定と必要権限
- スプレッドシートの閲覧・編集権限
- Gmailの送信権限(Gmailサービスの利用承認)
- スクリプトエディタでGASプロジェクトを作成し、スプレッドシートと連携
- インストール型トリガー(installable trigger)で定期実行も可能(手動でもOK)
個人情報の取扱い
メールアドレスや氏名などの個人情報はスプレッドシート内に保存します。GASのスクリプトとGoogleのクラウド環境で処理されますが、第三者に公開しないように注意してください。データのバックアップは必ず定期的に取得しましょう。
具体的なGASコード例と運用ポイント
以下は、メールマージの基本を押さえつつ、エラーチェック・バッチ処理・結果書き込みを実装したサンプルコードです。コメントを読みながら自分の環境に合わせてカスタマイズしてください。
function sendMailMerge() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName('メールマージ元');
if (!sheet) {
Logger.log('「メールマージ元」シートがありません。');
return;
}
// 元データ取得(ヘッダー含む)
const dataRange = sheet.getDataRange();
const values = dataRange.getValues();
// バックアップ用に日時付き新規シート作成
const backupSheetName = 'バックアップ_' + Utilities.formatDate(new Date(), Session.getScriptTimeZone(), 'yyyyMMdd_HHmmss');
const backupSheet = ss.insertSheet(backupSheetName);
backupSheet.getRange(1, 1, values.length, values[0].length).setValues(values);
// 結果記録用の日時付きシートを新規作成
const resultSheetName = '送信結果_' + Utilities.formatDate(new Date(), Session.getScriptTimeZone(), 'yyyyMMdd_HHmmss');
const resultSheet = ss.insertSheet(resultSheetName);
resultSheet.appendRow(['メールアドレス', '名前', '送信結果', '日時']);
// 入力検証
const header = values[0];
const emailCol = header.indexOf('メールアドレス');
const nameCol = header.indexOf('名前');
const bodyCol = header.indexOf('本文');
if (emailCol < 0 || nameCol < 0 || bodyCol < 0) {
Logger.log('必要なヘッダー(メールアドレス、名前、本文)が揃っていません。');
return;
}
// メール送信バッチ処理
const batchResults = [];
for (let i = 1; i < values.length; i++) {
const row = values[i];
const email = row[emailCol];
const name = row[nameCol];
const bodyTemplate = row[bodyCol];
// 簡単なメールアドレス形式チェック
if (!email || !email.match(/^[^\s@]+@[^\s@]+\.[^\s@]+$/)) {
batchResults.push([email, name, '無効なメールアドレス', new Date()]);
continue;
}
// 本文に名前を差し込む例
const body = bodyTemplate.replace(/\{\{名前\}\}/g, name);
try {
GmailApp.sendEmail(email, '【GASメールマージ】お知らせ', body);
batchResults.push([email, name, '送信成功', new Date()]);
} catch (e) {
batchResults.push([email, name, '送信失敗: ' + e.message, new Date()]);
}
}
// 送信結果をまとめて書き込み
const resultRange = resultSheet.getRange(2, 1, batchResults.length, batchResults[0].length);
resultRange.setValues(batchResults);
Logger.log('メール送信処理が完了しました。結果シート: ' + resultSheetName);
}
ポイント解説
- 元データシートは触らず、新規シートにバックアップと結果を書きます。
- メールアドレスの簡易チェックを入れて無効なデータは送信しません。
GmailApp.sendEmailで送信。失敗したらエラーメッセージを記録。- 処理結果はまとめて一括書き込み(バッチ処理)でAPI呼び出し回数を抑制。
- 本文中の
{{名前}}を実際の名前に差し込むテンプレート処理も実装。 - 送信日時も記録し、後からログとして活用可能。
トリガー設定と復元手順
installable triggerの設定
管理画面の「編集」→「現在のプロジェクトのトリガー」から新規トリガーを追加し、sendMailMerge関数を定期実行に設定可能です(例えば毎日午前9時など)。これで自動化できます。
復元手順
- バックアップ用の日時付きシートに元データが丸ごと残るので、万が一元データが壊れた場合は該当シートをコピーして復元してください。
- 送信結果シートは送信状況の確認用に活用し、必要ならログとして保存します。
- スクリプトの誤動作やGoogle側の制限により処理が途中で止まった場合は、バックアップシートのデータを使って再度実行すればロールバック対応となります。
コスト削減の試算例
例えば外部SaaSのメール配信サービスを毎月5万円支払っていたとします。GASおじの自作メールマージであれば、
- 追加の専用SaaS料金:0円(Googleアカウントの利用枠内)
- GASのquota:1日あたり約100〜150通まで送信可能(G Suiteアカウントなら上限アップ)
- 導入・運用コスト:スクリプト作成工数のみ
仮に月1000通送信していた場合、
5万円 ÷ 1000通 = 50円/通
が削減できると仮定可能。ただし、Gmail送信制限やGAS実行時間制限を超えない運用設計が必須です。保証や架空の実績は示しませんが、SaaS課金を抑えるひとつの選択肢として十分検討に値します。
以上、GASおじのメールマージ機能の作り方でした。手間を減らしつつ安全に運用できるポイントを押さえて、ぜひ自社のマーケティングに活用してください。