🦁

Netlify Forms(確認画面付き)作成しました。zapier連携機能(オプション)もあります。

2020/05/10に公開

2021/3/10 Netlify Function で自動返信を実装する記事を追加しました。
Netlify Forms と Functions で確認画面、自動返信に加えて Airtable,HubSpot 連携(zapier 経由)を実装する方法。(ランディングページに最適)

1. 概要

Netlify Forms は、Web サイトの問い合わせページの form タグに、netlify と加えるだけで。フォーム機能を設置することが簡単にできるサービスです。(Netlify に Web サイトをホストしている前提です)

また、管理者へのメールもしくは Slack 通知、問い合わせ者リストの csv ダウンロード機能があります。フォーム送信前の確認画面の表示は標準では、ありませんが、JavaScript の設定で、実装することが可能です。(後程解説します)

標準機能で物足りない場合は、ウェブサービス自動連係ツールである Zappier を経由して、Netlify Forms と Gmail 連携を行い、フォーム登録内容自動返信メールをカスタマイズして送信することができるようになります。

GitHub: https://github.com/IoT-Arduino/MyFitness
サイト:https://myfitness-site.netlify.app/form/index.html

2. コードの解説

2.1. Netlify Forms 標準機能の実装

該当のフォームタグの属性に netlify と付け加えるだけです。

"form/index.html"

<form action="/form/thankyou.html" method="post" name="form" onsubmit="" netlify>
    // 中略
</form>

フォームを送信すると、Netlify 管理画面上で、フォームの投稿内容を確認することができます。

Netlify Forms結果

また、管理者向けの通知機能や csv のダウンロード機能もあります。

Notification

その他標準機能については、こちらのブログ記事が参考になるかと思います。

参考)
標準のフォーム画面を説明した記事
https://qiita.com/NaokiIshimura/items/bce2f0b865ec1bc16a53

2.2. フォームバリデーションの実装

正規表現と test メソッド等を使用し、Name、email、Subject,Message フィールドにチェック機能をいれました。条件不一致の際にはエラーを画面上に表示します。

email フィールドのバリデーション設定の例

"form/formScript.js"
function validateEmail() {
  const email = document.getElementById("email");
  const emailError = document.getElementById("emailError");
  const re = /^([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5})(\.[a-zA-Z]{2,5})?$/;

  if (!re.test(email.value)) {
    emailError.classList.add("is-invalid");
    emailError.classList.remove("dsNone");
  } else {
    emailError.classList.add("dsNone");
    emailError.classList.remove("is-invalid");
  }
}

その他、message 欄には入力文字数カウントを行い、文字数制限をかけています。

2.3. フォーム確認画面の実装

標準機能では実装されていない、送信前の内容確認画面を用意します。
左から、フォーム入力画面、確認画面、送信後の Thankyou 画面になります。

FormConfirm

まず、フォーム入力画面の form タグの中に確認ボタンと submit ボタンを配置します。
確認ボタンをクリックすることで、確認画面を表示しますが、確認ボタンには button タグを使用しないことがポイントです。submit ボタンには、button タグを使います。

title="/form/index.html <確認ボタンのタグ>"
<div class="buttonArea">
  <div class="btnStyle">
    <a id="BtConfirm">Confirm</a>
  </div>
  <div class="btnStyleCnl" id="BtReset">
    Reset
  </div>
</div>
"/form/index.html <送信ボタンのタグ>"
<div class="buttonArea">
  <button type="submit" id="BtSend">
    Submit
  </button>
  <div class="btnStyleCnl">
    <a id="BtCancel">rewrite</a>
  </div>
</div>

確認ボタンをクリックすると、初期表示されていたフォームの入力フィールドが非表示に、初期画面で非表示となっていた、データ確認エリアが表示されます。
フォーム入力フィールドとデータ確認エリアへのデータの受け渡しは、
cinfirmInput()関数で行います。

確認ボタンをクリックしたときの処理

"/form/formScript.html"
BtCfm.addEventListener("click", function() {
  Cnt.style.display = "none";
  Cfm.style.display = "block";
  confirmInput();
});

cinfirmInput()関数

"/form/formScript.html"
const confirmInput = () => {
  const yourName = document.getElementById("name").value;
  const yourEmail = document.getElementById("email").value;
  const yourPhone = document.getElementById("tel").value;
  const select = document.getElementById("select").value;
  const textArea = document.getElementById("textArea").value;

  nameCfm.textContent = yourName;
  emailCfm.textContent = yourEmail;
  phoneCfm.textContent = yourPhone;
  selectCfm.textContent = select;
  textAreaCfm.textContent = textArea; // radio button

  const memberShip = document.form.membership;
  let memberType = "";
  for (let i = 0; i < memberShip.length; i++) {
    if (memberShip[i].checked) {
      memberType = memberShip[i].value;
      break;
    }
  }
  memberCfm.textContent = memberType; // check box

  const methodPrefer = document.querySelectorAll('input[type="checkbox"]');
  let methodType = [];
  for (let i = 0; i < methodPrefer.length; i++) {
    if (methodPrefer[i].checked) {
      methodType.push(methodPrefer[i].value);
    }
  }
  methodCfm.textContent = methodType.join(",");
};

