Gmail一斉送信・差し込み送信ツール(スプレッドシート)

Gmailを利用して業務を行う中で、下記のような要望をいただくことがあります。

  • メールを効率よく一斉送信したい
  • 宛名などの一部分だけ差し込みして送信したい
  • 添付ファイルを宛先ごとに変えたい

これらを解決する、一斉送信・差し込み送信ツールを作ってみましたので、公開します。

*このツールを使用したことにより、ご利用者様、または第三者に損害・トラブル等が発生した場合でも、一切の責任を負いません。自己責任の上でのご利用をお願いいたします。

2023.6.25 文字装飾やインライン画像に対応した新バージョンを作成・掲載しました。

ツールの概要

Googleスプレッドシートで作成したツールです。

シートに入力したメールアドレス宛に、メールを一斉送信することができます。
また、メールの内容の一部を、差込印刷のように、宛先ごとに異なる内容にすることができます。

Main シートでは、メールの内容や共通の添付ファイルなどを設定する
宛先リスト シートでは、メールの宛先に加え、メールに差し込むテキストや、宛先別の添付ファイルを設定できる

このように設定すると、一部分だけ内容が異なる(差し込まれている)メールを一斉送信することができます。

ピンク色部分が、差し込まれたテキストや添付ファイル

* Gmailは1日に送信可能な件数などに制限があります。
  大量に送信する予定の場合は、Googleのヘルプ(Gmailの制限GASの制限)をご確認ください。

使い方

ツールを自分用にコピーする

*共有のリクエストをされても対応しません。必ず下記の手順通りに「コピーを作成」してください。

私が公開しているスプレッドシートを開き、コピーを作成します。

ファイル → コピーを作成
この例では、マイドライブにコピーを作成しました

(ファイルを添付したい場合)ファイルのアップロードおよび設定をする

メールにファイルを添付したい場合は、添付ファイルをあらかじめGoogleドライブにアップロードしておく必要があります。
* 添付ファイルは全て同じフォルダに格納してください。

アップロード後、Mainシート最上部の添付ファイル格納フォルダIDに、添付ファイルをアップロードしたフォルダのIDを入力してください。

URLの末尾(folders/ の後)の文字列がフォルダのID
この部分にフォルダIDを入力する

添付ファイルを利用しない場合、フォルダIDは入力不要です。

メールのテンプレート(ひな型)を作る

Mainシートの画面左のメールテンプレート部分に、基となるメールを作成しましょう。

メールテンプレート にメールの内容を入力
発信者Emailあなたのメールアドレス
(エイリアスを設定している人は、そのアドレスでもOK)
発信者名あなたの名前(好きな名前にできます)
メールタイトルメールのタイトル
差し込みテキストを入れることも可能(後述します)
本文メールの本文
差し込みテキストを入れることも可能(後述します)
共通添付ファイル1~3全あて先に送付する添付ファイルのファイル名

メールタイトルと本文には、テキストの差し込みをすることができます。
例えば、「こんにちは、鈴木 太郎様」のように、あて先によって内容を変えたい場合に活用できます。

テキストを差し込む場所に、{{ 顧客名 }}のように、差し込みしたい項目名を波カッコ2つで囲んで入力してください。

イメージがつかみにくい場合は、下図をみていただければわかるかと思います。

メールタイトル・メール本文内に {{ 項目名 }} を入力すると、宛先リストシートに入力したテキストが差し込まれる。

宛先リストを作る

テンプレートができたら、次は、送り先データを宛先リストシートに入力します。

A列宛先メールアドレス送信先のメールアドレス。
半角カンマで区切って複数入力することができます。
B列CCアドレスccに設定するメールアドレス。
半角カンマで区切って複数入力することができます。
C列BCCアドレスbccに設定するメールアドレス。
半角カンマで区切って複数入力することができます。
D~M列差込項目1~10メールタイトル・本文に差し込む内容。
1行目には差し込み項目名(顧客名、日付・・・など自由に。)
2行目には差し込む文字列を入力。
N~P列個別添付ファイル名1~3共通添付ファイル以外のファイルも個別に添付したい場合は、ファイル名を入力。
Q列処理結果入力不要。(一斉送信を実行した際に、その結果が入力されます)

宛先リストを選ぶ

宛先リストシート名のプルダウンで、宛先リストのシート名を選択します。

