パソコンデータ入力、Webサイト制作、プログラミング、画像編集、レジンアート、ネイルアート 、チラシ折り、アクアリウム、水耕栽培、野菜販売

大阪市平野区 就労継続支援B型事業所
じゆうじざい 電話番号06-6796-9393

Googleフォームからお問い合わせメール送信のスクリプト公開

 ※ プログラム(スクリプト)はこのページの下に記載しています。


「じゆうじざい」で使用している「お問い合わせフォーム」には

Googleフォームを利用しています。


一般的によくあるメール送信フォームだと思います。


なぜ、Googleフォームを使っているのかというと無料で使い勝手が良いからです。

いまのところ無料のサービスで十分だと思っています。


このフォームの特徴は

自動返信(自動応答)メールに対応するため「Google Apps Script」のプログラムを導入しています。

省力して「GAS」とも呼ばれているプログラムですね。


「Google Apps Script」を使わなくても自動返信メールは可能なのですが、その場合カスタム性が低くなります。


Googleフォームの機能だけだと定型的な内容しか管理者側とユーザー(入力者)側へメール送信されません。

最初は「それでもいいかな」と思っていました。


当事業所「じゆうじざい」はプログラムも教えている事業所です。

何か少し手を加えたいなという思いから

独自性のある自動返信(自動応答)メールに対応したスクリプトを作成することにしました。


最初に作ってしまえば他のフォームにも流用が可能ですしね。

将来的には求人フォームにも使おうと思っています。


お問い合わせフォームは、下記のような流れのフォームですね。

1.ウェブサイトに訪問された方がGoogleフォームに必要事項を入力

2.[送信]ボタンが押下される

3.運営者側とユーザー(入力者)側に入力内容をメール送信する


この方法のメリットとデメリットは以下です。


メリット

  • 無料
  • 独自ドメインの送信元メールアドレス(From)でメール送信が可能


デメリット

  • 自由にデザインできない
  • 確認画面なし
  • メール送信数に制限がある
  • HTMLタグの <iframe> でページ読込する必要がある
  • Googleフォームの名前が表示される


Googleのサービスを利用していますので、Googleアカウントは必要になってきます。

独自ドメインのメールアドレスで送信するには、Gmailに設定を追加する必要があります。


送信元を独自ドメインのメールアドレス宛からメール送信する方法としては

「Googleフォーム」+「Google Apps Script」以外でも可能です。


無料のサーバーをレンタルしても可能ですので

機会があれば、違う記事として紹介していければよいですね。


希望の方には、有料・無料のレンタルサーバーからフォームでのメール送信方法もお伝えします。


それでは、実際に使っているスクリプトを公開します。


お問い合わせフォーム Google Apps Script

/**
 * Google Apps Script お問い合わせメール送信
 *
 * @created :2015-05-18
 * @updated :2024-12-25
 * @author  ;じゆうじざい
 * @url	    :https://www.jiyuujizai.com/
 * @ver     :1.001
 */


// 初期設定
let Config = {
  // メール件名をフォームのタイトルから取得する [true=する|false=しない] (※必須)
  'useSubjectFormTitle': false
  ,
  // メール件名 (※任意) 上記 useSubjectFormTitleがtrue かつ 未入力の場合はフォームタイトルから取得
  'subject': 'お問い合わせ'
  ,
  // 管理者の名前 (※任意)
  'masteNname': '●●●'
  ,
  // 管理者のメールアドレスをGoogleアカウントのメールアドレスにする [true=する|false=しない] (※必須)
  'useMasterAddressGmailAccount': true
  ,
  // 管理者のメールアドレス (※任意) 未入力の場合はGoogleアカウントのメールアドレス
  'masterAddress': ''
  ,
  // 返信先(REPLYTO)のメールアドレス (※任意)
  'replyToAddress': ''
  ,
  // Googleフォームの入力項目名(名前) (※任意) [名前]に相当する項目を設定した場合の項目名
  'formFieldName': '名前'
  ,
  // Googleフォームの入力項目名(メールアドレス) (※任意) [メールアドレス]に相当する項目を設定した場合の項目名
  'formFieldEmail': 'メールアドレス'
  ,
  // Googleフォームの入力項目名(自動返信メール) [自動返信メール]に相当する項目を設定した場合の項目名
  'formFieldAutoReply': '自動返信メールの送信'
  ,
  // Googleフォームの入力項目の値(自動返信メールを送信する場合の項目値)
  'formFieldAutoReplyYes': 'はい'
  ,
  // 送信元(FROM)のメールアドレス (※任意) 独自ドメインのメールアドレスの場合などに使用(Gmailに追加設定必要)
  'fromAddress': ''
  ,
  // 宛名を挿入するか否か [true=する|false=しない] (※必須)
  'useHonorificTitleAddress': true
  ,
  // 敬称 (例:"さま" "様") (※任意) 空値の場合は差し込みしない
  'honorificTitle': 'さま'
  ,
  // 自動返信メールの件名の接頭辞 (※任意)
  'autoResMailSubjectPrefix': '【自動返信】'
  ,
  // 送信先(CC)のメールアドレス (複数の場合は 配列 OR カンマ区切り) (※任意)
  'ccAddress': ''
  ,
  // 送信先(BCC)のメールアドレス (複数の場合は 配列 OR カンマ区切り) (※任意)
  'bccAddress': ''
  ,
  // メールを送信するか否か [true=送信する|false=送信しない] (※必須)
  'useSend': true
  ,
  // 管理者宛メールを送信するか否か [true=送信する|false=送信しない] (※必須)
  'useSendMaster': true
  ,
  // ユーザー宛に自動応答メールを送信するか否か [true=送信する|false=送信しない] (※必須)
  'useSendUser': true
  ,
  // 本文をhtmlで送信するか否か [true=HTML送信する|false=HTML送信しない] (※必須)
  'useHtmlBody': false
  ,
  // 管理者宛の返信先メールアドレスをユーザー(問い合わせ者)のメールアドレスにする [true=する|false=しない] (※必須)
  'useMasterReplyToUser': false
};

