# GASでメールを一斉送信する方法｜スプレッドシートの宛先にGmailで自動送信

Google Apps Script (GAS) で、スプレッドシートに並べた宛先へ Gmail でメールを一斉送信する方法を、コピーして使えるコード付きで解説します。宛名の差し込み、二重送信を防ぐ記録、HTML メールと添付ファイル、下書きで確かめてから送る方法、毎日の自動送信、1日の送信数の上限まで公式ドキュメントで確かめました。

<Points>

- スプレッドシートに宛先を並べ、GAS の `GmailApp.sendEmail` で 1 行ずつ送れば、宛名入りのメールを自動で一斉送信できる
- 送った行に「送信済み」と書き込んでおけば、途中で止まっても二重送信を防げる
- いきなり送るのが不安なら `GmailApp.createDraft` で下書きだけ作り、目で確かめてから送れる
- 1 日に送れる宛先の数は、個人の Gmail アカウントで 100、Google Workspace で 1,500 が上限

</Points>

## GASでメールを一斉送信すると何が楽になるか

取引先への案内メールや、毎月の請求のお知らせなど、本文はほぼ同じで宛名だけ違うメールを 1 通ずつ手で送っていると、時間がかかるうえに送り忘れや宛名の間違いが起きます。

Google Apps Script (GAS) を使うと、スプレッドシートに並べた宛先へ、宛名を差し込んだメールを自動で送れます。追加のソフトや有料のサービスは要らず、Google アカウントがあれば今日から使えます。

<Compare>
<Column title="手で送る場合">

- 1 通ずつコピーして宛名を書き換える
- 誰に送ったかを別に記録する
- 送る時刻に席にいる必要がある

</Column>
<Column title="GASで送る場合" tone="accent">

- 宛名はシートから自動で差し込む
- 送った行に日時が自動で残る
- 決まった時刻にトリガーで送れる

</Column>
</Compare>

## 準備するスプレッドシート

新しいスプレッドシートを作り、シートの名前を「送信リスト」に変えて、1 行目に次の見出しを入れます。2 行目から宛先を 1 行に 1 件ずつ書きます。

<Figure title="送信リストのシートの形" caption="D 列は空のままにしておきます。送信した行にスクリプトが日時を書き込みます。">

| | A | B | C | D |
|---|---|---|---|---|
| 1 | メールアドレス | 氏名 | 会社名 | 送信状態 |
| 2 | tanaka@example.com | 田中 | 株式会社サンプル | |
| 3 | suzuki@example.com | 鈴木 | サンプル商事 | |

</Figure>

D 列の「送信状態」が空の行だけを送る作りにします。こうしておくと、途中でエラーが出て止まっても、もう一度実行したときに送った相手へ二重に送らずに済みます。

## コピーして使えるコード

スプレッドシートの上部のメニューから [拡張機能] > [Apps Script] を開き、最初から入っているコードを消して、次のコードを貼り付けて保存します。

```js
const SHEET_NAME = "送信リスト";
const SENDER_NAME = "株式会社サンプル 営業部";
const SUBJECT = "11月の定例会のご案内";
const BODY_TEMPLATE = `{company}
{name} 様

いつもお世話になっております。
11月の定例会のご案内をお送りします。

日時: 11月20日 15:00〜16:00
場所: オンライン (URL は前日にお送りします)

どうぞよろしくお願いいたします。`;

function sendMails() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(SHEET_NAME);
  const lastRow = sheet.getLastRow();
  if (lastRow < 2) return;

  const rows = sheet.getRange(2, 1, lastRow - 1, 4).getValues();
  let remaining = MailApp.getRemainingDailyQuota();

  rows.forEach((row, index) => {
    const [email, name, company, status] = row;
    if (!email || status) return;
    if (remaining < 1) return;

    const body = BODY_TEMPLATE.replace("{company}", company).replace("{name}", name);
    GmailApp.sendEmail(email, SUBJECT, body, { name: SENDER_NAME });

    const sentAt = Utilities.formatDate(new Date(), "Asia/Tokyo", "yyyy/MM/dd HH:mm");
    sheet.getRange(index + 2, 4).setValue(`送信済み ${sentAt}`);
    remaining -= 1;
  });
}
```

コードの中で書き換えるのは、上の 4 行の `SHEET_NAME` (シート名)、`SENDER_NAME` (差出人として表示される名前)、`SUBJECT` (件名)、`BODY_TEMPLATE` (本文) だけです。本文の `{company}` と `{name}` の部分に、C 列の会社名と B 列の氏名が入ります。

### コードがしていること

