Gmailの送信予約をGASで実装する方法

GASGmail自動化
Gmailの送信予約をGASで実装する方法のサムネイル

Gmailの送信予約をGASで実装する方法

GASおじです。今回は中小企業の経営者やフリーランスの皆さん向けに、Google Apps Script(以下GAS)を使ってGmailの送信予約を実装する方法を解説します。外部の有料SaaSに頼らず、Googleアカウントの利用枠内で追加コストなしにできるのがポイント。もちろん、実行上限やquotaはあるので注意が必要ですが、うまく運用すれば十分実用的ですよ。


Gmail送信予約をGASでやるメリットと注意点

Gmailには標準で送信予約機能がありますが、GASで実装すれば以下のような利点があります。

  • 独自のスケジュールや条件に合わせて柔軟に送信できる
  • 顧客リストやテンプレートをGoogleスプレッドシートで管理できる
  • 既存の業務フローに組み込みやすい

ただし、GASの無料枠(Googleアカウントの利用枠内)で動かすため、実行時間や1日の送信数に制限があります。過剰な大量送信には向かないのでご注意を。


初期設定と必要な権限

  1. Googleスプレッドシートを用意し、送信予約したいメール内容や送信日時を管理します。
  2. スクリプトエディタでGASプロジェクトを作成。
  3. Gmailの送信権限を付与するため、初回実行時に認証を求められます。
  4. 送信予約を定期的にチェックするために、installable trigger(時間主導型トリガー)を設定します。

個人情報の取り扱いは慎重に。顧客メールアドレスや本文などの情報はアクセス権を限定し、不要な権限は付与しないようにしましょう。


具体的なコード例:メール送信予約と結果のバックアップ

以下は、スプレッドシートの「予約」シートに予約データを入れ、「実行」シートに送信済みの結果を日時付きで追記する例です。既存データは上書きせず、新しいシートや行に書き込む形を守っています。

function sendScheduledEmails() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const reserveSheet = ss.getSheetByName('予約');
  if (!reserveSheet) {
    Logger.log('「予約」シートが見つかりません');
    return;
  }
  const resultSheetName = '実行_' + Utilities.formatDate(new Date(), Session.getScriptTimeZone(), 'yyyyMMdd_HHmmss');
  const resultSheet = ss.insertSheet(resultSheetName);

  // 予約シートのデータ取得(A列:メールアドレス, B列:件名, C列:本文, D列:送信日時(yyyy/MM/dd HH:mm))
  const data = reserveSheet.getRange(2, 1, reserveSheet.getLastRow() - 1, 4).getValues();

  // 現在時刻を取得
  const now = new Date();

  // バッチ書き込み用配列
  let results = [];
  results.push(['メールアドレス', '件名', '送信日時', '送信結果', 'エラーメッセージ']);

  data.forEach(row => {
    const [email, subject, body, sendDateStr] = row;

    // 入力検証
    if (!email || !subject || !body || !sendDateStr) {
      results.push([email, subject, sendDateStr, 'スキップ', '入力不備']);
      return;
    }

    const sendDate = new Date(sendDateStr);
    if (isNaN(sendDate.getTime())) {
      results.push([email, subject, sendDateStr, 'スキップ', '送信日時形式不正']);
      return;
    }

    if (sendDate <= now) {
      try {
        GmailApp.sendEmail(email, subject, body);
        results.push([email, subject, sendDateStr, '成功', '']);
      } catch (e) {
        results.push([email, subject, sendDateStr, '失敗', e.message]);
      }
    } else {
      results.push([email, subject, sendDateStr, '保留', '送信日時未到来']);
    }
  });

  // バッチ書き込み
  resultSheet.getRange(1, 1, results.length, results[0].length).setValues(results);
}

installable triggerの設定と復元手順

このsendScheduledEmails関数を30分〜1時間ごとに定期実行させるのがオススメです。スクリプトエディタのトリガーメニューから「時間主導型トリガー」を追加してください。

万が一トリガーが削除・停止した場合は、再度同じ手順でトリガーを作成すれば復元できます。トリガーの状態はGASの「トリガー」画面で確認可能です。


導入によるコスト削減の仮定例

仮に外部の送信予約SaaSを月額5,000円で利用していた場合、GASで代替できれば年間60,000円のコスト削減となります。

計算式例:

年間コスト削減 = 月額SaaS料金 × 12ヶ月
               = 5,000円 × 12
               = 60,000円

ただし、GASはGoogleアカウントの利用枠内での無料利用ですが、quotaや実行時間上限があるため、大量送信には向きません。あくまで適正な範囲で使うのが大事です。


まとめ

  • GASでGmail送信予約を自作すれば追加専用SaaS料金なし(Googleアカウントの利用枠内で)
  • 既存データは全消去せず、新規シートや行に結果を書き込む形で安全運用
  • 入力検証やエラーハンドリングを入れて堅牢に
  • installable triggerで定期実行を設定し、復元も簡単
  • 利用枠の制限を理解して無理のない範囲で活用しよう

GASおじラボでは、今回のような自動化ツールの作り方を500以上のツールで解説中。興味ある方はぜひメンバーシップもチェックしてみてください。

GASおじラボで500ツール使い放題 →