毎回同じ内容のメールを一人ひとりに送るのは、とても手間がかかりますよね。
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() で残すので、後から確認可能です。
実行手順
- スプレッドシートを開き、上メニューから
拡張機能 → Apps Script をクリック。 - 新しいスクリプトエディタが開くので、上記コードを貼り付けて保存。
- 「実行」ボタンから sendTestEmails を選び、初回のみ権限を許可。
- ログで「送信成功」「スキップ」などの動作結果を確認。
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回だけ送信
となり、無駄な送信やエラーを避けられる設計です。
手順(最短ルート)
- ブラウザで https://script.google.com/ を開く
- 新しいプロジェクト を作成
- 下のコードを貼り付け
- スプレッドシートID と シート名(タブ名) を置き換え
- 「実行」→ 初回の権限付与 → ログで結果確認

代替用コード(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回だけ送信」といったルールを入れておけば安心
つまり、ちょっとした工夫で「無駄な送信」や「エラー」を避けながら、毎日の業務をぐっと楽にできます。
もしあなたも「同じ内容のメールを何件も送っていて大変だ」と感じているなら、まずはこの記事のコードをコピーして試してみてください。最初はテスト用のメールアドレスで動作を確認してから本番に使えば安心です。
メール作業にかけていた時間が短縮されると、ほかの仕事や新しいアイデアに集中できるようになりますよ。

コメント