name や email 等のフィールドは単純に値を変数に代入するだけです。
ラジオボタンと、チェックボックスはループ文を用いて、チェックされている要素の値を取得します。チェックボタンは複数の値を取得する為、値を配列に格納します。

<a id="markdown-24-躓いた点" name="24-躓いた点"></a>

2.4. 躓いた点

ContactMethod

チェックボックスで複数の値をとる設定として、上記のとおり、チェックボックスでチェックされた値を配列に格納することで、確認画面まではうまく動作しました。

ところが、送信処理の後で、Netlify Forms の確認画面をみたところ、値が正しく送信されていませんでした。

最終的にドキュメントや、QA 等を確認して、解決しました。
https://docs.netlify.com/forms/setup/
https://community.netlify.com/t/form-submission-not-showing-multiple-checkbox-values/2037

少し特殊な設定ですが、以下のように form の name 属性に配列型として定義する必要があります。


name="ContactMethod[]"

"/form/index.html"

<div class="input-element">
    <label><input type="checkbox" name="ContactMethod[]" value="SMS" />SMS</label><br />
    <label><input type="checkbox" name="ContactMethod[]" value="PhoneCall" />PhoneCall</label><br />
    <label><input type="checkbox" name="ContactMethod[]" value="e-mail" />e-mail</label>
</div>

Netlify Forms  管理画面で以下のように複数の値が取得できました。


Contact Method["PhoneCall", "e-mail"]

3. 拡張機能について(フォーム内容自動返信メール機能)

標準機能では、問い合わせがあった場合、管理者向けの通知しかできません。いわゆる、フォーム登録内容の自動メール返信機能を実装したい場合は、Netlify と Zappier を連携することで可能になります。

ここで、Zappier とは何かということですが、様々な Web サービスを自動連係させ、生産性を向上させるサービスです。日本では、メルカリさんの事例などが紹介されています。

メルカリエンジニアブログ
https://tech.mercari.com/entry/2017/12/22/110934

3.1. Netlify と Zappier の連携設定

Netlify と Zappier を連携することで、標準では管理者のみお知らせとなっていたところを、Gmail と連携してお客様にお問い合わせ内容自動返信メールを送信することができます。

Netlify と Zappier の連携は、非常にスムーズに設定できるので、難しいコーディング等は一切不要です。

(1) Netlify にサインインして、対象の Web サイトとフォーム ID を指定します。

netlify-zappier-1

(2) Gmail との連携設定を行います(連携する Gmail のアカウント等を指定します)

netlify-zappier-2

(3) 自動返信送信内容の設定を行います

件名、宛先や cc 送信先の設定に加え、本文の設定を行います。

Netlify Forms で受け取ったフォームの内容とメール本文に表示する内容を紐づける設定をおこないます。順序の入れ替えや、レイアウトの設定等、自由度高く設定が可能です。

netlify-zappier-3

(4) 設定が完了すると、自動返信メールが送信されます

netlify-zappier-4

公式ブログ
https://www.netlify.com/blog/2018/11/07/automate-your-netlify-sites-with-zapier/

公式ドキュメント
https://docs.netlify.com/forms/notifications/#email-notifications

3.2. Netlify と Zappier の無料枠と有料課金の境界線

Netlify ホスティングは無料枠が大きいので特に問題はないと思いますが、NetlifyForms は 100 問い合わせ/月なので、ある程度問い合わせが見込める場合は有料版の検討が必要です。有料版(Level1)は月間 9 ドル課金、1000 問い合わせ/月まで対応となります。

NetlifyForms 価格表
https://www.netlify.com/pricing/#forms

price-netlify

また、上記で説明した、zappier と連携する場合は、zappier の価格設定も気になります。
zappier の無料枠は、100tasks/月までとなりますので、NetlifyForms と同様に 100 件以上の問い合わせが考えられる場合は、有料版の検討が必要でしょう。有料版(STARTER)は 19 ドル/月、750tasks/月となっています。

zappier 価格表
https://zapier.com/app/billing/plans

price-zappier

(件数を無駄にカウントされないようにする為、Netlify スパム機能(標準装備)の導入は必要かと思います。)

3.3. Netlify Forms からデータベースへの連携

今回は、Netlify Forms から Gmail への連携機能の紹介となりましたが、さらに、GoogleSheets や Airtable(クラウドデータベース、kintone のようなもの)との連携も可能となっています。これら連携により、問い合わせに対して自動返信メールの送信に加え、顧客管理台帳への自動書き込み等の自動化が可能になります。ただし、この機能を実現する為には Zappier の有料版の導入が必須となります。

4. 参考サイト

jQuery + HTML でフォームの簡易確認を挟む
https://tetch1987.com/shittakabull/web/jquery-html-form-confirm/

JS チェックボックス 複数値取得
https://itsakura.com/js-checkbox

確認ダイアログに表示する方法
https://qiita.com/ming/items/345b7b78b0a91626321c

Discussion