<Flow
  title="sendMails の流れ"
  caption="D 列が空の行だけを送り、送った行に日時を書き込みます。"
  steps={[
    { label: "シートを読む", note: "2 行目から最終行まで", by: "ai" },
    { label: "送る行を選ぶ", note: "宛先があり D 列が空の行", by: "ai" },
    { label: "宛名を差し込んで送信", note: "GmailApp.sendEmail", by: "ai" },
    { label: "D 列に送信日時を記録", note: "二重送信を防ぐ", by: "ai" },
  ]}
/>

送信には `GmailApp.sendEmail(宛先, 件名, 本文, オプション)` を使っています。[公式リファレンス](https://developers.google.com/apps-script/reference/gmail/gmail-app)によると、オプションには差出人名の `name` のほか、`cc`・`bcc`・返信先の `replyTo`・HTML の本文の `htmlBody`・添付ファイルの `attachments` などを指定できます。件名は 250 文字までです。

`MailApp.getRemainingDailyQuota()` は、その日にあと何人へ送れるかを返す関数です ([公式リファレンス](https://developers.google.com/apps-script/reference/mail/mail-app))。上限に届いたら送らずに止め、残りの行は D 列が空のまま残るので、翌日にもう一度実行すれば続きから送れます。

## 実行して動きを確かめる

<Steps>
<Step title="宛先を自分だけにして試す">

最初は送信リストの 2 行目に自分のメールアドレスだけを入れ、届いたメールの宛名と本文の改行を確かめます。

</Step>
<Step title="関数を選んで実行する">

Apps Script の画面の上部で `sendMails` を選び、[実行] を押します。

</Step>
<Step title="初回だけアクセスを許可する">

初めて実行すると、Gmail とスプレッドシートへのアクセスの許可を求める画面が出ます。自分のアカウントを選んで許可します。`GmailApp` はメールの送信に `https://mail.google.com/` の権限を使います。

</Step>
<Step title="D 列と送信済みフォルダを確かめる">

D 列に「送信済み」と日時が入り、Gmail の送信済みフォルダにメールが残っていれば成功です。確認できたら本番の宛先を並べて実行します。

</Step>
</Steps>

<Note tone="caution">

もう一度同じ相手に送りたいときは、その行の D 列を消してから実行します。D 列に何か入っている行は送られません。

</Note>

## 送る前に下書きで確かめる

宛先が多いと、本文の誤字や差し込みのずれに送ったあとで気づいても取り消せません。最初の数回は、送信ではなく Gmail の下書きを作る形にしておくと安心です。

先ほどのコードの `GmailApp.sendEmail` の行を、次のように `GmailApp.createDraft` に置き換えます。引数の形は同じです。

```js
GmailApp.createDraft(email, SUBJECT, body, { name: SENDER_NAME });
```

[公式リファレンス](https://developers.google.com/apps-script/reference/gmail/gmail-app)によると、`createDraft` は送信せずに下書きのメールを作る関数で、`sendEmail` と同じオプションを指定できます。実行すると Gmail の下書きフォルダに相手ごとのメールが並ぶので、何通か開いて宛名と本文を確かめ、問題なければ下書きから送ります。

<Compare>
<Column title="sendEmail">

- 実行するとすぐ送られる
- 送ったあとは取り消せない
- 慣れて内容が固まったら使う

</Column>
<Column title="createDraft" tone="accent">

- 下書きフォルダに作るだけ
- 目で確かめてから送れる
- 初回や宛先が多いときに向く

</Column>
</Compare>

下書きの形にするときは、D 列に書き込む文字を「下書き作成済み」に変えておくと、送ったものと区別できます。

## HTMLメールや添付ファイルを付けて送る

`sendEmail` の 4 番目の引数 (オプション) を足すと、文字の太さや色を付けた HTML のメールや、ファイルを添付したメールも一斉に送れます。

```js
const pdf = DriveApp.getFileById("添付するファイルのID").getBlob();
GmailApp.sendEmail(email, SUBJECT, body, {
  name: SENDER_NAME,
  htmlBody: `<p>${company}<br>${name} 様</p><p><b>11月の定例会</b>のご案内です。</p>`,
  attachments: [pdf],
});
```

<Figure title="sendEmail で指定できる主なオプション" caption="2026年11月11日時点の公式リファレンスの内容です。" source="Google Apps Script リファレンス (Class GmailApp)">

| オプション | できること |
|---|---|
| `name` | 差出人として表示する名前 |
| `cc` / `bcc` | CC・BCC の宛先 (カンマ区切り) |
| `replyTo` | 返信先のアドレス |
| `htmlBody` | HTML の本文。HTML を表示できるメールソフトでは `body` の代わりに使われる |
| `attachments` | 添付するファイルの配列 |
| `from` | 送信元のアドレス。`getAliases()` が返すアドレスだけ使える |
| `noReply` | 返信不可の汎用アドレスから送る。Google Workspace のアカウントだけで使える |

</Figure>

`htmlBody` を指定しても、3 番目の引数の `body` は省けません。HTML を表示できない環境ではこちらが出るので、同じ内容の文章を入れておきます。

## 毎日決まった時刻に自動で送る

毎朝の連絡や、リストに追加された相手へ定期的に送る用途なら、時間主導型のトリガーを付けると手で実行しなくても送られます。[公式ガイド](https://developers.google.com/apps-script/guides/triggers/installable)の手順は次のとおりです。

1. Apps Script の画面の左側で [トリガー] (時計のアイコン) を開く
2. 右下の [トリガーを追加] を押す
3. 実行する関数に `sendMails`、イベントのソースに「時間主導型」を選び、日付ベースのタイマーと時刻を選ぶ
4. [保存] を押す

時刻は分単位では決まりません。公式ガイドによると、たとえば 9 時に設定すると 9 時から 10 時の間で実行の時刻が選ばれ、以後は毎日その時刻に動きます。「9 時ちょうどに届けたい」用途には向かないので、時間帯で指定するものと考えてください。

## 送信数の上限と注意点

GAS から送れるメールの数には 1 日の上限があります。上限は宛先の人数で数えるので、1 通に 3 人を入れれば 3 と数えます。

<BarChart
  title="1 日に送れるメールの宛先の数"
  source="Google Apps Script の割り当て (Quotas for Google Services)"
  unit="人"
  data={[
    { label: "個人の Google アカウント", value: 100, display: "100人" },
    { label: "Google Workspace", value: 1500, display: "1,500人", highlight: true },
  ]}
/>

[公式の割り当ての一覧](https://developers.google.com/apps-script/guides/services/quotas)では、ほかにも次の上限が決まっています。

<Figure title="自動送信で気にしたい上限" caption="2026年11月11日時点の公式ページの値です。" source="Google Apps Script の割り当て (Quotas for Google Services)">

| 項目 | 個人のアカウント | Google Workspace |
|---|---|---|
| 1 日に送れる宛先の数 | 100 | 1,500 |
| 1 回の実行時間 | 6 分 | 6 分 |
| トリガーの合計実行時間 (1 日) | 90 分 | 6 時間 |
| 1 つのスクリプトのトリガーの数 | 20 | 20 |

</Figure>

数百件を超える一斉配信や、開封率の計測が必要なメールマガジンには、GAS より専用の配信サービスが向いています。GAS は、取引先への案内や社内の通知のように、相手が決まっていて数が限られるメールに使うのが現実的です。

また、送信は自分の Gmail アカウントから行われます。退職や異動でアカウントが止まるとトリガーも動かなくなるため、業務で使うなら共用のアカウントで作っておくと引き継ぎが楽です。

## 自分で作るのが難しいときは

ここで紹介したコードは、宛名を差し込んで送るだけの最小の形です。実際の業務では「添付ファイルを相手ごとに変えたい」「フォームの回答が来たらすぐ返信したい」「送る前に上長の承認を挟みたい」といった条件が加わり、作り込むほど手間がかかります。

自分で直すのが難しい、止まったときに直せる人が社内にいない、という場合は、作る部分だけを外部に任せるのも一つの方法です。シートナビでは、GAS での自動化やスプレッドシートで回している業務の作り直しの相談を受け付けています。お困りのときは[相談フォーム](/contact/)からお気軽にご連絡ください。

## よくある質問

### Q. GmailApp と MailApp はどちらを使えばよいですか？

どちらもメールを送れます。`GmailApp` は Gmail の受信トレイの検索やラベルの操作もできる分、Gmail 全体へのアクセスの許可を求めます。メールを送るだけなら `MailApp.sendEmail` でも同じ形で書け、[公式リファレンス](https://developers.google.com/apps-script/reference/mail/mail-app)によると求める権限もメールの送信 (`script.send_mail`) だけになります。この記事のコードは `GmailApp.sendEmail` を `MailApp.sendEmail` に書き換えても動きます。

### Q. 1 日の上限より多い宛先に一斉送信したいときは？

この記事のコードは `MailApp.getRemainingDailyQuota()` で残りの数を確かめ、上限に届いたらそれ以上送りません。送れなかった行は D 列が空のまま残るので、翌日に同じ関数を実行するか、毎日のトリガーを付けておけば、数日に分けて続きから送れます。

### Q. 送信元のアドレスを別のアドレスにできますか？

`from` のオプションで変えられますが、指定できるのは Gmail の設定で「別のアドレスからメールを送信する」に登録済みのアドレスだけです。公式リファレンスでは、`GmailApp.getAliases()` が返すアドレスのどれかである必要があると説明されています。
