「【完全ガイド】スプレッドシート×Apps Scriptで一括メール送信を自動化する方法」

Google・業務効率

毎回同じ内容のメールを一人ひとりに送るのは、とても手間がかかりますよね。
GoogleスプレッドシートとGoogle Apps Scriptを使えば、表にまとめたアドレスに対して 一括で自動送信 が可能です。しかも無料で、プログラミング初心者でも扱えるシンプルなコードで実現できます。

本記事では、

  • スプレッドシートからApps Scriptを使う基本のやり方
  • よくあるエラーと代替手段(ID指定で回避する方法)

を分かりやすく解説していきます。

なぜスプレッドシートでメール自動化するのか

  • 無料で使える:Googleアカウントがあれば追加コスト不要
  • Gmailと連携可能:普段のアドレスでそのまま送信
  • 一括送信が可能:数十件以上の送信も一発で処理
  • 重複防止やログ管理もできる:運用がシンプル

基本の実装:現在開いているシートをそのまま使う

最も簡単なのは、今開いているスプレッドシートをそのまま使う方法です。
Apps Scriptのコード内で getActiveSpreadsheet() を呼び出すことで、自動的に現在のシートを対象にできます。

以下のサンプルコードをそのまま貼り付ければ、メール送信の自動化を試せます。

function sendTestEmails() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const startRow = 3;  // データの開始行(見出しが2行ある場合、3行目から)
  const numRows = sheet.getLastRow() - startRow + 1;

  const sentEmails = new Set(); // 送信済みのメールアドレスを記録するセット

  for (let i = 0; i < numRows; i++) {
    const row = startRow + i;
    const raw = sheet.getRange(row, 10).getValue(); // J列(10列目)からメールアドレスを取得
    const email = raw ? raw.toString().trim() : ''; // 前後の空白を除去

    // 有効なメールアドレスで、かつまだ送信していない場合のみ処理
    if (email && email.includes('@') && !sentEmails.has(email)) {
      const subject = '【テスト送信】お問い合わせありがとうございます';
      const body = `〇〇株式会社様\n\nお問い合わせありがとうございます。\n\nこのメールは自動送信です。`;

      try {
        GmailApp.sendEmail(email, subject, body); // メール送信
        const sender = Session.getActiveUser().getEmail(); // スクリプト実行者(送信元アドレス)を取得
        Logger.log(`送信成功: ${email} ← 送信元: ${sender}`); // ログに送信先と送信元を記録
        sentEmails.add(email); // セットに追加して、以降の重複を回避
      } catch (e) {
        Logger.log(`送信失敗: ${email} - ${e.message}`); // エラーが出た場合も記録
      }
    } else {
      Logger.log(`スキップ: ${email}`); // 無効または重複メールはスキップとして記録
    }
  }
}
JavaScript

コードのポイント

  • SpreadsheetApp.getActiveSpreadsheet().getActiveSheet()
    → 現在開いているシートをそのまま取得します。
  • J列(10列目)からメールアドレスを読み込み
    → コードでは getRange(row, 10) を使って列を指定しています。
  • 重複送信防止
    → Set を使って同じアドレスには複数回送らないようにしています。
  • 送信結果をログに記録
    → 成功・失敗・スキップを Logger.log() で残すので、後から確認可能です。

実行手順

  1. スプレッドシートを開き、上メニューから
    拡張機能 → Apps Script をクリック。
  2. 新しいスクリプトエディタが開くので、上記コードを貼り付けて保存。
  3. 「実行」ボタンから sendTestEmails を選び、初回のみ権限を許可。
  4. ログで「送信成功」「スキップ」などの動作結果を確認。

Apps Scriptが開けないときの代替手段

スプレッドシートから「拡張機能 → Apps Script」を開いた際にエラーが出る場合は、script.google.com に直接アクセスして新規プロジェクトを作成し、対象のシートを openById()、タブ(シート名)を getSheetByName() で明示指定します。
UIの不具合やアカウント衝突の影響を受けにくく、安定して実行できる回避策です。手順は「直接アクセス → 新規プロジェクト → コード貼り付け → シートID・タブ名の設定 → 実行・権限付与」の流れで完了します。