// 設定
let Setting = {
  'App':{}
  ,
  'Config': {}
};

// レスポンス情報
let formResponse = {
  // 実行された時刻(タイムスタンプ)
  'getTimestamp': null
  ,
  // フォームの回答のID 
  'getId': null
  ,
  // トリガーID
  'triggerUid': null
  ,
  // 入力値の抽出
  'User': {
    // 入力項目「名前」の値
    'name': ''
    ,
    // 入力項目「メールアドレス」の値
    'email': ''
    ,
    // 入力項目「自動返信メール」の値
    'isAutoReply': false
  }
}


/**
 * フォーム送信 実行
 *
 * @param  Object
 * @return void
 */
function formInquirySendMail(obj)
{
  // 初期設定
  initialize();

  Logger.log('[Config]:' + JSON.stringify(Config));
  Logger.log('[Setting]:' + JSON.stringify(Setting));

  let response = null;
  let itemResponses = null;

  // フォーム送信のレスポンス取得
  if (obj) {
    response = obj.response;
    itemResponses = obj.response ? obj.response.getItemResponses() : null;

    if (response) {
      formResponse.getTimestamp = response.getTimestamp();
      formResponse.getId = response.getId();
      formResponse.triggerUid = obj.triggerUid;
    }
  }

  let body = '';
  let options = {};
  let fields = {};

  // フォーム 入力情報取得
  if (itemResponses) {
    fields = getFormInput(itemResponses);
  }

  Logger.log('[formResponse]:' + JSON.stringify(formResponse));
  
  // <body (本文)>
  // ヘッダーを追加挿入
  body += getFormHeader(formResponse.User.name);

  // フォームの入力内容を追加挿入
  body += getFormFields(fields);

  // フッターを追加挿入
  body += getFormFooter();
  // </ body (本文)>

  // オプション(htmlBody) (本文にHTML形式を追加)
  if (Setting.Config.useHtmlBody) {
    options.htmlBody = body.replace(/\n/g, "<br />\n");
  }

  if (formResponse.User.email) {
    // 管理者宛メール送信
    sendMaster(body, options);

    // ユーザー宛メール送信
    sendUser(body, options);
  }
}


/**
 * 初期設定
 *
 * @return void
 */
function initialize()
{
  // Googleアカウント
  Setting.App.userName = Session.getActiveUser().getUsername();

  // Googleアカウント(E-mail)
  Setting.App.email = Session.getActiveUser().getEmail();

  // ログインID
  Setting.App.loginId = Session.getActiveUser().getUserLoginId();

  // フォームID
  Setting.App.formId = FormApp.getActiveForm().getId();

  // フォームタイトル
  Setting.App.formTitle = FormApp.openById(Setting.App.formId).getTitle();
  if (Setting.App.formTitle == "") {
    Setting.App.formTitle = FormApp.getActiveForm().getTitle();
  }

  Setting.Config = Config;

  // メール件名をフォームタイトルから取得
  if (Setting.Config.useSubjectFormTitle == true && Setting.App.formTitle) {
    Setting.Config.subject = Setting.App.formTitle;
  }
  // 管理者のメールアドレスをGoogleアカウントのメールアドレスにする
  if (Setting.Config.useMasterAddressGmailAccount == true && Setting.App.email) {
    Setting.Config.masterAddress = Setting.App.email;
  }
}