通常は「宛先リスト」を選択すれば問題ありません。

宛先リストのシート名を変更したい場合や、複数の宛先リストシートを利用したい場合などに活用してください。

送信・下書き作成

ここまでの手順で準備は整いました。

メール送信をクリックすれば、メールが差し込み一斉送信されます。
下書き作成をクリックすると、メールは送信されず、下書きが作成されます。

処理が終了したら、宛先リストシート一番右の処理結果を必ず確認してください。

*初めてこのツールを使う時は、承認作業を行う必要があります。
その手順は、過去の他の記事にまとめていますので、ご参照ください。

参考:過去のバージョン

2022年9月12日まで公開していた旧バージョンはこちらです。
*旧バージョンでは、差し込みの項目名を自由に指定できません。
タイトル・本文に $0 と入力すると、差込 $0 の内容が、$1と入力すると差込 $1の内容が差し込まれます。

参考:GASソースコード

// グローバル定数
const ss = SpreadsheetApp.getActiveSpreadsheet();
const mainSheet = ss.getSheetByName("Main");

// シートオープン時にプルダウンの選択肢をセットする
function onOpen() {
  setRecipientListPulldown();
}

/* ----------------------------------------
  onClickSendEmails
  送信ボタン押下時の処理
------------------------------------------- */
function onClickSendEmails() {
  const answer = Browser.msgBox("メールを一括送信します。よろしいですか。", Browser.Buttons.OK_CANCEL);
  if (answer === "ok") {
    batchProcessEmails("sendEmail");
    Browser.msgBox("処理が完了しました。「処理結果」列を確認してください。");
  }
}

/* ----------------------------------------
  onClickCreateDrafts
  下書きボタン押下時の処理
------------------------------------------- */
function onClickCreateDrafts() {
  const answer = Browser.msgBox("メールの下書きを一括作成します。よろしいですか。", Browser.Buttons.OK_CANCEL);
  if (answer === "ok") {
    batchProcessEmails("createDraft");
    Browser.msgBox("処理が完了しました。「処理結果」列を確認してください。");
  }
}

/* ----------------------------------------
  batchProcessEmails
  宛先シート全行分のメールを処理する
------------------------------------------- */
function batchProcessEmails(action) {
  // Mainシートの入力値を取得
  const inputValues = getInputValues();
  // ログ列(Q列)をクリア
  ss.getSheetByName(inputValues.recipientListName).getRange("Q2:Q").clear();
  // 宛先シートの入力内容を取得
  const targets = getTargets(inputValues.recipientListName);
  // 宛先シートの全行に対して送信(または下書き)を実行
  const logs = [];
  for (const target of targets) { 
      const result = processEmail(inputValues, target, action);
      logs.push([result]);
  }
  // ログ列(Q列)に結果を貼り付け
  ss.getSheetByName(inputValues.recipientListName)
    .getRange(`Q2:Q${logs.length + 1}`)
    .setValues(logs);
}

/* ----------------------------------------
  processEmail
  メールを1件送信または下書き作成する
------------------------------------------- */
function processEmail(inputValues, target, action) {
  try {
    // タイトル・本文に差込を適用
    const replacedMailTitle = getReplacedString(inputValues.mailTitle, target.replaceList);
    const replacedMailBody = getReplacedString(inputValues.mailBody, target.replaceList);

    // 添付ファイルを取得
    const attachements = [
      ...getAttachements(inputValues.attachmentFolderId, inputValues.commonAttachmentNames),
      ...getAttachements(inputValues.attachmentFolderId, target.eachAttachmentNames)
    ]

    // メールオプションの設定
    const options = {};
    if (inputValues.senderEmail) options.from = inputValues.senderEmail;
    if (inputValues.senderName) options.name = inputValues.senderName;
    if (target.cc) options.cc = target.cc;
    if (target.bcc) options.bcc = target.bcc;
    if (attachements.length) options.attachments = attachements;

    // メール送信 or 下書き作成
    if (action === "sendEmail") {
      GmailApp.sendEmail(target.to, replacedMailTitle, replacedMailBody, options);
    } else {
      GmailApp.createDraft(target.to, replacedMailTitle, replacedMailBody, options);
    }
    return "Success";
  } catch(error) {
    return error;
  }
}

