※ プログラム(スクリプト)はこのページの下に記載しています。
「じゆうじざい」で使用している「お問い合わせフォーム」には
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);
}
}
}
}
この記事ではスクリプトの公開のみで申し訳ございません。
ご利用者さまには、構築方法を詳しく教えます。