Gmail差し込みメールで宛名が「様」だけになる原因とスプレッドシートでの直し方
Gmailの差し込みメールをスプレッドシートから送ったときに、本文の冒頭が「 様」「 さん、」のように名前が抜けた状態で届いてしまう。この原因は、ほぼ例外なく差し込みツールではなくスプレッドシート側のデータにあります。セルが空、スペースだけが入っている、人名の代わりに会社名が入っている、といった行は、その内容がそのままテンプレートに貼り付けられます。対処法は、元の氏名列を直接差し込むのをやめて、空欄のときに「ご担当者」などの代替文字列を返す補助列を作り、そちらを差し込むことです。数式は一つで済みます。=IF(TRIM(A2)="","ご担当者",TRIM(A2))。この記事では、問題のある行の見つけ方、補助列の作り方、よくあるバリエーション(姓名が1セルに入っている、「様」が二重になる、日付が数字で出る)への対応、そして送信前に必ずやっておきたい短いチェックを順に説明します。
Gmailの差し込みメールで「 様」と送られてしまう理由
差し込みメール(メールマージ)の仕組みは、単純な置き換えです。ツールはスプレッドシートの1行を読み、下書きの中の差し込みタグを対応する列の値に置き換えて送信します。ツールは「氏名」列に人の名前が入っているはずだとは理解していませんし、セルが空だったときにどうすべきかという判断も持っていません。Google Workspaceに組み込まれている差し込みメール機能でも、ネットで見つけたApps Scriptでも、スプレッドシートのアドオンでも、Google スプレッドシートのURLから差し込みを行うZestmailのようなChrome拡張機能でも、基本的にはセルの中身がそのまま入ります。セルに何もなければ何も入らず、タグの後ろに書いた「様」や読点だけが取り残されます。
空セルは最も分かりやすいケースにすぎません。同じ仕組みで次のような問題も起こります。
- スペースだけが入ったセル。 見た目は空ですが空ではないため、代替値を設定できるツールでも空欄として扱われないことがあります。結果は「 様」のように空白が二重になります。日本語のデータでは全角スペース「 」が紛れ込んでいることも多く、これは通常の
TRIMでは除去されません。 - 姓名が1つのセルに入っている。 「田中 太郎様」のように、CRMや申込フォームの「お名前」欄が1つだったためにフルネームがそのまま入るケースです。
- すでに「様」や「さん」が付いている。 「田中様」というセルを「{{氏名}}様」というテンプレートに差し込むと「田中様様」になります。
- 元システムのダミー値。 「不明」「N/A」「-」「テスト」などがそのまま名前として差し込まれます。
- 会社名が入っている。 info@やcontact@のような代表アドレスをリストに追加した際、氏名欄に会社名を入れたケースです。
- 日付や金額が生の値で出る。 「{{期限}}までにご返信ください」が「46325までにご返信ください」になります。Google スプレッドシートは日付をシリアル値(通し番号)で保存しているためです。
これらはすべてデータの問題なので、データのある場所、つまりスプレッドシートで直すのが最も確実です。シートを直しておけば、どのツールから差し込んでも正しく動きますし、送る前に実際の文面を目で確認できます。
問題になる行を見つける
数式を書く前に、どれくらいの行が影響を受けるか把握しておきます。Google スプレッドシートでの簡単な方法を3つ紹介します。
- 空白セルを数える。 空いているセルに
=COUNTBLANK(A2:A)と入力します(Aは氏名列に置き換えてください)。これが0なのに「 様」が出ている場合は、真の空白ではなくスペース入りのセルがある可能性が高いです。=COUNTIF(A2:A," ")と=COUNTIF(A2:A," ")(全角スペース)も試してください。 - フィルタで値の一覧を見る。 見出し行を選択し、データ › フィルタを作成を選び、氏名列のフィルタアイコンをクリックして値の一覧を確認します。空白は一番上に「(空白)」として表示されます。「不明」「-」、1文字だけの値、会社名などがないか一覧をスクロールして確認します。
- 怪しい行にフラグを立てる。 新しい列に
=IF(OR(TRIM(A2)="",LEN(TRIM(A2))<2,ISNUMBER(SEARCH(" ",TRIM(A2))),ISNUMBER(SEARCH(" ",A2))),"要確認","")と入力します。名前が空、1文字しかない、半角または全角スペースを含む(姓名がまとめて入っている可能性が高い)行に「要確認」が付きます。この列で並べ替え、「要確認」の行を目で確認してください。
数百行程度のリストなら、この目視確認は5分ほどで終わります。「佐藤部長」が氏名欄に入っているようなケースは、数式では拾えないので人の目が必要です。
スプレッドシートにフォールバック列を作る
元の列を上書きしないでください。新しい列を追加し、分かりやすい名前(例:宛名)を付けて、そちらを差し込みに使います。元データを残しておけば、代替文字列の文言を後から変えたくなっても情報を失わずに済みます。
基本のフォールバック
新しい列の最初のデータ行に次のように入力します。
=IF(TRIM(A2)="","ご担当者",TRIM(A2))
TRIMは前後の半角スペースを取り除くので、半角スペースだけのセルは空として扱われます。結果が空なら「ご担当者」を返し、そうでなければ整形した名前を返します。全角スペースも除去したい場合は、TRIM(SUBSTITUTE(A2," "," "))のように先に全角を半角に置き換えてからTRIMにかけます。数式は下へドラッグするか、最初のセルに=ARRAYFORMULA(IF(TRIM(A2:A)="","ご担当者",TRIM(A2:A)))と入力して列全体を一度に埋めます。
テンプレート側を「{{宛名}}様」としておけば、名前があれば「田中様」、なければ「ご担当者様」となり、どちらも自然な日本語のビジネスメールとして読めます。「ご担当者様」は相手の名前を知っているふりをしない、無難な選択です。文脈によっては「お客様」「会員の皆様」、あるいは別の列にある会社名を使う方法もあります。
敬称まで数式に含める
名前がないときに「ご担当者様」ではなく、宛名行そのものを変えたい場合は、敬称と改行後の挨拶までシート側に持たせます。
=IF(TRIM(A2)="","お世話になっております。","株式会社"&TRIM(C2)&" "&TRIM(A2)&"様"&CHAR(10)&"お世話になっております。")
テンプレートの冒頭は{{宛名}}だけにします。こうするとテンプレートには「列に何が入っているか」という前提が一切含まれず、余計な敬称や句読点が残る心配がありません。最も壊れにくい方法です。
ダミー値を空扱いにする
よくあるダミー値を空として扱うように条件を広げます。
=IF(OR(TRIM(A2)="",TRIM(A2)="不明",LOWER(TRIM(A2))="n/a",TRIM(A2)="-",TRIM(A2)="テスト"),"ご担当者",TRIM(A2))
お使いの元システムが出力する値に合わせて追加してください。
「様」の二重付けを防ぐ
セルにすでに「様」や「さん」が付いている場合、テンプレート側の敬称と重なります。数式で末尾の敬称を取り除いてから差し込みます。
=REGEXREPLACE(TRIM(A2),"(様|さん|殿)$","")
これをフォールバックの数式の中に入れるか、別の補助列に置いてそちらを参照します。なお「大様」のように名前自体が「様」で終わる珍しいケースは誤って削られるので、要確認列と合わせて目で見ておきます。
姓名を分ける
セルに「田中 太郎」と入っていて、ビジネスメールの慣習どおり姓だけで「田中様」としたい場合は次のようにします。
=IF(TRIM(B2)="","ご担当者",REGEXEXTRACT(TRIM(SUBSTITUTE(B2," "," ")),"^\S+"))
REGEXEXTRACTの^\S+は最初のスペースまでの文字列を返します。スペースがない単語ならそのまま全体を返します。日本人の氏名は姓が先なのでこれで姓が取れますが、「John Smith」のように名が先に来る欧米の名前では名が返ります。英語圏の顧客が混ざっているリストや、「Dr.」「Mr.」などの肩書きで始まる値は、数式では判断できないので前の節の目視確認が引き続き重要です。
日付と金額
多くの差し込みツールは、セルに表示されている書式ではなく内部の値を受け取ります。安全のため、文字列に明示的に変換しておきます。
=TEXT(D2,"yyyy年m月d日") → 2026年10月24日
=TEXT(E2,"#,##0")&"円" → 1,250円
差し込みにはこの文字列列を使います。日付が空の可能性があるなら=IF(D2="","近日中",TEXT(D2,"yyyy年m月d日"))のようにフォールバックと組み合わせます。
条件付きの文章
フォールバックは宛名だけのものではありません。会社名がある行とない行が混ざっている場合は、文章ごとシートで組み立てます。
=IF(TRIM(C2)="","先日はご登録いただきありがとうございます。",TRIM(C2)&"様にて先日ご登録いただき、ありがとうございます。")
テンプレートには{{冒頭文}}とだけ書けば、全員に自然な文が届きます。ツールの設定の中に隠れるのではなく、ロジックが一か所にまとまって目に見えるのが利点です。
送信前の3つのチェック
データを直せば大部分は解決しますが、残りを次のチェックで拾います。
- フォールバック列で並べ替える。
宛名列の見出しをクリックして昇順に並べ替えます。「ご担当者」の行がまとまるので、本当に使える名前がないか確認します。次に降順にして上の方に記号や数字で始まる値などおかしなものがないか見ます。行の順番が重要なら、確認後に元に戻してください。 - 1行ではなく3行プレビューする。 多くのツールは1行目のプレビューしか表示しません。1行目はたいてい問題のないきれいな行です。名前が空の行、姓名がまとめて入った行、日付のある行を一時的にシートの先頭に移動してそれぞれプレビューし、確認後に戻します。プレビューする行を選べるツールなら、その機能を使ってください。
- 自分宛にテスト送信する。 シートの先頭に自分のアドレス(または
[email protected]のようなGmailのエイリアス)で2〜3行追加し、通常の名前、空の名前、日付入りをそれぞれ用意します。その行だけで差し込みを実行し、Gmailで開いて、パソコンだけでなくスマートフォンでも読みます。問題なければテスト行を削除して本番を送ります。
Google Workspaceの差し込みメール、Apps Script、アドオンのいずれを使っていても、このチェックは同じように有効です。仕事をしているのはシートで、ツールはそれを読んでいるだけだからです。
拡張機能を使う場合
ZestmailはGmail用のChrome拡張機能で、Google スプレッドシートのURLからの差し込み送信ができるため、上で説明した補助列の方法がそのまま使えます。宛名列を作り、シートのURLを貼り付け、下書きでその列を指定するだけです。スクリプトではなくこちらを選ぶ理由があるとすれば、主に送信後の部分です。ZestmailはGmailに開封確認(開封トラッキング)を追加し、各受信者がメールを開いたかどうか、いつ開いたかを表示します。自分自身の開封と一般的なボットによる開封は除外されるので、自分宛のテスト送信が結果を汚しません。これにより、たとえば「ご担当者様」で送った行と名前入りで送った行で開封の傾向に差があるかを比べられ、名前を集める手間をどこまでかけるべきかの判断材料になります。ただし開封確認は正確な数字にはなりません。画像のブロックやApple Mail Privacy Protectionのようなプライバシー保護の仕組みで、一部の開封は検出できないため、件数ではなく傾向として見てください。無料プランは1日20通まで使え、送信メールには小さな「Sent with Zestmail」というフッターが付きます。Proプランは月額9ドルまたは年額69ドルでこの制限がなくなり、7日間の無料トライアルがあります。なお、拡張機能とウェブサイトは英語のみです。差し込みをたまにしか使わず、誰が開封したかを知る必要もないなら、Googleの標準機能で十分で、費用もかかりません。
リストをきれいに保つ
名前が空欄になる問題は、新しいエクスポートデータをシートに貼り付けるたびに再発します。次の2つの習慣で防げます。
- 入力元で氏名を必須にする。 Google フォームやウェブサイトの申込フォームからリストに追加される場合は、氏名欄を必須にし、「お名前」ではなく「姓」「名」と分けて設けます。「お名前」が1欄だけだと、フルネームが姓の列に入る原因になります。
- 数式入りのテンプレートシートを保存しておく。 補助列だけを残してデータを空にした差し込み用シートのコピーを保存しておきます。新しいリストが来たら生データの列に貼り付けるだけで、フォールバック、敬称の整理、日付変換の数式が自動で埋まります。「要確認」列を見て、送信前の3つのチェックを行い、送信します。
根本のルールは単純です。差し込みメールはセルに入っているものを忠実に送ります。あらゆるケースでセルに何が入っているべきかを決め、その判断を数式に書き、受信者より先に自分で例外を確認しておくことです。