/* ----------------------------------------
  getReplacedString
  文字列, 差込リストから差込後のテキストを取得する
------------------------------------------- */
function getReplacedString(string, replaceList) {
  let replacedString = string;
  for (const item of replaceList) {
    const before = new RegExp(`\{\{ *${item.before} *\}\}`, "g");
    replacedString = replacedString.replace(before, item.after);
  }
  return replacedString;
}

/* --------------------------------------
  getInputValues
  mainシートに入力された値を取得する
  --------------------------------------- */
function getInputValues() {
  const inputValues =  {
    attachmentFolderId: mainSheet.getRange("B2").getValue(),    // 添付ファイル格納フォルダID
    senderEmail: mainSheet.getRange("B5").getValue(),           // 発信者Email
    senderName: mainSheet.getRange("B6").getValue(),            // 発信者名
    mailTitle: mainSheet.getRange("B7").getValue(),             // メールタイトル
    mailBody: mainSheet.getRange("B8").getValue(),              // 本文
    commonAttachmentNames: [
      mainSheet.getRange("B9").getValue(),                      // 共通添付ファイル名1
      mainSheet.getRange("B10").getValue(),                     // 共通添付ファイル名2
      mainSheet.getRange("B11").getValue(),                     // 共通添付ファイル名3
    ],
    recipientListName: mainSheet.getRange("B14").getValue(),    // 宛先リストシート名    
  }
  return inputValues;
}

/* ------------------------------------------
  getTargets
  宛先リストシート名から、シートの内容を配列で取得する
  ------------------------------------------- */
function getTargets(recipientListName) {
  const targetsSheet = ss.getSheetByName(recipientListName);
  const sheetData = targetsSheet.getDataRange().getValues();
  const header = sheetData[0];
  const contents = sheetData.slice(1);
  const targets = contents.map((row) => {
    return {
      to: row[0],                               // 宛先メールアドレス
      cc: row[1],                               // ccアドレス
      bcc: row[2],                              // bccアドレス
      replaceList: getReplaceList(header, row), // 置換内容
      eachAttachmentNames: [
        row[13],                                // 個別添付ファイル名1
        row[14],                                // 個別添付ファイル名2
        row[15],                                // 個別添付ファイル名3
      ]
    };
  });
  return targets;
}

// ヘッダー行・値行から、置換前・置換後を格納したオブジェクトの配列を返す
function getReplaceList(header, row) {
  const beforeStrings = header.slice(3, 13);  // 4 - 13列目が差込項目
  const afterStrings = row.slice(3, 13);      // 4 - 13列目が差込項目
  const replaceList = [];
  beforeStrings.forEach((beforeString, index) => {
    if (beforeString) replaceList.push({
      before: beforeString,
      after: afterStrings[index]
    });
  });
  return replaceList;
}

/* -------------------------------------------
  getAttachments
  フォルダID, ファイル名配列からファイル配列を取得する
  -------------------------------------------- */
function getAttachements(folderId, fileNames) {
  const attachements = [];
  fileNames.forEach((fileName) => {
    if (fileName) attachements.push(getAttachement(folderId, fileName));
  })
  return attachements;
}

/* ----------------------------------------
  getAttachment
  フォルダID, ファイル名からファイルを取得する
------------------------------------------- */
function getAttachement(folderId, fileName) {
    const files = DriveApp.getFolderById(folderId).getFilesByName(fileName);
    if (!files.hasNext()) throw Error(`添付ファイル ${fileName} が存在しません。`);
    file = files.next();
    if (files.hasNext()) throw Error(`添付ファイル ${fileName} が複数存在します。`);
    return file;
}

/* -----------------------------------------
  setRecipientListPulldown
  宛先リストシート名のプルダウンに選択肢をセットする
  ------------------------------------------ */
function setRecipientListPulldown() {
  // Mainシート以外のシート名を取得
  const values = ss.getSheets().map((sheet) => {
    const sheetName = sheet.getName();
    return sheetName !== "Main"
      ? sheetName
      : ""
  })
  // 入力規則を作成
  const rule = SpreadsheetApp.newDataValidation().requireValueInList(values).build();
  // MainシートのB14セルにルールを適用
  ss.getSheetByName("Main").getRange("B14").setDataValidation(rule);
}