/**
 * 管理者宛メール送信
 *
 * @param  String body "本文"
 * @param  Object options "オプション"
 * @return int ret "メール送信数"
 */
function sendMaster(body=null, options={})
{
  let ret = 0;

  if (formResponse.triggerUid && Setting.Config.useSendMaster == true && Setting.Config.masterAddress) {
    Logger.log('<sendMaster()>');

    body = ""
      + (Setting.Config.subject ? Setting.Config.subject + ' から' : '') + "送信がありました。\n"
      + "下記が送信された内容です。\n"
      + "----------------------------------------\n\n"
      + body
    ;

    // オプション
    options = Object.assign(getOption(['name', 'cc', 'bcc', 'replyTo']), options);

    // 返信先を問い合わせ者のメールアドレスにする
    if (Setting.Config.useMasterReplyToUser == true && formResponse.User.email) {
      options.replyTo = formResponse.User.email;
    }

    // メール送信
    ret = sendMail(Setting.Config.masterAddress, Setting.Config.subject, body, options);

    Logger.log('</sendMaster()>');
  }

  return ret;
}


/**
 * ユーザー宛メール送信
 *
 * @param  String body "本文"
 * @param  Object options "オプション"
 * @return int ret "メール送信数"
 */
function sendUser(body=null, options={})
{
  let ret = 0;

  if (formResponse.triggerUid && Setting.Config.useSendUser == true && formResponse.User.isAutoReply == true && formResponse.User.email) {
    Logger.log('<sendUser()>');

    // 件名
    let subject = Setting.Config.subject;
    if (Setting.Config.autoResMailSubjectPrefix) {
      subject = Setting.Config.autoResMailSubjectPrefix + subject;
    }

    // オプション
    options = Object.assign(getOption(['name', 'replyTo']), options);

    if (isAliases(Setting.Config.fromAddress) == true) {
      options = Object.assign(getOption(['from']), options);
    }

    // メール送信
    ret = sendMail(formResponse.User.email, subject, body, options);

    Logger.log('</sendUser()>');
  }

  return ret;
}


/**
 * メール送信
 *
 * @param  String recipient "送信先メールアドレス"
 * @param  String subject "件名"
 * @param  String body "本文"
 * @param  Object options "オプション"
 * @return int ret "メール送信数"
 */
function sendMail(recipient=null, subject=null, body=null, options={})
{
  let ret = 0;

  Logger.log('<sendMail()>');
  Logger.log('[recipient] = ' + recipient);
  Logger.log('[subject] = ' + subject);
  Logger.log('[options] = ' + JSON.stringify(options));
  Logger.log('[body] = ' + body);
  Logger.log('</sendMail()>');

  // メール送信する
  if (Setting.Config.useSend == true && recipient && subject && body) {
    // メール送信実行
    try {
      let sendStockCount = getSendStockCount();
      Logger.log('メール送信可能数:' + sendStockCount);

      // メール送信 (送信在庫数が1以上)
      if (sendStockCount > 0) {
        GmailApp.sendEmail(recipient, subject, body, options);
        let sendAfterCount = getSendStockCount();
        ret = sendStockCount - sendAfterCount;
        Logger.log('メール送信実行数:' + ret);
        Logger.log('メール送信可能数:' + sendAfterCount);
      } else {
        console.warn('メール送信の上限数のため、送信しませんでした。');
      }
    } catch (e) {
      reportError(e.message);
    }
  }

  return ret;
}


/**
 * フォーム入力情報 取得
 *
 * @param  Object itemResponses
 * @return Array
 */
function getFormInput(itemResponses)
{
  let question = '';
  let answer = '';
  let fields = [];

  // フォーム入力情報から抽出
  if (itemResponses != undefined) {
    for (let i = 0; i < itemResponses.length; ++i) {
      question = itemResponses[i].getItem().getTitle();
      answer = itemResponses[i].getResponse();
      // 入力項目から「名前」の値を取得
      if (question == Setting.Config.formFieldName) {
        formResponse.User.name = answer;
      }
      // 入力項目から「メールアドレス」の値を取得
      else if (question == Setting.Config.formFieldEmail) {
        formResponse.User.email = answer;
      }
      // 入力項目から「自動返信メール」の値を取得
      else if (question == Setting.Config.formFieldAutoReply) {
        if (answer == Setting.Config.formFieldAutoReplyYes) {
          formResponse.User.isAutoReply = true;
        }
      }
      // フィールドデータを配列に追加
      fields.push({'key':question, 'val':answer});
    }
  }

  return fields;
}


