<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>メール自動化 &#8211; biz-tactics</title>
	<atom:link href="https://mashukabu.com/tag/%E3%83%A1%E3%83%BC%E3%83%AB%E8%87%AA%E5%8B%95%E5%8C%96/feed/" rel="self" type="application/rss+xml" />
	<link>https://mashukabu.com</link>
	<description></description>
	<lastBuildDate>Fri, 12 Jun 2026 21:59:47 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://mashukabu.com/wp-content/uploads/2022/04/cropped-site-icon-32x32.png</url>
	<title>メール自動化 &#8211; biz-tactics</title>
	<link>https://mashukabu.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>【コピペで動く】スプレッドシートからGmailを一括送信する方法｜GASで差し込みメールを自動化</title>
		<link>https://mashukabu.com/spreadsheet-gmail-batch-send-gas/</link>
					<comments>https://mashukabu.com/spreadsheet-gmail-batch-send-gas/#respond</comments>
		
		<dc:creator><![CDATA[まっしゅ]]></dc:creator>
		<pubDate>Fri, 12 Jun 2026 21:59:47 +0000</pubDate>
				<category><![CDATA[Googleスプレッドシート]]></category>
		<category><![CDATA[GAS]]></category>
		<category><![CDATA[Gmail]]></category>
		<category><![CDATA[Google Apps Script]]></category>
		<category><![CDATA[スプレッドシート]]></category>
		<category><![CDATA[メール自動化]]></category>
		<category><![CDATA[差し込みメール]]></category>
		<guid isPermaLink="false">https://mashukabu.com/?p=7999</guid>

					<description><![CDATA[スプレッドシートのリストからGmailをGASで一括送信する方法を解説。差し込み変数・テストモード・HTMLメール・添付ファイル対応のコピペコード3パターンと、送信上限・誤送信防止のコツまで実務目線で網羅。]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">スプレッドシートに溜まった顧客リストや社員名簿を見ながら、Gmailで1通ずつ宛名を変えて送信していませんか。10通ならまだしも、50通・100通になると本当に消耗しますよね。実はその作業、Google Apps Script（GAS）を使えば1クリックで自動化できます。Word差し込み印刷のメール版を、無料のGmailとスプレッドシートだけで実現できるのです。この記事では、コピペで動く完成コード3パターン（基本／HTMLメール／添付ファイル付き）と、誤送信を防ぐテストモード・送信上限の対策まで、実務で使える形でまとめました。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-1" checked><label class="toc-title" for="toc-checkbox-1">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">スプレッドシートからGmailを一括送信するとは？｜GASで差し込みメールを自動化する仕組み</a><ol><li><a href="#toc2" tabindex="0">こんなシーンで活躍します</a></li></ol></li><li><a href="#toc3" tabindex="0">一括送信を始める前の準備｜スプレッドシートのレイアウトとGmail送信枠</a><ol><li><a href="#toc4" tabindex="0">スプレッドシートのレイアウト例</a></li><li><a href="#toc5" tabindex="0">Gmailの送信上限を必ず確認する</a></li><li><a href="#toc6" tabindex="0">スクリプトエディタを開く</a></li></ol></li><li><a href="#toc7" tabindex="0">【レシピ1】基本の差し込みメール一括送信（コピペで動くGAS）</a><ol><li><a href="#toc8" tabindex="0">コード本体</a></li><li><a href="#toc9" tabindex="0">実行手順</a></li><li><a href="#toc10" tabindex="0">コードの読み解きポイント</a></li></ol></li><li><a href="#toc11" tabindex="0">【レシピ2】HTMLメール（装飾付き）で一括送信する</a></li><li><a href="#toc12" tabindex="0">【レシピ3】PDF・画像を添付ファイルとして一括送信する</a><ol><li><a href="#toc13" tabindex="0">準備: スプレッドシートに「添付ファイルID列」を追加</a></li><li><a href="#toc14" tabindex="0">コード本体</a></li></ol></li><li><a href="#toc15" tabindex="0">送信前のテスト方法と誤送信を防ぐ4つのコツ</a><ol><li><a href="#toc16" tabindex="0">コツ1: TEST_MODE で自分宛に送信して確認する</a></li><li><a href="#toc17" tabindex="0">コツ2: 送信件数を絞ってから本番実行する</a></li><li><a href="#toc18" tabindex="0">コツ3: 送信前に getRemainingDailyQuota() で残数を確認</a></li><li><a href="#toc19" tabindex="0">コツ4: 送信ステータス列で重複送信を防ぐ</a></li></ol></li><li><a href="#toc20" tabindex="0">BCC一斉送信とGAS差し込み送信の違い・使い分け</a></li><li><a href="#toc21" tabindex="0">スプレッドシート×Gmail一括送信でよくあるエラーと対処法</a><ol><li><a href="#toc22" tabindex="0">よくある間違い: 「済」の判定で全角と半角が混在</a></li><li><a href="#toc23" tabindex="0">よくある間違い: 改行コードの混在</a></li></ol></li><li><a href="#toc24" tabindex="0">まとめ｜スプレッドシート×GASでメール送信業務を一気に効率化する</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">スプレッドシートからGmailを一括送信するとは？｜GASで差し込みメールを自動化する仕組み</span></h2>



<p class="wp-block-paragraph">スプレッドシートからGmailを一括送信する仕組みは、シンプルに言えば「メールアドレス一覧をスプレッドシートに用意し、GASで1行ずつ読み込んでGmail経由で送る」というものです。GAS（Google Apps Script）はGoogleが提供する無料のスクリプト環境で、JavaScriptに似た言語で書きます。</p>



<p class="wp-block-paragraph">差し込み印刷と同じ発想で、本文に <code>{{name}}様</code> のようなプレースホルダーを書いておき、スプレッドシートの「名前列」の値で置換します。これで「○○様、いつもお世話になっております」のように個別の宛名を入れた状態で、100通でも500通でもまとめて送信できます。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>NOTE: GASは追加費用ゼロで使えます</strong><br>Googleアカウントを持っていれば、GASは無料で利用できます。インストール不要で、ブラウザ上のエディタですぐに書き始められます。Google Apps Scriptの基本操作は<a href="https://mashukabu.com/spreadsheet-gas-getting-started-recipes/">GAS入門記事</a>で解説しているので、初めて触る方はそちらから読んでください。</p></blockquote>



<h3 class="wp-block-heading"><span id="toc2">こんなシーンで活躍します</span></h3>



<ul class="wp-block-list"><li>取引先50社へ請求書送付の案内メール（添付PDFは行ごとに変える）</li><li>セミナー申込者100名へ参加URLとパスワードを個別送信</li><li>社内メンバー30名へ年末挨拶メール（部署名と氏名を差し込み）</li><li>顧客リストにアンケート依頼を一斉送信</li><li>退会フォーム提出者にお礼メールを自動返信</li></ul>



<p class="wp-block-paragraph">メール配信ツールを契約せず、今あるスプレッドシートとGmailだけで完結するのが最大のメリットです。</p>



<h2 class="wp-block-heading"><span id="toc3">一括送信を始める前の準備｜スプレッドシートのレイアウトとGmail送信枠</span></h2>



<p class="wp-block-paragraph">まずは送信元データを準備します。スプレッドシートのレイアウトと、Gmailの送信上限を必ず先に確認してください。</p>



<h3 class="wp-block-heading"><span id="toc4">スプレッドシートのレイアウト例</span></h3>



<p class="wp-block-paragraph">A列〜E列に以下のヘッダーを置きます。1行目がヘッダー、2行目以降がデータ行です。</p>



<figure class="wp-block-table"><table><thead><tr><th>A: メールアドレス</th><th>B: 名前</th><th>C: 会社名</th><th>D: 件名差し込み</th><th>E: 送信ステータス</th></tr></thead><tbody><tr><td>sample01@example.com</td><td>山田太郎</td><td>株式会社サンプル</td><td>4月度ご請求書</td><td>（空欄）</td></tr><tr><td>sample02@example.com</td><td>鈴木花子</td><td>サンプル商事</td><td>4月度ご請求書</td><td>（空欄）</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">E列の「送信ステータス」は、送信成功時に「済」と書き込む列です。途中でエラーになっても、再実行時にE列が空欄の行だけ送信できるので、重複送信を防げます。</p>



<h3 class="wp-block-heading"><span id="toc5">Gmailの送信上限を必ず確認する</span></h3>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>WARNING: Gmailには1日あたりの送信上限があります</strong><br>通常のGmail（@gmail.com 無料アカウント）は1日100通まで、Google Workspaceの有料アカウントは1日1,500通までです。上限を超えるとアカウントが一時的にロックされ、最大24時間メール送信ができなくなります。</p></blockquote>



<figure class="wp-block-table"><table><thead><tr><th>アカウント種別</th><th>1日の送信数上限</th></tr></thead><tbody><tr><td>通常のGmail（無料）</td><td>100通</td></tr><tr><td>Google Workspace（有料）</td><td>1,500通</td></tr><tr><td>Workspace（試用版）</td><td>500通</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">リセットは前回送信から24時間後で、暦日（0時リセット）ではない点に注意してください。100通を超える送信が必要な場合は、Workspaceの導入か、メール配信専用ツールへの切り替えを検討しましょう。</p>



<h3 class="wp-block-heading"><span id="toc6">スクリプトエディタを開く</span></h3>



<p class="wp-block-paragraph">スプレッドシートのメニューから「拡張機能」→「Apps Script」をクリックします。新しいタブでスクリプトエディタが開きます。初回は無題のプロジェクトが作成されるので、左上のプロジェクト名を分かりやすい名前（例: <code>gmail-bulk-send</code>）に変更しておきましょう。</p>



<h2 class="wp-block-heading"><span id="toc7">【レシピ1】基本の差し込みメール一括送信（コピペで動くGAS）</span></h2>



<p class="wp-block-paragraph">それではコードを書いていきます。最初は基本のテキストメール一括送信です。スプレッドシートの「名前」「会社名」を本文に差し込んで送信します。</p>



<h3 class="wp-block-heading"><span id="toc8">コード本体</span></h3>



<p class="wp-block-paragraph">スクリプトエディタの初期コード（<code>function myFunction() { }</code>）をすべて消して、以下を貼り付けます。</p>



<pre class="wp-block-code"><code>// --- 基本: テキストメールの一括送信 ---
function sendBulkEmail() {
  // --- 設定値 ---
  const SHEET_NAME = 'シート1';        // 対象シート名
  const TEST_MODE = true;              // true=自分のみに送信（テスト用）
  const TEST_EMAIL = 'your-email@example.com'; // テスト用の自分のアドレス
  const SENDER_NAME = '山田 太郎';      // 差出人表示名

  // --- メールテンプレート ---
  const subjectTemplate = '{{subject}}のご案内';
  const bodyTemplate = `{{company}}
{{name}}様

いつも大変お世話になっております。
山田です。

{{subject}}についてご連絡いたします。
詳細は添付の資料をご確認ください。

引き続きよろしくお願いいたします。`;

  // --- スプレッドシートからデータ取得 ---
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(SHEET_NAME);
  const values = sheet.getDataRange().getValues(); // 全データを2次元配列で取得
  const header = values[0];                         // 1行目はヘッダー
  const rows = values.slice(1);                     // 2行目以降がデータ

  // --- 残り送信可能数チェック ---
  const quota = MailApp.getRemainingDailyQuota();
  if (quota &lt; rows.length) {
    throw new Error('送信可能数が不足: 残り' + quota + '通 / 必要' + rows.length + '通');
  }

  // --- 行ごとに送信 ---
  let successCount = 0; // 成功カウンター
  let errorCount = 0;   // 失敗カウンター
  rows.forEach((row, i) =&gt; {
    const email   = row[0]; // A列: メールアドレス
    const name    = row[1]; // B列: 名前
    const company = row[2]; // C列: 会社名
    const subject = row[3]; // D列: 件名差し込み
    const status  = row[4]; // E列: 送信ステータス

    // --- 既に送信済みの行はスキップ ---
    if (status === '済') return;
    // --- メールアドレスが空の行はスキップ ---
    if (!email) return;

    // --- テンプレートを差し込み置換 ---
    const finalSubject = subjectTemplate.replace(/{{subject}}/g, subject);
    const finalBody    = bodyTemplate
      .replace(/{{name}}/g, name)
      .replace(/{{company}}/g, company)
      .replace(/{{subject}}/g, subject);

    // --- テストモードなら自分宛に送信、本番なら本人宛 ---
    const recipient = TEST_MODE ? TEST_EMAIL : email;

    try {
      MailApp.sendEmail(recipient, finalSubject, finalBody, {
        name: SENDER_NAME
      });
      // --- 送信成功時はE列に「済」を書き込み ---
      if (!TEST_MODE) {
        sheet.getRange(i + 2, 5).setValue('済');
      }
      successCount++;
    } catch (e) {
      // --- 失敗時はE列にエラー内容を記録 ---
      sheet.getRange(i + 2, 5).setValue('エラー: ' + e.message);
      errorCount++;
    }
  });

  // --- 完了メッセージ ---
  const mode = TEST_MODE ? 'テスト' : '本番';
  SpreadsheetApp.getUi().alert(
    mode + '送信完了n成功: ' + successCount + '件 / 失敗: ' + errorCount + '件'
  );
}</code></pre>



<h3 class="wp-block-heading"><span id="toc9">実行手順</span></h3>



<ol class="wp-block-list"><li>スクリプトエディタ上部の関数選択で <code>sendBulkEmail</code> を選択</li><li>「実行」ボタンをクリック</li><li>初回は権限承認の画面が出るので、「権限を確認」→「（自分のアカウント）」→「詳細」→「（プロジェクト名）（安全ではないページ）に移動」→「許可」の順に進める</li><li>完了アラートが出れば成功</li></ol>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>WARNING: 初回は必ず TEST_MODE = true で実行してください</strong><br>いきなり本番送信すると誤送信のリスクが高いです。最初は <code>TEST_MODE = true</code> のまま自分のアドレス宛に何通か送って、本文と件名の差し込みが正しく動くか確認しましょう。問題なければ <code>TEST_MODE = false</code> に変更して本番実行します。</p></blockquote>



<h3 class="wp-block-heading"><span id="toc10">コードの読み解きポイント</span></h3>



<ul class="wp-block-list"><li><code>sheet.getDataRange().getValues()</code> でシート全体を2次元配列にして取得</li><li><code>values.slice(1)</code> で1行目（ヘッダー）を除外</li><li><code>replace(/{{name}}/g, name)</code> の <code>g</code> フラグは「全置換」の意味。同じプレースホルダーが複数回出てきても全部置換される</li><li><code>MailApp.sendEmail()</code> の第4引数 <code>options</code> で差出人表示名を指定</li><li>行番号は <code>i + 2</code>（配列インデックス0始まり + ヘッダー行1分）</li></ul>



<h2 class="wp-block-heading"><span id="toc11">【レシピ2】HTMLメール（装飾付き）で一括送信する</span></h2>



<p class="wp-block-paragraph">太字や色付き文字、表組みを入れたHTMLメールも、<code>htmlBody</code> オプションを使えば送信できます。請求書の合計金額を強調したい、注意事項を赤文字にしたい、といったケースで便利です。</p>



<pre class="wp-block-code"><code>// --- HTMLメールの一括送信 ---
function sendBulkHtmlEmail() {
  const SHEET_NAME = 'シート1';
  const TEST_MODE = true;
  const TEST_EMAIL = 'your-email@example.com';
  const SENDER_NAME = '山田 太郎';

  const subjectTemplate = '【重要】{{subject}}のご案内';

  // --- HTML本文テンプレート ---
  const htmlTemplate = `
&lt;p&gt;{{company}}&lt;br&gt;{{name}}様&lt;/p&gt;
&lt;p&gt;いつも大変お世話になっております。&lt;br&gt;山田です。&lt;/p&gt;
&lt;p&gt;{{subject}}についてご連絡いたします。&lt;/p&gt;
&lt;table style=&quot;border-collapse:collapse;border:1px solid #ccc;&quot;&gt;
  &lt;tr style=&quot;background:#f5f5f5;&quot;&gt;
    &lt;th style=&quot;padding:8px;border:1px solid #ccc;&quot;&gt;項目&lt;/th&gt;
    &lt;th style=&quot;padding:8px;border:1px solid #ccc;&quot;&gt;内容&lt;/th&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td style=&quot;padding:8px;border:1px solid #ccc;&quot;&gt;対応期限&lt;/td&gt;
    &lt;td style=&quot;padding:8px;border:1px solid #ccc;color:#c00;&quot;&gt;&lt;strong&gt;5月20日（火）まで&lt;/strong&gt;&lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;ご不明点がございましたら、本メールに返信ください。&lt;/p&gt;
&lt;p&gt;引き続きよろしくお願いいたします。&lt;/p&gt;
`;

  // --- プレーンテキスト版（HTML非対応クライアント用） ---
  const plainTemplate = `{{company}}
{{name}}様

いつも大変お世話になっております。
山田です。

{{subject}}についてご連絡いたします。
対応期限: 5月20日（火）まで

ご不明点がございましたら、本メールに返信ください。
引き続きよろしくお願いいたします。`;

  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(SHEET_NAME);
  const rows = sheet.getDataRange().getValues().slice(1);

  let successCount = 0; // 成功カウンター
  rows.forEach((row, i) =&gt; {
    const email   = row[0]; // A列: メールアドレス
    const name    = row[1]; // B列: 名前
    const company = row[2]; // C列: 会社名
    const subject = row[3]; // D列: 件名差し込み
    const status  = row[4]; // E列: 送信ステータス
    if (status === '済' || !email) return;

    const finalSubject = subjectTemplate.replace(/{{subject}}/g, subject);
    const finalHtml = htmlTemplate
      .replace(/{{name}}/g, name)
      .replace(/{{company}}/g, company)
      .replace(/{{subject}}/g, subject);
    const finalPlain = plainTemplate
      .replace(/{{name}}/g, name)
      .replace(/{{company}}/g, company)
      .replace(/{{subject}}/g, subject);

    const recipient = TEST_MODE ? TEST_EMAIL : email;
    MailApp.sendEmail(recipient, finalSubject, finalPlain, {
      name: SENDER_NAME,
      htmlBody: finalHtml
    });
    if (!TEST_MODE) sheet.getRange(i + 2, 5).setValue('済');
    successCount++;
  });

  SpreadsheetApp.getUi().alert('HTML送信完了: ' + successCount + '件');
}</code></pre>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>TIP: HTMLメールはインラインCSSのみ使う</strong><br>HTMLメールでは、外部CSSファイルや<code><style></code>タグ内のクラス指定が効かないクライアントが多いです。色や枠線などのスタイルは、すべて要素の <code>style</code> 属性に直接書く（インラインCSS）のが鉄則です。</p></blockquote>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>NOTE: スパム判定を避けるコツ</strong><br>HTMLメールは過度な装飾・大量の画像・リンク多すぎでスパム判定されやすくなります。本文内のリンクは2〜3個までに抑え、画像はロゴ程度にとどめましょう。件名に「【無料】」「【限定】」といった煽り文句を多用するのも避けてください。</p></blockquote>



<h2 class="wp-block-heading"><span id="toc12">【レシピ3】PDF・画像を添付ファイルとして一括送信する</span></h2>



<p class="wp-block-paragraph">請求書PDFを行ごとに別ファイルで添付したい、といった要望もよくあります。Google Driveに保存したファイルを <code>DriveApp</code> 経由で取得して添付します。</p>



<h3 class="wp-block-heading"><span id="toc13">準備: スプレッドシートに「添付ファイルID列」を追加</span></h3>



<p class="wp-block-paragraph">F列に「添付ファイルID」列を追加し、Google DriveのファイルIDを各行に書きます。ファイルIDはDriveでファイルを開いたときのURL <code>https://drive.google.com/file/d/{ファイルID}/view</code> から取得できます。</p>



<figure class="wp-block-table"><table><thead><tr><th>A: メール</th><th>B: 名前</th><th>C: 会社</th><th>D: 件名</th><th>E: ステータス</th><th>F: ファイルID</th></tr></thead><tbody><tr><td>sample01@...</td><td>山田太郎</td><td>サンプル</td><td>4月度請求書</td><td>（空欄）</td><td>1AbCdEf...</td></tr></tbody></table></figure>



<h3 class="wp-block-heading"><span id="toc14">コード本体</span></h3>



<pre class="wp-block-code"><code>// --- 添付ファイル付きの一括送信 ---
function sendBulkEmailWithAttachment() {
  const SHEET_NAME = 'シート1';
  const TEST_MODE = true;
  const TEST_EMAIL = 'your-email@example.com';
  const SENDER_NAME = '山田 太郎';

  const subjectTemplate = '{{subject}}（請求書添付）';
  const bodyTemplate = `{{company}}
{{name}}様

いつもお世話になっております。山田です。
{{subject}}を添付にてお送りいたします。
ご確認のほどよろしくお願いいたします。`;

  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(SHEET_NAME);
  const rows = sheet.getDataRange().getValues().slice(1);

  let successCount = 0; // 成功カウンター
  rows.forEach((row, i) =&gt; {
    const email   = row[0]; // A列: メールアドレス
    const name    = row[1]; // B列: 名前
    const company = row[2]; // C列: 会社名
    const subject = row[3]; // D列: 件名差し込み
    const status  = row[4]; // E列: 送信ステータス
    const fileId  = row[5]; // F列: 添付ファイルID
    if (status === '済' || !email) return;

    // --- 添付ファイルをDriveから取得 ---
    let attachmentBlob = null;
    if (fileId) {
      try {
        attachmentBlob = DriveApp.getFileById(fileId).getBlob();
      } catch (e) {
        sheet.getRange(i + 2, 5).setValue('エラー: ファイルID不正');
        return;
      }
    }

    const finalSubject = subjectTemplate.replace(/{{subject}}/g, subject);
    const finalBody = bodyTemplate
      .replace(/{{name}}/g, name)
      .replace(/{{company}}/g, company)
      .replace(/{{subject}}/g, subject);

    const recipient = TEST_MODE ? TEST_EMAIL : email;
    const options = { name: SENDER_NAME };
    if (attachmentBlob) options.attachments = [attachmentBlob];

    try {
      MailApp.sendEmail(recipient, finalSubject, finalBody, options);
      if (!TEST_MODE) sheet.getRange(i + 2, 5).setValue('済');
      successCount++;
    } catch (e) {
      sheet.getRange(i + 2, 5).setValue('エラー: ' + e.message);
    }
  });

  SpreadsheetApp.getUi().alert('添付付き送信完了: ' + successCount + '件');
}</code></pre>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>TIP: 添付ファイルの合計サイズは25MBまで</strong><br>Gmailの仕様で、添付ファイルの合計サイズは1通あたり25MB以内です。これを超える場合はGoogle Driveのリンク共有を使い、本文に共有URLを差し込む方式が安全です。<code>DriveApp.getFileById(id).getUrl()</code> でファイルURLを取得できます。</p></blockquote>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>NOTE: スプレッドシート自体をPDF化して添付する場合</strong><br>別シートに作った請求書テーブルをPDFにして添付したい場合は、<code>DriveApp.getFileById(spreadsheetId).getAs('application/pdf')</code> でPDF Blobを生成できます。スプレッドシートIDはシートのURLから取得します。</p></blockquote>



<h2 class="wp-block-heading"><span id="toc15">送信前のテスト方法と誤送信を防ぐ4つのコツ</span></h2>



<p class="wp-block-paragraph">一括送信は便利ですが、誤送信したときのダメージも大きいです。送信ボタンを押す前に、必ず以下の4つを実施しましょう。</p>



<h3 class="wp-block-heading"><span id="toc16">コツ1: TEST_MODE で自分宛に送信して確認する</span></h3>



<p class="wp-block-paragraph">レシピ1〜3のコードはすべて <code>TEST_MODE = true</code> で動作確認できる構造になっています。最初は必ず自分のアドレスにだけ送信し、件名・本文の差し込みが正しいか、添付ファイルが付いているかを目視確認してください。</p>



<h3 class="wp-block-heading"><span id="toc17">コツ2: 送信件数を絞ってから本番実行する</span></h3>



<p class="wp-block-paragraph">スプレッドシートのデータが100行ある場合、いきなり全部送信せず、最初の3〜5行だけ残して他は別シートに退避させ、少数で本番実行→問題なければ残りを実行、という段階的なやり方が安全です。</p>



<h3 class="wp-block-heading"><span id="toc18">コツ3: 送信前に getRemainingDailyQuota() で残数を確認</span></h3>



<p class="wp-block-paragraph">レシピ1のコードに含めてある通り、送信前に残り送信可能数をチェックします。これがないと、80通目で上限に到達して残り20通が未送信のまま停止する、という事故が起きます。</p>



<pre class="wp-block-code"><code>const quota = MailApp.getRemainingDailyQuota();
console.log('残り送信可能数: ' + quota);</code></pre>



<h3 class="wp-block-heading"><span id="toc19">コツ4: 送信ステータス列で重複送信を防ぐ</span></h3>



<p class="wp-block-paragraph">E列の「送信ステータス」に「済」を書き込む仕組みは、重複送信防止のためです。途中でブラウザが落ちたり、コードがエラーで停止したりしても、再実行時に「済」の行はスキップされるので安全です。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>WARNING: BCC欄に入れる安易な一斉送信は厳禁</strong><br>「Gmailの To 欄に複数アドレス」「BCCに大量アドレス」といったやり方は、相手のメールアドレスが他の受信者に見えてしまう個人情報漏洩リスクがあります。一括送信は必ずGAS経由で1通ずつ個別送信してください。</p></blockquote>



<h2 class="wp-block-heading"><span id="toc20">BCC一斉送信とGAS差し込み送信の違い・使い分け</span></h2>



<p class="wp-block-paragraph">そもそも「Gmail BCCで全員に送ればいいのでは？」と思った方もいるかもしれません。両者の違いを表で整理します。</p>



<figure class="wp-block-table"><table><thead><tr><th>項目</th><th>BCC一斉送信</th><th>GAS差し込み送信</th></tr></thead><tbody><tr><td>個別の宛名差し込み</td><td>できない</td><td>できる（{{name}}様 等）</td></tr><tr><td>送信先のリスト管理</td><td>連絡先・アドレス帳</td><td>スプレッドシートで管理</td></tr><tr><td>送信履歴の追跡</td><td>1通分しか残らない</td><td>各通ごとに履歴</td></tr><tr><td>エラー時の個別検知</td><td>できない</td><td>try-catchで行ごとに検知</td></tr><tr><td>添付ファイルの個別変更</td><td>できない（全員同じ）</td><td>できる（行ごとに別ファイル）</td></tr><tr><td>個人情報漏洩リスク</td><td>TO/CCに入れると漏洩</td><td>1通ずつなのでなし</td></tr><tr><td>1メールの宛先上限</td><td>500件まで（Workspace）</td><td>100通/日（無料）, 1500通/日（有料）</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">ざっくり使い分けると、以下のようになります。</p>



<ul class="wp-block-list"><li><strong>BCC一斉送信が向くケース</strong>: 内容がまったく同じ・宛名差し込み不要・社内メンバー数十名への一斉連絡</li><li><strong>GAS差し込み送信が向くケース</strong>: 宛名・会社名・添付ファイルを個別に変えたい・送信履歴を残したい・送信ミスを行ごとに検知したい</li></ul>



<p class="wp-block-paragraph">社外への請求書送付や顧客向けセミナー案内などは、誤送信リスクと個別性の観点からGAS差し込み送信が安全です。</p>



<h2 class="wp-block-heading"><span id="toc21">スプレッドシート×Gmail一括送信でよくあるエラーと対処法</span></h2>



<p class="wp-block-paragraph">実際にコードを動かしてみて遭遇しやすいエラーをまとめました。</p>



<figure class="wp-block-table"><table><thead><tr><th>エラーメッセージ</th><th>原因</th><th>対処法</th></tr></thead><tbody><tr><td><code>Service invoked too many times: email</code></td><td>1日の送信上限に到達</td><td>24時間待つ、またはWorkspaceに切り替え</td></tr><tr><td><code>Authorization is required</code></td><td>権限承認が未完了</td><td>スクリプトエディタで「権限を確認」を実施</td></tr><tr><td><code>Invalid email: </code></td><td>メールアドレス列に不正な値</td><td>A列の値を確認、空欄行のスキップ処理を追加</td></tr><tr><td><code>Cannot find file with id: xxx</code></td><td>DriveApp.getFileById のIDが間違い</td><td>F列のファイルIDを再確認、共有設定も確認</td></tr><tr><td><code>Cannot read property '0' of undefined</code></td><td>シート名が間違い、またはシートが空</td><td><code>SHEET_NAME</code> の値を確認</td></tr><tr><td><code>Exception: Argument too large: subject</code></td><td>件名が長すぎ（256文字超）</td><td>件名を短く調整</td></tr><tr><td>メールが届かない</td><td>スパムフォルダ行き</td><td>件名・本文の煽り文句を減らす、送信元表示名を固定</td></tr></tbody></table></figure>



<h3 class="wp-block-heading"><span id="toc22">よくある間違い: 「済」の判定で全角と半角が混在</span></h3>



<p class="wp-block-paragraph">「済」の文字を全角で書いたり、前後にスペースが入ったりすると、判定がうまくいかず重複送信が起きます。コード内で書き込む値と判定する値を完全一致させましょう。心配な場合は <code>if (String(status || '').trim() === '済') return;</code> のように <code>String()</code> でラップしてから <code>.trim()</code> で前後空白を除去すると、空セル（undefined/null）でも安全に判定できます。</p>



<h3 class="wp-block-heading"><span id="toc23">よくある間違い: 改行コードの混在</span></h3>



<p class="wp-block-paragraph">スプレッドシートのセル内改行（Alt+Enter）と、コード内のテンプレート文字列（バッククォート <code> </code> の改行）はどちらも <code>n</code> として扱われますが、Windows環境からコピペしたデータでは <code>rn</code> が混入することがあります。送信されたメールで改行が崩れる場合は、コード冒頭で <code>text.replace(/rn/g, 'n')</code> のように正規化を入れてください。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>TIP: Slack通知と組み合わせる</strong><br>送信完了時にSlackへ自動通知すると、運用効率がさらに上がります。SlackのIncoming Webhookを使った通知方法は、<a href="https://mashukabu.com/google-form-gas-auto-aggregate/">GoogleフォームとGAS連携記事</a>のレシピ2で詳しく解説しています。一括送信の最後に流用できるので、合わせて確認してください。</p></blockquote>



<h2 class="wp-block-heading"><span id="toc24">まとめ｜スプレッドシート×GASでメール送信業務を一気に効率化する</span></h2>



<p class="wp-block-paragraph">スプレッドシートからGmailを一括送信するGASの仕組みを、3パターンのコピペコード（基本／HTMLメール／添付ファイル付き）と実務Tipsで解説しました。重要なポイントを最後にもう一度まとめます。</p>



<ul class="wp-block-list"><li>スプレッドシートに「メール／名前／会社／件名／ステータス」の5列を用意する</li><li>本文に <code>{{name}}</code> 等のプレースホルダーを書き、<code>replace()</code> で差し込み置換する</li><li>必ず <code>TEST_MODE = true</code> で自分宛に動作確認してから本番実行する</li><li>Gmail送信上限は無料100通／日、Workspace 1,500通／日。<code>getRemainingDailyQuota()</code> で事前チェック</li><li>送信ステータス列で重複送信を防ぎ、try-catchでエラー行を記録する</li><li>HTMLメール・添付ファイルも <code>options</code> 引数で柔軟に対応できる</li><li>BCC一斉送信は宛名差し込みできず、TO欄に入れた誤送信で個人情報漏洩リスクあり</li><li>送信履歴・差し込み・添付ファイル個別変更が必要ならGAS差し込み送信が最適</li></ul>



<p class="wp-block-paragraph">これで、Word差し込み印刷のメール版が無料で実現できます。GAS自動化シリーズ3部作の最終回として、ぜひ業務に取り入れてみてください。</p>



<p class="wp-block-paragraph">シリーズ全体を読み返したい方は、入門の<a href="https://mashukabu.com/spreadsheet-gas-getting-started-recipes/">GAS入門｜スプレッドシート自動化レシピ5選</a>、続編の<a href="https://mashukabu.com/google-form-gas-auto-aggregate/">Googleフォーム×GASで回答を自動通知・集計する方法</a>も合わせてご覧ください。3記事を組み合わせれば、データ収集（フォーム）→ 自動集計（スプレッドシート＋GAS）→ メール送信（一括差し込み）という業務自動化の基本パターンがすべて押さえられます。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mashukabu.com/spreadsheet-gmail-batch-send-gas/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>GASのトリガーでスプレッドシートの集計・通知を自動化する方法｜時間指定・フォーム送信を起点に動かす</title>
		<link>https://mashukabu.com/gas-trigger-automation/</link>
					<comments>https://mashukabu.com/gas-trigger-automation/#respond</comments>
		
		<dc:creator><![CDATA[まっしゅ]]></dc:creator>
		<pubDate>Fri, 12 Jun 2026 21:57:41 +0000</pubDate>
				<category><![CDATA[Googleスプレッドシート]]></category>
		<category><![CDATA[GAS]]></category>
		<category><![CDATA[Google Apps Script]]></category>
		<category><![CDATA[スプレッドシート]]></category>
		<category><![CDATA[トリガー]]></category>
		<category><![CDATA[メール自動化]]></category>
		<category><![CDATA[時間指定]]></category>
		<category><![CDATA[自動化]]></category>
		<guid isPermaLink="false">https://mashukabu.com/?p=7969</guid>

					<description><![CDATA[GASのトリガーを使えば、スプレッドシートの集計やメール通知を自動実行できます。時間主導型トリガーで毎朝9時に売上集計をGmail送信、フォーム送信時トリガーで回答を即通知する2つの実務シナリオを、コピペで動く完成コード付きで解説します。トリガーが動かないときの対処法も網羅。]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">「毎朝、出社したらまず昨日の売上を集計してメールで共有する」「フォームに回答が来ても、誰かが気づくまで放置されてしまう」——スプレッドシートで業務を回していると、こうした定型作業に時間を取られますよね。</p>



<p class="wp-block-paragraph">この記事では、Google Apps Script（GAS）の<strong>トリガー</strong>を使って、スプレッドシートの集計やメール通知を「自分が何もしなくても自動で動く」状態にする方法を解説します。トリガーとは、決まった時刻やユーザーの操作を引き金に、指定した関数を自動実行する仕組みのことです。</p>



<p class="wp-block-paragraph">GASの基本的な書き方や実行ボタンの押し方は、シリーズ1本目で丁寧に解説しています。GASに初めて触る方は、先にこちらを読むとつまずきにくいですよ。</p>



<p class="wp-block-paragraph"><a href="https://mashukabu.com/spreadsheet-gas-getting-started-recipes/">GAS入門｜コピペで動くスプレッドシート自動化レシピ5選</a></p>



<p class="wp-block-paragraph">なお、この記事で紹介する「毎朝9時に自動集計」「フォーム回答で自動通知」は、Microsoft の Power Automate でやるような自動化を、Google Workspace の無料環境で実現するイメージです。Microsoft 365 を使えない環境でも、GASのトリガーがあれば同じことができます。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-2" checked><label class="toc-title" for="toc-checkbox-2">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">GASのトリガーとは？｜手動実行から自動実行への第一歩</a><ol><li><a href="#toc2" tabindex="0">シンプルトリガーとインストーラブルトリガーの違い</a></li></ol></li><li><a href="#toc3" tabindex="0">GASのトリガーの種類と使い分け｜時間主導型とイベント型</a><ol><li><a href="#toc4" tabindex="0">時間主導型トリガーで指定できる間隔</a></li><li><a href="#toc5" tabindex="0">イベント型トリガーで反応できる操作</a></li></ol></li><li><a href="#toc6" tabindex="0">GASのトリガーを設定する手順｜スクリプトエディタからの操作</a></li><li><a href="#toc7" tabindex="0">【シナリオA】毎朝9時に前日の売上を集計してGmailに自動送信</a><ol><li><a href="#toc8" tabindex="0">前提となるスプレッドシートの形</a></li><li><a href="#toc9" tabindex="0">コピペで動くサンプルコード</a></li><li><a href="#toc10" tabindex="0">コードのポイント解説</a></li><li><a href="#toc11" tabindex="0">時間主導型トリガーを設定する</a></li></ol></li><li><a href="#toc12" tabindex="0">【シナリオB】フォーム回答があったら担当者にメール通知</a><ol><li><a href="#toc13" tabindex="0">フォーム送信時トリガーが使えるスプレッドシート</a></li><li><a href="#toc14" tabindex="0">コピペで動くサンプルコード</a></li><li><a href="#toc15" tabindex="0">コードのポイント解説</a></li><li><a href="#toc16" tabindex="0">フォーム送信時トリガーを設定する</a></li></ol></li><li><a href="#toc17" tabindex="0">GASのトリガーが動かない・二重実行するときの対処法</a><ol><li><a href="#toc18" tabindex="0">トリガーが動かないとき</a></li><li><a href="#toc19" tabindex="0">メールが2通来る・処理が二重に走るとき</a></li><li><a href="#toc20" tabindex="0">実行回数・時間の上限に注意</a></li><li><a href="#toc21" tabindex="0">トリガーは作成した本人の権限で動く</a></li></ol></li><li><a href="#toc22" tabindex="0">まとめ｜GASのトリガーで定型業務を自動化しよう</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">GASのトリガーとは？｜手動実行から自動実行への第一歩</span></h2>



<p class="wp-block-paragraph">GASのトリガーとは、<strong>「ある条件（時刻や操作）をきっかけに、指定した関数を自動で実行する仕組み」</strong>です。</p>



<p class="wp-block-paragraph">通常、スプレッドシートで書いたGASのコードは、スクリプトエディタの「実行」ボタンを押さないと動きません。これが手動実行です。便利な処理を書いても、自分でボタンを押し続けるなら手作業とあまり変わりませんよね。</p>



<p class="wp-block-paragraph">ここでトリガーの出番です。「毎朝9時になったら」「フォームに回答が届いたら」といった条件を設定しておけば、その瞬間に関数が自動で走ります。パソコンを開いていなくても、Googleのサーバー上で勝手に実行してくれるのが大きな特徴です。</p>



<p class="wp-block-paragraph">トリガーで自動実行される関数のことを、この記事では<strong>ハンドラ関数</strong>と呼びます。トリガーが発火したときに呼び出される関数、という意味です。</p>



<figure class="wp-block-table"><table><thead><tr><th>項目</th><th>手動実行</th><th>トリガーによる自動実行</th></tr></thead><tbody><tr><td>実行のきっかけ</td><td>自分で実行ボタンを押す</td><td>時刻・操作などの条件</td></tr><tr><td>パソコンの状態</td><td>開いている必要あり</td><td>閉じていてもGoogleが実行</td></tr><tr><td>向いている用途</td><td>テスト・単発の処理</td><td>定期処理・イベント対応</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">トリガーを覚えると、GASの活用範囲が一気に広がります。「同じ作業を毎日繰り返している」と感じている方ほど、効果を実感しやすいですよ。</p>



<h3 class="wp-block-heading"><span id="toc2">シンプルトリガーとインストーラブルトリガーの違い</span></h3>



<p class="wp-block-paragraph">GASのトリガーには、実は2つの系統があります。最初にここを押さえておくと、後で「なぜか動かない」を避けられます。</p>



<ul class="wp-block-list"><li><strong>シンプルトリガー</strong>: 関数名を <code>onOpen</code> や <code>onEdit</code> のような決まった名前にするだけで、設定なしに自動発火するトリガーです。手軽ですが、メール送信や外部サービスへのアクセスができないという強い制約があります。</li><li><strong>インストーラブルトリガー</strong>: スクリプトエディタの専用画面から設定するトリガーです。権限の承認を経るため、メール送信や定期実行など、制約のある操作も実行できます。</li></ul>



<p class="wp-block-paragraph">この記事で扱う「自動メール送信」「毎朝の定期実行」は、いずれも<strong>インストーラブルトリガーが必須</strong>です。シンプルトリガーの <code>onEdit</code> の中にメール送信を書いても動かないので、ここは混同しないようにしましょう。以降、この記事で単に「トリガー」と書く場合は、インストーラブルトリガーを指します。</p>



<h2 class="wp-block-heading"><span id="toc3">GASのトリガーの種類と使い分け｜時間主導型とイベント型</span></h2>



<p class="wp-block-paragraph">インストーラブルトリガーは、大きく<strong>時間主導型</strong>と<strong>イベント型</strong>の2タイプに分かれます。どちらを選ぶかは、「いつ動かしたいか」で決まります。</p>



<figure class="wp-block-table"><table><thead><tr><th>やりたいこと</th><th>選ぶトリガー</th><th>具体例</th></tr></thead><tbody><tr><td>決まった時刻・間隔で動かしたい</td><td>時間主導型</td><td>毎朝9時に集計、1時間おきに同期</td></tr><tr><td>何かが起きたら動かしたい</td><td>イベント型</td><td>フォーム回答時、セル編集時</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">判断はシンプルです。「スケジュールで動かす」なら時間主導型、「きっかけに反応して動かす」ならイベント型と覚えておきましょう。</p>



<h3 class="wp-block-heading"><span id="toc4">時間主導型トリガーで指定できる間隔</span></h3>



<p class="wp-block-paragraph">時間主導型トリガーは、設定画面でかなり細かく実行タイミングを選べます。主な選択肢は次の通りです。</p>



<ul class="wp-block-list"><li>特定の日時（一度だけ実行）</li><li>分ベース（1分・5分・10分・15分・30分おき）</li><li>時間ベース（1〜12時間おき）</li><li>日ベース（毎日。実行する時間帯を選択）</li><li>週ベース（曜日 + 時間帯）</li><li>月ベース（日にち + 時間帯）</li></ul>



<p class="wp-block-paragraph">ここで1つ大事な仕様があります。<strong>時間帯はあくまで「その1時間の枠のどこか」で実行される</strong>という点です。たとえば「午前9時〜10時」を選んでも、きっちり9時00分に動くとは限りません。9時5分や9時40分など、枠内のどこかで実行されます。「1分の誤差も許されない」という用途には向かないので、覚えておくと安心ですよ。</p>



<h3 class="wp-block-heading"><span id="toc5">イベント型トリガーで反応できる操作</span></h3>



<p class="wp-block-paragraph">スプレッドシートやフォームに紐づくイベント型トリガーでは、次のような操作をきっかけにできます。</p>



<ul class="wp-block-list"><li>起動時（スプレッドシートを開いたとき）</li><li>編集時（セルの値が変わったとき）</li><li>変更時（行・列の追加など構造が変わったとき）</li><li>フォーム送信時（リンクされたフォームに回答が届いたとき）</li></ul>



<p class="wp-block-paragraph">この記事では、最も実務ニーズが高い「時間主導型（毎朝の集計）」と「フォーム送信時（回答通知）」の2つを、完成コード付きで実装していきます。</p>



<h2 class="wp-block-heading"><span id="toc6">GASのトリガーを設定する手順｜スクリプトエディタからの操作</span></h2>



<p class="wp-block-paragraph">実際のコードに入る前に、トリガーをどこで設定するのかを押さえておきましょう。トリガーの設定画面は、コードを書く画面とは別の場所にあります。</p>



<p class="wp-block-paragraph">スプレッドシートのメニューから <code>拡張機能</code> → <code>Apps Script</code> でスクリプトエディタを開いたら、次の手順で進みます。</p>



<ol class="wp-block-list"><li>エディタの左側メニューにある<strong>時計のアイコン（トリガー）</strong>をクリック</li><li>画面右下の「<strong>トリガーを追加</strong>」ボタンをクリック</li><li>設定ダイアログで、実行する関数・イベントの種類などを選ぶ</li><li>「保存」をクリック</li><li>初回のみ権限の承認画面が表示されるので、自分のGoogleアカウントで承認する</li></ol>



<p class="wp-block-paragraph">設定ダイアログでは、主に次の項目を選びます。</p>



<figure class="wp-block-table"><table><thead><tr><th>設定項目</th><th>選ぶ内容</th></tr></thead><tbody><tr><td>実行する関数を選択</td><td>自動実行したいハンドラ関数の名前</td></tr><tr><td>実行するデプロイを選択</td><td><code>Head</code>（基本はこのまま）</td></tr><tr><td>イベントのソースを選択</td><td><code>時間主導型</code> または <code>スプレッドシートから</code></td></tr><tr><td>イベントの種類を選択</td><td>ソースに応じて表示される選択肢</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">承認画面で「このアプリはGoogleで確認されていません」という警告が出ますが、自作スクリプトでは正常な挙動です。「詳細」→「（プロジェクト名）に移動（安全ではないページ）」をクリックして、利用する権限を確認のうえ許可してください。権限承認の詳しい流れは入門記事でも解説しています。</p>



<p class="wp-block-paragraph"><a href="https://mashukabu.com/spreadsheet-gas-getting-started-recipes/">GAS入門｜コピペで動くスプレッドシート自動化レシピ5選</a></p>



<p class="wp-block-paragraph">それでは、具体的なシナリオを2つ作っていきましょう。</p>



<h2 class="wp-block-heading"><span id="toc7">【シナリオA】毎朝9時に前日の売上を集計してGmailに自動送信</span></h2>



<p class="wp-block-paragraph">最初のシナリオは、<strong>毎朝9時に前日分の売上を集計し、その結果をGmailで送る</strong>という時間主導型トリガーの実装です。朝イチの「昨日いくら売れた？」を、出社前に自動で用意しておくイメージです。</p>



<h3 class="wp-block-heading"><span id="toc8">前提となるスプレッドシートの形</span></h3>



<p class="wp-block-paragraph">ここでは、次のような売上記録シート（シート名「売上」）を想定します。A列に日付、B列に商品名、C列に金額が入っている形です。</p>



<figure class="wp-block-table"><table><thead><tr><th>日付</th><th>商品名</th><th>金額</th></tr></thead><tbody><tr><td>2026/05/26</td><td>商品A</td><td>12000</td></tr><tr><td>2026/05/26</td><td>商品B</td><td>8000</td></tr><tr><td>2026/05/27</td><td>商品A</td><td>5000</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">1行目はヘッダー、2行目以降が明細です。この中から「前日の日付」に一致する行だけを集めて、合計を出します。</p>



<h3 class="wp-block-heading"><span id="toc9">コピペで動くサンプルコード</span></h3>



<p class="wp-block-paragraph">スクリプトエディタに以下を貼り付けて、<code>'your-address@example.com'</code> を自分の通知先メールアドレスに、<code>'売上'</code> を実際のシート名に書き換えてください。</p>



<pre class="wp-block-code"><code>// --- シナリオA: 前日分の売上を集計してGmailで送信 ---
function dailySalesReport() {
  try {
    // --- 設定（自分の環境に合わせて書き換える） ---
    const toAddress = 'your-address@example.com';
    const sheetName = '売上';

    // --- 前日の日付を求める ---
    const yesterday = new Date();
    yesterday.setDate(yesterday.getDate() - 1);
    const targetDateStr = Utilities.formatDate(
      yesterday,
      'Asia/Tokyo',
      'yyyy/MM/dd'
    );

    // --- シートのデータを2次元配列で取得 ---
    const sheet = SpreadsheetApp
      .getActiveSpreadsheet()
      .getSheetByName(sheetName);
    const values = sheet.getDataRange().getValues();

    // --- 前日分だけ合計する（1行目ヘッダーはスキップ） ---
    let total = 0;
    let count = 0;
    for (let i = 1; i &lt; values.length; i++) {
      const cellDate = values[i][0]; // A列: 日付
      const amount = values[i][2];   // C列: 金額
      if (!(cellDate instanceof Date)) continue;
      const rowDateStr = Utilities.formatDate(
        cellDate,
        'Asia/Tokyo',
        'yyyy/MM/dd'
      );
      if (rowDateStr === targetDateStr) {
        total += Number(amount);
        count++;
      }
    }

    // --- メール本文を組み立てて送信 ---
    const subject = '[日報] ' + targetDateStr + ' の売上集計';
    const body =
      targetDateStr + ' の売上をお知らせします。nn' +
      '件数: ' + count + ' 件n' +
      '合計金額: ' + total.toLocaleString() + ' 円';
    GmailApp.sendEmail(toAddress, subject, body);
  } catch (err) {
    // --- エラー時はログに残す ---
    console.log('日報送信エラー: ' + err.message);
  }
}</code></pre>



<h3 class="wp-block-heading"><span id="toc10">コードのポイント解説</span></h3>



<p class="wp-block-paragraph">ポイントを順番に見ていきましょう。</p>



<ul class="wp-block-list"><li><strong><code>new Date()</code> と <code>setDate(...)</code></strong>: 今日の日付から1日引いて前日を求めています。<code>setDate(getDate() - 1)</code> は月初でも正しく前月末に戻るので、月またぎを気にする必要はありません</li><li><strong><code>Utilities.formatDate(...)</code></strong>: 日付を <code>yyyy/MM/dd</code> の文字列にそろえる関数です。タイムゾーンに <code>'Asia/Tokyo'</code> を指定して、日本時間でずれないようにしています</li><li><strong><code>getDataRange().getValues()</code></strong>: シートの入力済み範囲をまとめて2次元配列で取り出します。1行ずつ読むより高速で、GASの定番パターンです</li><li><strong><code>if (!(cellDate instanceof Date)) continue;</code></strong>: 日付セルが空欄や文字列だった場合に備えて、日付型でない行は飛ばしています</li><li><strong><code>try/catch</code></strong>: トリガー実行中にエラーが出ても、処理を安全に終わらせるためのガードです</li></ul>



<p class="wp-block-paragraph">このコードを保存したら、まず手動で1回実行してみましょう。前日分の売上が入っていれば、自分宛にメールが届くはずです。動作を確認できたら、いよいよトリガーを設定します。</p>



<h3 class="wp-block-heading"><span id="toc11">時間主導型トリガーを設定する</span></h3>



<p class="wp-block-paragraph">先ほどの手順でトリガー画面を開き、「トリガーを追加」から次のように設定します。</p>



<ol class="wp-block-list"><li>実行する関数: <code>dailySalesReport</code></li><li>イベントのソース: <code>時間主導型</code></li><li>時間ベースのトリガーのタイプ: <code>日付ベースのタイマー</code></li><li>時刻: <code>午前9時〜10時</code></li><li>「保存」をクリック</li></ol>



<p class="wp-block-paragraph">これで、毎朝9時台に前日の売上集計メールが自動で届くようになります。前述の通り、実行は「9時〜10時の枠内のどこか」で行われる点だけ覚えておきましょう。</p>



<p class="wp-block-paragraph">なお、メールの本文をもっと作り込みたい場合は、HTML形式での送信や商品別の内訳追加なども可能です。差し込みメールのテクニックは、こちらの記事が参考になりますよ。</p>



<p class="wp-block-paragraph"><a href="https://mashukabu.com/spreadsheet-gmail-batch-send-gas/">スプレッドシートからGmailを一括送信する方法｜GASで差し込みメールを自動化</a></p>



<h2 class="wp-block-heading"><span id="toc12">【シナリオB】フォーム回答があったら担当者にメール通知</span></h2>



<p class="wp-block-paragraph">次は、<strong>Googleフォームに回答が届いた瞬間に、担当者へメールで通知する</strong>というフォーム送信時トリガーの実装です。問い合わせや申込フォームの「気づかず放置」をなくせます。</p>



<h3 class="wp-block-heading"><span id="toc13">フォーム送信時トリガーが使えるスプレッドシート</span></h3>



<p class="wp-block-paragraph">フォーム送信時トリガーを使うには、<strong>フォームの回答が流れ込むスプレッドシート</strong>が起点になります。フォーム編集画面の「回答」タブから「スプレッドシートにリンク」しておくと、回答のたびにスプレッドシートへ行が追加されます。</p>



<p class="wp-block-paragraph">このリンク先スプレッドシートで <code>拡張機能</code> → <code>Apps Script</code> を開いて、コードを書いていきます。フォーム連携の基本をもっと詳しく知りたい方は、こちらの記事もあわせてどうぞ。</p>



<p class="wp-block-paragraph"><a href="https://mashukabu.com/google-form-gas-auto-aggregate/">Googleフォーム×GASで回答を自動通知・集計する方法｜コピペで動く3レシピ</a></p>



<h3 class="wp-block-heading"><span id="toc14">コピペで動くサンプルコード</span></h3>



<p class="wp-block-paragraph">回答先スプレッドシートのスクリプトエディタに、以下を貼り付けます。<code>'tantou@example.com'</code> を担当者のメールアドレスに書き換えてください。</p>



<pre class="wp-block-code"><code>// --- シナリオB: フォーム回答を担当者にメール通知 ---
function notifyOnFormSubmit(e) {
  try {
    // --- 通知先（担当者のアドレスに書き換える） ---
    const toAddress = 'tantou@example.com';

    // --- 質問名をキーにした回答オブジェクト ---
    const namedValues = e.namedValues;

    // --- 「質問: 回答」の形に整形して連結 ---
    const body = Object.entries(namedValues)
      .map(function(entry) {
        return entry[0] + ': ' + entry[1].join(', ');
      })
      .join('n');

    // --- メールを送信 ---
    const subject = '[フォーム] 新しい回答が届きました';
    GmailApp.sendEmail(toAddress, subject, body);
  } catch (err) {
    console.log('フォーム通知エラー: ' + err.message);
  }
}</code></pre>



<h3 class="wp-block-heading"><span id="toc15">コードのポイント解説</span></h3>



<p class="wp-block-paragraph">フォーム送信時トリガーでは、ハンドラ関数が<strong>イベントオブジェクト</strong>を受け取れます。引数の <code>e</code> がそれで、トリガー発火時に「どんな回答が来たか」という情報が自動で渡されます。</p>



<ul class="wp-block-list"><li><strong><code>e.namedValues</code></strong>: イベントオブジェクト <code>e</code> が持つプロパティで、<strong>質問テキストをキー、回答を配列値とするオブジェクト</strong>です。列の順番に依存しないため、後から質問を追加・並び替えしても壊れにくくなります</li><li><strong><code>entry[1].join(', ')</code></strong>: チェックボックスなど複数回答の場合に備えて、回答をカンマ区切りで結合しています</li><li><strong><code>try/catch</code></strong>: エラー時もトリガーを安全に終わらせるためのガードです</li></ul>



<h3 class="wp-block-heading"><span id="toc16">フォーム送信時トリガーを設定する</span></h3>



<p class="wp-block-paragraph">コードを保存したら、トリガー画面で次のように設定します。</p>



<ol class="wp-block-list"><li>実行する関数: <code>notifyOnFormSubmit</code></li><li>イベントのソース: <code>スプレッドシートから</code></li><li>イベントの種類: <code>フォーム送信時</code></li><li>「保存」をクリック</li></ol>



<p class="wp-block-paragraph">設定できたら、テスト用にフォームを1件送信してみましょう。担当者のメールアドレスに通知が届けば成功です。これで「回答が来たのに誰も気づかない」状態から抜け出せますよ。</p>



<h2 class="wp-block-heading"><span id="toc17">GASのトリガーが動かない・二重実行するときの対処法</span></h2>



<p class="wp-block-paragraph">トリガーは便利な反面、「設定したのに動かない」「メールが2通来る」といったトラブルも起きがちです。よくあるパターンと対処法をまとめておきます。</p>



<h3 class="wp-block-heading"><span id="toc18">トリガーが動かないとき</span></h3>



<p class="wp-block-paragraph">まず確認したいのは、<strong>実行ログ</strong>です。スクリプトエディタ左メニューの「実行数」をクリックすると、トリガーが実際に走ったかどうかと、その結果（完了・失敗）を確認できます。ステータスが「失敗」になっていれば、クリックしてエラー内容を見てみましょう。</p>



<p class="wp-block-paragraph">動かないときに多い原因は次の通りです。</p>



<ul class="wp-block-list"><li><strong>シンプルトリガーでメール送信を書いている</strong>: <code>onEdit</code> などのシンプルトリガーではメール送信ができません。インストーラブルトリガーに設定し直す必要があります</li><li><strong>関数名やシート名のタイプミス</strong>: コード内の <code>getSheetByName('売上')</code> のシート名が、実際のシート名と1文字でも違うと動きません</li><li><strong>権限承認が完了していない</strong>: 初回の承認画面を途中で閉じてしまうと、トリガーは設定されても実行時に止まります</li></ul>



<p class="wp-block-paragraph">なお、インストーラブルトリガーで起動した関数がエラーになると、Googleからトリガー所有者宛に<strong>エラー通知メール</strong>が自動で届きます。<code>try/catch</code> でエラーを完全に握りつぶすと、この通知も来なくなり「気づかないうちに止まっている」状態になりやすいので、開発中は <code>console.log</code> でログを残しておくと安心です。</p>



<h3 class="wp-block-heading"><span id="toc19">メールが2通来る・処理が二重に走るとき</span></h3>



<p class="wp-block-paragraph">同じ処理が2回実行される場合、<strong>トリガーを重複して登録している</strong>のが原因のほとんどです。</p>



<p class="wp-block-paragraph">トリガー画面で「トリガーを追加」を何度も押すと、同じ関数に複数のトリガーがぶら下がります。すると1回のイベントで関数が2回・3回と実行され、メールも同じ数だけ届いてしまいます。トリガー一覧を開いて、不要なトリガーは行末のメニューから削除しましょう。</p>



<h3 class="wp-block-heading"><span id="toc20">実行回数・時間の上限に注意</span></h3>



<p class="wp-block-paragraph">GASには<strong>割り当て（quota）</strong>という1日あたりの上限があります。個人のGoogleアカウント（@gmail.com）の主な上限は次の通りです。</p>



<figure class="wp-block-table"><table><thead><tr><th>項目</th><th>個人アカウントの上限</th></tr></thead><tbody><tr><td>メール送信数（GmailApp）</td><td>1日 100通</td></tr><tr><td>スクリプト1回の実行時間</td><td>最大 6分</td></tr><tr><td>トリガーの合計実行時間</td><td>1日 90分</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">「毎朝1通メールを送る」程度なら、この上限にはまったく届きません。ただし「1分おきのトリガーで毎回メールを送る」といった設計だと、あっという間に上限に達してしまいます。トリガーの頻度は、本当に必要な間隔だけにしておきましょう。</p>



<h3 class="wp-block-heading"><span id="toc21">トリガーは作成した本人の権限で動く</span></h3>



<p class="wp-block-paragraph">もう1つ知っておきたいのが、<strong>トリガーは設定した本人のアカウント権限で実行される</strong>という点です。スプレッドシートをチームで共有していても、トリガーは作成者として動き、メールは作成者のGmailから送られます。割り当て（1日100通など）も作成者のものが消費されます。チームで運用する場合は、誰のアカウントでトリガーを設定したかを把握しておくと、トラブルを避けられますよ。</p>



<h2 class="wp-block-heading"><span id="toc22">まとめ｜GASのトリガーで定型業務を自動化しよう</span></h2>



<p class="wp-block-paragraph">GASのトリガーを使えば、これまで手作業で繰り返していた集計や通知を、自分が何もしなくても自動で動かせます。最後に要点を整理しておきます。</p>



<ul class="wp-block-list"><li><strong>トリガーには時間主導型とイベント型がある</strong>: スケジュールで動かすなら時間主導型、操作をきっかけに動かすならイベント型</li><li><strong>メール送信や定期実行はインストーラブルトリガーが必須</strong>: シンプルトリガー（onEditなど）ではメール送信ができない</li><li><strong>時間主導型は「枠内のどこか」で実行される</strong>: 9時〜10時を指定しても9時00分ぴったりではない</li><li><strong>動かないときは実行ログ、二重実行は重複トリガーを疑う</strong>: まずは「実行数」画面を確認する</li><li><strong>割り当て（1日100通など）に注意</strong>: 高頻度トリガーは上限に届きやすい</li></ul>



<p class="wp-block-paragraph">「毎朝9時の自動集計」と「フォーム回答の自動通知」が動かせるようになれば、GASの自動化はぐっと実用的になります。今日紹介したコードはコピペで動くので、ぜひ自分の業務に合わせて書き換えて試してみてください。</p>



<p class="wp-block-paragraph">GASの基礎を固め直したい方や、フォーム・メール連携をさらに掘り下げたい方は、シリーズの関連記事もあわせてどうぞ。</p>



<ul class="wp-block-list"><li><a href="https://mashukabu.com/spreadsheet-gas-getting-started-recipes/">GAS入門｜コピペで動くスプレッドシート自動化レシピ5選</a></li><li><a href="https://mashukabu.com/google-form-gas-auto-aggregate/">Googleフォーム×GASで回答を自動通知・集計する方法｜コピペで動く3レシピ</a></li><li><a href="https://mashukabu.com/spreadsheet-gmail-batch-send-gas/">スプレッドシートからGmailを一括送信する方法｜GASで差し込みメールを自動化</a></li></ul>
]]></content:encoded>
					
					<wfw:commentRss>https://mashukabu.com/gas-trigger-automation/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