コメント

  1. つるり より:

    はじめまして!
    最高のツールをありがとうございます。

    送信ではなく下書き保存をするように、GmailApp.createDraftに書き換えたバージョンも作って活用しています。

    1点質問させてください。
    テキストを差し込む変数の$0、$1….のコードが分かりませんでした。
    https://web-breeze.net/gas_sashikomi-gmail/ こちらのページのコードであれば理解できたのですが…。

    と言いますのも、アメリカ向けの作業で金額をメールに記載すルケースが多く、$0などの文字列が変数になっていると、誤変換されてしまいます。

    • ichi3270 より:

      確かに、ドルで金額を示すケースですと使えなくなってしまいますね・・・

      差し込み用の変数を$0、$1・・・ではなく、★1、★2・・・にするという方法はどうでしょう。

      const before = new RegExp("\\$" + index, "g");

      上記の部分を

      const before = new RegExp("★" + index, "g");

      というコードに書き換えてお試しいただければと思います。

      • つるり より:

        いけました!
        変数を指定しているコードがイマイチ分かっていなかったため、明示いただけてすんなり解決しました。

  2. デモメンバー より:

    早速試してみたのですが、少し補足説明をよろしくお願いします。

    すべての送信者に、同じファイルを添付する場合は、メインシート欄にある、共通テンプシートの所に、ファイルを設定するかと思いますが、ファイルを設定の仕方がわかりません。
    以前は、グーグルドライブに添付ファイルを置いておき、そのファイルのリンクをコピーで必要な文字列をコピペして置いていたのですが、その方法では、送信されていませんでした。

    なので、添付ファイルをGoogleドライブの同じフォルダにアップロードして、メインシート欄にある、添付ファイル格納フォルダIDにグーグルドライブの必要な文字列を記入して、先ほどの共通添付シート欄は空欄にしてみたのですが、それでもファイルを添付したメールを送信できませんでした。

    改めて、添付ファイルの補足説明をいただけると助かります。よろしくお願いします。

    • ichi3270 より:

      以前の記事のツールとは使い方が少し変わっていますので、詳細はこの記事をご覧いただければと思います。
      添付ファイルについては、下記3点が要点になります。
      1.添付ファイルをGoogleドライブ上の1つのフォルダに入れてください
      2.ツール右上の「添付ファイル格納フォルダID」にフォルダのIDを入れてください
      3.ツール内の添付ファイルを入力する欄には、IDではなくファイル名を入力してください。

  3. 山脇 より:

    一点質問です。

    メールを送信する際に
    <テストモード>Dataシート●●行目:●●@●●.jpに送信予定のメールを●●@●●.jpにテスト送信します。よろしいですか?
    という文言が出てきて、はいを押すと送信されると思うのですが、
    たとえば50人に一斉送信をする際、上記のポップアップが50回表示され、
    50回はいを押さないと送信されません。(結構時間がかかります。)
    この動作を省く方法はございますか?

    • 山脇 より:

      すみません、もう一点なのですが、
      DataシートのB列、宛先メールアドレスに
      送信先のメールアドレスを入力しても、
      その方にメールが飛ばず自分のメールアドレスがtoになってしまいます。

      • ichi3270 より:

        どちらのご質問も、「テスト送信」モードで実行されているためだと思います。
        「テスト送信」で送信されるメールのイメージを確認できたら、「本番送信」に切り替えて実行してください。

  4. りら より:

    質問になります。
    本文中の文字色・サイズ・太字等を反映させることは可能でしょうか。
    教えて頂けますと幸いです。

    • ichi3270 より:

      ご期待に沿えず申し訳ないのですが、このツールそのままでは文字の書式等を設定することができません。
      Google Apps ScriptでHTMLメールを送信することは可能なようですので、もしツールの修正にチャレンジされる場合はこちらの記事が参考になりそうかと思いました。

  5. k より:

    公開いただいてるツールですとファイルは3つまで添付できますが、それ以上増やすことは出来ますでしょうか。もし可能であればやり方をご教示いただけますと幸いです。

    • ichi3270 より:

      例えば、共通添付ファイルを5つにしたい場合は・・・
      Mainシートの9行目、10行目に共通添付ファイル4、5の入力欄を作る
      ②スクリプトエディタから、下記部分のソースを修正する

      ・修正前

      for ( let row = 6; row <= 8; row++ ){

      ・修正後

      for ( let row = 6; row <= 10; row++ ){

      row = 6; row <= 10 は 6~10行目が添付ファイルの入力欄であることを意味していますので、5つより更に多くする場合は、10の部分の数字を増やしてください。 * 検証せずにコメントしていますので、実施される場合は必ずテスト送信をしてください。

  6. つるり より:

    とても助かっています!
    たまにファイルが添付されないケースがあります。ファイル名が違ったり、格納フォルダIDが間違っていることが原因です。
    一つでもファイル添付がされない場合は、エラーでストップするようには出来ないでしょうか?

    P.S. 送信ボタンに加え、下書き作成ボタンを追加して使用しています。上記のエラーを防ぐこともありますが、メール本文の装飾や、送信前の最終確認に使用しています。

    • ichi3270 より:

      ご指摘ありがとうございます。
      共通添付ファイルの誤り時はストップする仕様だったのですが、個別添付ファイルの誤り時にはそのまま送信されるようになっていました。
      公開しているツールを修正、ブログに掲載しているコードを修正しました。

  7. 岡本 より:

    便利なツールを提供いただきありがとうございます。
    送信を行い、結果をみると毎回Exception: 無効な引数というエラーにより送信失敗してしまいます。

    どのような可能性が考えられるでしょうか?
    送信先数は1400件ほど。Googleworkspaceを使用しているので、ドメインがgmail.com
    ではないです。

  8. yama より:

    とても便利なツールを公開していただきありがとうございます!
    とても助かっています!

    1点質問がありまして、

    添付ファイルのエクセルやワードにも
    変数差し込みすることは可能でしょうか?

    もし可能であればやり方をご教示いただけますと幸いです。

  9. 加賀谷晴美 より:

    至急:
    送信失敗(本番送信):Exception: 1 日にサービス email を実行した回数が多すぎます。
    と出て操作ができません。
    テスト送信した時点でこうなってしまいました。

    どうしたら、直ぐに送信作業が出来ますか?
    送りたい件数は140件、添付なし。

  10. 竜也栗原 より:

    大変分かりやすい説明でした!知識0でも送信までこぎつけました。
    ただ、スパム扱いされて迷惑メールに振り分けられてしまいます…何とか振り分けられない方法を模索中です。

  11. yyy より:

    分かりやすい内容をありがとうございます!
    GASは初めてでしたが、何とか構築することができました。

    1点質問ですが、コードを追加することで
    本文中に画像を埋め込むことは可能でしょうか?

  12. yymma より:

    まさにこれというツールでした!
    何度か使用させていただいて非常に助かっております。

    1点可能か確認お願いしたいのですが、Gmailでの送信予約は出来ますでしょうか?
    お手数ですがご確認いただけると幸いです。

    よろしくお願いいたします。

  13. nryama より:

    とても助かっています。ありがとうございます。
    一つ質問のですが、差し込みを増やしたいのですが、どうしたら追加できますでしょうか。
    教えてください。
    よろしくお願いいたします。

  14. Omangini より:

    シンプルで使いやすいアプリを公開していただき有難うございます。差し込みのセルが一部空欄であっても、NA表示等が出ないのが良いと思いました。

    試しに自分宛に送ってみて気づいた点を共有させてください。
    1)Sashikomi Gmail Toolを2つ以上開かないこと:メールが送信されません。複数のフォームのために、複数のファイルを作成することがあると思いますが、送信時は開いているファイルは送信対象のものだけにする必要があるようです。
    2)添付ファイル送付時の注意点:Dataシートには必ずグループ名を付し、MainシートのE3でそのグループ名を選択する。

  15. おおた より:

    良きツールを発見!と思い、作成してみましたが、
    どうしてもうまくいきません。

    何度実行しても、
    Exception: DriveApp オブジェクトでの getFolderById メソッドまたはプロパティの取得中に予期しないエラーが発生しました。
    となります。

    原因と思われるものは何でしょうか?
    応答いただけると幸いです。
    よろしくお願いします。

    • ichi3270 より:

      恐らく、E2セルのフォルダIDが入力されていないか、誤っているかだと思います。
      見直してみてください

      • おか より:

        同じエラーが出ており、何度もIDを確認しましたが間違えていませんでした。
        何か他の可能性は考えられるでしょうか

  16. m55i より:

    業務で使用したく、GASを勉強しております。素敵なツールありがとうございます。
    コードの54.55が自分の中でわからず(4,14)は具体的に何を指しているのでしょうか。
    const processedTitle = insertionText(title, data[i].slice(4,14));
    const processedLetterBody = insertionText(letterBody, data[i].slice(4,14));

    GAS今回初めてのため、ド素人の質問で申し訳ありません。

    • ichi3270 より:

      data[i]には、Dataシートのi行目のデータが、配列として格納されています。
      下記のような感じです。
      ["Group1", "taro@gmail.com", "", "", "鈴木太郎", "2020年12月27日", "13時30分", "東京本社", 以下省略・・・]

      data[i].slice(4, 14)は、上記のような配列の、[4]~[14]の部分のみを取り出すイメージです。
      ["鈴木太郎", "2020年12月27日", "13時30分", "東京本社", 以下省略・・・]
      *配列は[0]から始まります。

      insertionText関数にて、$0を”鈴木太郎”に置換、$1を”2020年12月27日”に置換・・・というように、置換処理をしています。

  17. じょんちゃん より:

    このような方法を教えてもらい大変助かっています。
    添付ファイルを全く載せず送信しようと思うと以下のような表示がでます。
    どうしてなのでしょうか?

    「Exception: DriveApp オブジェクトでの getFolderById メソッドまたはプロパティの取得中に予期しないエラーが発生しました。」

  18. 佐藤 より:

    すばらしいGASの提供ありがとうございます!
    欲しかった内容のものだったので、早速活用させていただいております。

    一つ教えていただきたいのですが、「Data」シートを管理表としても活用しております。
    そこで、データを最終行に追加した場合、その行についてのメールを自動送信する、というトリガーを追加できないか考えております。方法としては、①実行時に最終行に入力されている行のメールを自動送信、もしくは②
    チェックボックス欄を設けてチェックが入った行のメールを自動送信する、というトリガーを追加したいのですが、どのような構文を追加すれば良いでしょうか。

    他サイトなどからチェックボックスを起点にメール送信する方法も確認し構文を追加したりもしたのですが、一行目しか送信できず断念しました。。
    可能であればで結構ですので、恐れ入りますがよろしくお願いいたします。

    • ichi3270 より:

      ちょうどツールを修正していたところで、先ほど新バージョンを公開しました。
      新バージョンになったことで、ご相談の内容への対応が簡潔になったため、新バージョンのツールで説明させていただきます。
      今回は「②チェックボックス欄を設けてチェックが入った行のメールを自動送信する」を説明します。

      1.宛先リストシートのR列をチェックボックス用の列とする。(挿入 → チェックボックス でチェックボックスを挿入しておく)

      2.下記のスクリプトを追加する。

      function onCheck(e) {
        const sheet = e.source.getActiveSheet();
        const sheetName = e.source.getSheetName();
        if (sheetName !== "Main") {
          if (e.value === "TRUE" && e.oldValue === "false") {
            const inputValues = getInputValues()
            const targets = getTargets(sheetName)
            const target = targets[e.range.getRow() - 2]
            const result = processEmail(inputValues, target, "sendEmail")
            sheet.getRange(e.range.getRow(), 17).setValue(result)
          }
        }
      }

      3.トリガーを追加する
      イベントの種類 「編集時」 に onCheck関数が実行されるように設定してください。

      以上で、チェックボックスにチェックを付けた時に、その行のメールが送信されるようになると思います。

      ただし、メール送信を行う権限(送信元メールアドレス)は、3.でトリガーを追加した人のものになりますので、複数人で共同利用される場合はやや難があるかと思います。
      https://tgg.jugani-japan.com/tsujike/2021/05/gas-form6/
      上記のサイト様に似た様な事例の対処方法が説明されていました。

    • 佐藤 より:

      ありがとうございます。
      無事に設定ができました!
      業務効率化がかなり進みそうです。
      改めてありがとうございました!

  19. A29 より:

    急ぎの業務で困っており、見つけたときは感動しました。
    ありがとうございます。

    ただ、送信の際にGmail以外を使用したいのですが不可能でしょうか?
    すでに掲載されていたら申し訳ございません。

    宜しくお願いいたします。

    • ichi3270 より:

      このツールはGmail用のツールですので、Gmailを使う前提になっております。

      私は試していないのでできるかわかりませんが、
      下記の方法で、Gmailを使って他のメールアドレスからメールを送信できるようにすれば、このツールからも送信可能になるかもしれません。

      https://support.google.com/mail/answer/22370?hl=ja

      • A29 より:

        お早いご返信ありがとうございます。

        エイリアス設定は行っており、なお不可能でしたが、解決いたしました。
        もしかするとデフォルト設定していなかったからかもしれません。

        もう一点問題があり、こちらも急ぎの案件となってしまうのですが、
        50件ほど送ったら件数が多すぎるとなり、
        別シートに2枚目を作り送信を試みたのですが、
        「 1 日にサービス email を実行した回数が多すぎます。」
        と出てしまいます。上限を上げることは可能でしょうか?

        何度も申し訳ございません。
        よろしくお願いいたします。

        • ichi3270 より:

          スクリプトを使ったGmailの送信件数には制限があり、無償のGoogleアカウントですと、現時点では1日あたり100件が上限のようです。
          https://developers.google.com/apps-script/guides/services/quotas
          回避策・対応策としては、24時間待つか、別のアカウント(仕事仲間など)から送信する・・・という形になります。

          もしくは、裏技的な感じですが、
          こちらの方の記事(外部サイト)が参考になるかと思います。
          (ドラフトを作成し、それを送信するスクリプトであれば、100件の制限には抵触しない という検証がされています)

          当サイトのツールで実現したい場合、下記のような修正になるかと思います。

          修正前:

              // メール送信 or 下書き作成
              if (action === "sendEmail") {
                GmailApp.sendEmail(target.to, replacedMailTitle, replacedMailBody, options);
              } else {
          // ...以下省略
          

          修正後:

              // メール送信 or 下書き作成
              if (action === "sendEmail") {
                const draft = GmailApp.createDraft(target.to, replacedMailTitle, replacedMailBody, options);
                const draftID = draft.getId();
                GmailApp.getDraft(draftID).send();
              } else {
          // ...以下省略
          
  20. Shiro より:

    はじめまして。
    素晴らしいツールのご提供ありがとうございます。早速活用させていただいております。

    質問なのですが、宛先シートにチェックボックスを導入し、チェックを入れた場合のみ、それぞれ下書き作成、メール送信を行うことは可能でしょうか。

    他の方の同様のコメントを拝見し、参考にしてみたのですが、上手くいきませんでした。こちらは「メール送信」のみ場合でしょうか。

    現在宛先リストのセルAにチェックボックスを設けており、宛先や挿入部分の修正はうまく行ったのですが、チェックボックスの判断が上手くできません。

    もし宜しければ、ご教授いただけますと幸いです。よろしくお願いいたします。

    • ichi3270 より:

      一番左のA列をチェックボックスの列にして、チェックを入れた宛先にのみメールが送られるようにしたい場合、
      (A列の各セルは、スプレッドシートの 挿入 → チェックボックスでチェックボックスを挿入した状態とします。)

      まず、スクリプト内で列のアルファベットや列番号を指定している部分がすべてズレるので、すべて修正します。
      下記のような部分のQは全てRに書き換えます。

      .getRange("Q2:Q").clear();
      .getRange(`Q2:Q${logs.length + 1}`)

      getTargets関数の中のreturnの中(最初)にchecked: row[0],を追加し、それ以降のrow[数字]となっている部分の数字は、すべて1足します。
      getReplaceList関数の中の.slice(3, 13).slice(4, 14)にします。

      batchProcessEmails関数の中のFor文は、以下のとおり変更。

        for (const target of targets) { 
            const result = target.checked
              ? processEmail(inputValues, target, action)
              : "skip"
            logs.push([result])
        }

      これで大丈夫だとは思いますが、ちゃんとした検証はしていませんので、十分テストの上ご利用ください。

  21. や ま より:

    素晴らしいツールをありがとうございます。
    2022年9月12日までのバージョンを利用しております。

    1点質問ですが、
    差し込み項目を10以上必要になり、$10,$11・・・と項目を増やしたのですが、数値の最初の一桁目しか認識しないようで、$10の欄には、$1の項目が差し込みになります。
    10項目以上の差し込みが可能であれば、ご教授いただけないでしょうか。
    よろしくお願いいたします。

    • ichi3270 より:

      申し訳ありませんが、今後の他のご利用者様の参考にもなるように、新バージョンでの対応方法で説明させていただきます。

      getTargets関数
      個別添付ファイル名1〜3の列番号([13], [14], [15]となっている部分の数字)を修正します。

      getReplaceList関数
      beforeStringsおよびafterStringsslice(3, 13)の13の部分を、差込欄の最後の列番号に修正します。

      おそらくこれで大丈夫だと思いますが、ちゃんと試せていないので、動作確認をしていただいた上でご利用ください。

  22. mm より:

    大変たすかっております。12月中旬あたりから送信済みトレイに入らない、でも送信はできている状態ですが仕様が変更になったのかご存じでしょうか。旧Verを使用させていただいております。

  23. mii より:

    素晴らしいツールをありがとうございます。

    1点質問です。
    N~P列 個別添付ファイル名1~3 共通添付ファイル以外のファイルも個別に添付したい場合は、ファイル名を入力。となっていますが、こちらの使用方法を教えてください。
    また、こちら増やす場合はどのようになりますでしょうか。(個々に変更する場合でも使用できると助かります。)

  24. よしゆ より:

    おはようございます。
    過去の利用者にメールを送ろうと思い、利用させて頂いております。
    Exception: 1 日にサービス email を実行した回数が多すぎます。
    とでてしまうのですが、何か対応方法はありますでしょうか?

  25. レイキ より:

    以前のバージョンを使用させて
    いただいている者です。
    1点質問なのですが
    差し込みの項目数を増やす場合は
    どのような追記が必要でしょうか?

    どうやっても10項目〜が反映されません。
    もし可能であれば、ご教示お願いします。

  26. こて より:

    一点教えていただけますでしょうか。
    Gmailで独自ドメインを使用していても使用は可能でしょうか?

  27. brother1sun より:

    日時指定して送信したいと考えています。
    年始の挨拶を年末に送信設定したい場合など…。

    どのようば良いか、対応可能であれば教えてください。

  28. hogeho より:

    この度はツールのご開発ありがとうございました。

  29. hogeho より:

    この度はツールのご開発ありがとうございました。
    (途中で送付してしまいました)

    Gmail無料版で一度作成し、送付しましたら送付制限がかかり、有料化(GoogleWorkplace)しまして同様に送付しましたら

    送付先が、無料Gmailなら添付ファイルも送信できましたが、独自ドメイン先には添付ファイルが送信できませんでした。
    (無料Gmail・独自ドメイン先、同じタイミングで同じ文章や内容で送信しております)

    こちらの原因がいくら調べてもわからずご教示頂くことは可能でしょうか?

    お手数おかけしますがご確認のほどお願いいたします。

  30. みんみん より:

    宛先に添付ファイルが添付できません。
    共通のファイルと個別ファイルを付けています。
    CCやBCC、また下書きには添付されますが、肝心の宛先にはファイルが添付されません。
    Google Workspaceを使用しています。

    何か設定が間違っているのかとも思いましたが、CC先には添付ファイルが付くので何が悪いのかわかりません。

    お手数をおかけしますが、ご教示いただけると幸いです。

  31. ek より:

    複数人にToやCcでメールを一括送信したく、私がやりたいことが揃ったツールで活用させていただいています^^

    可能か確認させていただきたいことがございます。
    本文中ににhttpsのリンクを記載したいのですが、そのままURLを記載するのではなく、ハイパーリンクとして挿入したいです。
    スプレッドシートで「リンクを挿入」しても、作成されたGmailの本文中にはハイパーリンクではなく文字列として表示されてしまいます。
    Gmailで対象URLをハイパーリンクとして表示させ一括送信は可能でしょうか?

    ご教示いただけますと幸いです。
    どうぞよろしくお願いいたします。

  32. あーと より:

    使いやすいツールの開発をありがとうございました。

    ファイルの添付に関しましてお聞きしたい事がございます。
    ツールのテストを行っていたのですが、送信した添付ファイルが受け取り側のメールソフトによって添付ファイルの件数が違ってしまいます。
    送った添付ファイルは1件だったのですが、Gmailだと1件、Outlookだと同じファイルが2件添付しまいます。

    原因を突き止める事ができませんです。
    お教えいただけますでしょうか。

    よろしくお願い致します。

    • あーと より:

      大変申し訳ありません。
      解決しました。

      添付ファイルに関しての理解が足りていませんでした。