/**
 * フォーム入力内容
 *
 * @param  Array fields
 * @return String
 */
function getFormFields(fields=null)
{
  let response = '';
  let fieldsArray = [];

  if (fields && fields.length) {
    for (let i = 0; i < fields.length; ++i) {
      fieldsArray.push('■ ' + fields[i].key + "\n" + fields[i].val.replace(/\n+$/, ''));
    }
  }

  response += ""
    + "\n"
    + "◆◆ ご入力内容 ◆◆\n"
    + "----------------------------------------\n"
    + fieldsArray.join("\n\n") + "\n"
    + "----------------------------------------\n"
    + "\n"
  ;

  return response;
}


/**
 * 本文のヘッダー
 *
 * @param  String userName "入力者の名前"
 * @return String
 */
function getFormHeader(userName='')
{
  let response = ""
    + "※このメールはシステムからの自動返信です\n"
    + "\n"
    ;

  // ユーザー(宛名)の差し込み
  if (Setting.Config.useHonorificTitleAddress == true && Setting.Config.honorificTitle && userName) {
    response += ""
      + userName + ' ' + Setting.Config.honorificTitle + "\n"
      + "\n"
    ;
  }

  response += ""
    + Setting.Config.masteNname + "へのお問い合わせありがとうございました。\n"
    + "以下の内容でお問い合わせを受け付けいたしました。\n"
    + "\n"
    + "5営業日以内に、担当よりご連絡いたしますので\n"
    + "今しばらくお待ちくださいませ。\n"
  ;

  return response;
}


/**
 * 本文のフッター
 *
 * @return String
 */
function getFormFooter()
{
  return ""
    + "1週間以上経過しても連絡がない場合は、\n"
    + "お手数ですが、電話または再度メールフォームよりご連絡ください。\n"
    + "\n"
    + "━━━━━━━━━━━━━━━\n"
    + "会社名:●●●\n"
    + "E-mail:info@example.com\n"
    + "URL:https://www.example.com\n"
    + "TEL:xx-xxxx-xxxx\n"
    + "〒XXX-XXXX\n"
    + "▲県■市●町\n"
    + "━━━━━━━━━━━━━━━\n"
  ;
}


/**
 * 送信オプションを取得
 *
 * @param  Array keys
 * @return Object
 */
function getOption(keys=null)
{
  let options = {};

  if (keys && keys.length) {
    for (let i = 0; i < keys.length; i++) {
      switch (keys[i]) {
        case 'name' :
          if (Setting.Config.masteNname) {
            options.name = Setting.Config.masteNname;
          }
          break;
        case 'from' :
          if (Setting.Config.fromAddress) {
            options.from = Setting.Config.fromAddress;
          }
          break;
        case 'cc' :
          if (Setting.Config.ccAddress) {
            options.cc = Setting.Config.ccAddress;
          }
          break;
        case 'bcc' :
          if (Setting.Config.bccAddress) {
            options.bcc = Setting.Config.bccAddress;
          }
          break;
        case 'replyTo' :
          if (Setting.Config.replyToAddress) {
            options.replyTo = Setting.Config.replyToAddress;
          }
          break;
      }
    }
  }

  return options;
}


/**
 * メールAliasの存在確認
 *
 * @param  String fromAddress
 * @return bool
 */
function isAliases(fromAddress='')
{
  return (GmailApp.getAliases().indexOf(fromAddress) > -1) ? true : false;
}


/**
 * メール送信 残数
 *
 * @return int
 */
function getSendStockCount()
{
  return MailApp.getRemainingDailyQuota();
}


/**
 * Reporting Error for USE_DEBUGger
 *
 * @param  String message : Error message for report email and log
 * @return void
 */
function reportError(message=null)
{
  if (message) {
    // ログ書き込み
    console.error('reportError(): ' + message);

    if (Setting.Config.masterAddress) {
      // オプション
      let options = getOption(['name']);

      // 本文
      let body = ''
        + '■ 件名\n' + (Setting.Config.subject ? Setting.Config.subject : '') + '\n\n'
        + '■ エラーメッセージ\n' + message + '\n'
      ;

      // メール送信
      try {
        MailApp.sendEmail(Setting.Config.masterAddress, 'ERROR!', body, options);
      } catch (e) {
        console.error(e.message);
      }
    }
  }
}


この記事ではスクリプトの公開のみで申し訳ございません。

ご利用者さまには、構築方法を詳しく教えます。