スプレッドシートID/シート名の確認方法

  • ID:スプレッドシートURLの
    https://docs.google.com/spreadsheets/d/<ここがID>/edit#gid=…
    <ここがID> をコピー
  • シート名:スプレッドシート下部のタブ名(例:名簿、Contacts

このようなファイル例では C列(3列目) にメールアドレスを入力する想定でスクリプトを組みます。
上の見本データを例にすると、

  • 正しいメール(info@exemple.jp など) → 送信対象
  • 「文字」や空欄 → 自動的にスキップ
  • 重複アドレス(例:同じinfo@exemple.jpが複数行) → 1回だけ送信

となり、無駄な送信やエラーを避けられる設計です。

手順(最短ルート)

  1. ブラウザで https://script.google.com/ を開く
  2. 新しいプロジェクト を作成
  3. 下のコードを貼り付け
  4. スプレッドシートIDシート名(タブ名) を置き換え
  5. 「実行」→ 初回の権限付与 → ログで結果確認

代替用コード(ID+シート名を明示指定)

function sendTestEmails() {
  const spreadsheetId = "シートID";
  const sheetName = "シート名";

  const sheet = SpreadsheetApp.openById(spreadsheetId).getSheetByName(sheetName);
  const startRow = 3;  // データの開始行(見出しが2行までなので、3行目から)
  const numRows = sheet.getLastRow() - startRow + 1;

  const sentEmails = new Set(); // 送信済みのメールアドレスを記録するセット

  for (let i = 0; i < numRows; i++) {
    const row = startRow + i;
    const raw = sheet.getRange(row, 10).getValue(); // J列(10列目)からメールアドレスを取得
    const email = raw ? raw.toString().trim() : ''; // 前後の空白を除去

    // 有効なメールアドレスで、かつまだ送信していない場合のみ処理
    if (email && email.includes('@') && !sentEmails.has(email)) {
      const subject = '【0テスト送信】お問い合わせありがとうございます';
      const body = `〇〇株式会社様\n\nお問い合わせありがとうございます。\n\nこのメールは自動送信です。`;

      try {
        GmailApp.sendEmail(email, subject, body); // メール送信
        const sender = Session.getActiveUser().getEmail(); // スクリプト実行者(送信元アドレス)を取得
        Logger.log(`送信成功: ${email} ← 送信元: ${sender}`);
        sentEmails.add(email); // セットに追加して、以降の重複を回避
      } catch (e) {
        Logger.log(`送信失敗: ${email} - ${e.message}`);
      }
    } else {
      Logger.log(`スキップ: ${email}`);
    }
  }
}
JavaScript

そのまま貼って、spreadsheetId と sheetName を入力するだけ。

ポイント:getActiveSpreadsheet() を使わず、どのシートを使うかを明示するため、
スプレッドシート側のUIエラーやアカウント衝突の影響を受けにくい構成です。

よくあるハマり/チェックリスト

  • 権限付与を完了したか
    初回実行時の認可ダイアログで、Gmail・スプレッドシートのアクセスを許可する。
  • アカウント衝突(会社アカ/個人アカ)
    別アカウントでログイン中だと権限エラーやリダイレクトが発生しやすい。
    シークレットウィンドウで対象アカウントのみログインして実行。
  • ブラウザ拡張(広告ブロック等)
    スクリプトエディタが開かない、真っ白になるケースあり。
    → 拡張を一時無効化/別ブラウザで試す。
  • シートの共有・権限
    openById はIDさえあれば開けるわけではない。自分がアクセス権を持つファイルか確認。
  • 送信上限(Gmailのクォータ)
    大量送信は日次上限に注意。上限到達で途中停止したら翌日に再実行。
  • 列・行のズレ
    コードは J列(10列目) の想定。列変更したら getRange(row, 10) を合わせて変更。

名前の表示

GmailApp.sendEmail(email, subject, body, {
  name: "株式会社〇〇"  // ← 相手に見える表示名
});
JavaScript

エイリアスに追加したメールアドレス

try {
  GmailApp.sendEmail(email, subject, body, {
    from: "info@example.com",  // ← Gmail で承認済みのエイリアス
    name: "株式会社〇〇"
  });
  Logger.log(`送信成功: ${email} ← 送信元: info@example.com`);
  sentEmails.add(email);
} catch (e) {
  Logger.log(`送信失敗: ${email} - ${e.message}`);
}
JavaScript

まとめ

今回の記事では、GoogleスプレッドシートとApps Scriptを使って、メールを自動で一括送信する方法を紹介しました。

私自身、最初は「毎回コピペで送るのが面倒だな…」と思って試したのがきっかけでした。やってみると意外と簡単で、ほんの数十行のコードで業務が一気に効率化できたのは驚きでした。

記事のポイントを振り返ると:

  • 基本のやり方は、スプレッドシートから直接Apps Scriptを開いて、現在のシートを対象にすればOK
  • トラブル時の代替手段として、script.google.com に直接アクセスし、openById() と getSheetByName() を使えば安定して実行できる
  • スプレッドシートの例のように「正しいメールは送信」「空欄や不正な文字はスキップ」「重複は1回だけ送信」といったルールを入れておけば安心

つまり、ちょっとした工夫で「無駄な送信」や「エラー」を避けながら、毎日の業務をぐっと楽にできます。

もしあなたも「同じ内容のメールを何件も送っていて大変だ」と感じているなら、まずはこの記事のコードをコピーして試してみてください。最初はテスト用のメールアドレスで動作を確認してから本番に使えば安心です。

メール作業にかけていた時間が短縮されると、ほかの仕事や新しいアイデアに集中できるようになりますよ。

コメント

タイトルとURLをコピーしました