無料でお問い合わせフォームを作る方法|GAS+スプレッドシート+Gmail通知(外部サービス不要)
概要
今回は無料でお問い合わせフォームを作る方法を、外部サービスに頼らずGoogle Apps Script(GAS)とスプレッドシート・Gmailだけで実現する手順として紹介していきます。
以前、
無料で静的サイトに問い合わせフォームを実装する方法🔗 shinpinoshi.comという記事でFormsubmitを使ったやり方を書きました。
あれはメール転送だけで完結する手軽さが魅力なんですが、運用していると「送られてきた内容を一覧で見返したい」「第三者サービスを挟まずに済ませたい」と思うようになってきたんですよね(- -;
そこで今回は、Google Apps Script(GAS)+スプレッドシート+Gmail通知という構成に作り替えました。
送信内容はスプレッドシートにどんどん溜まっていき、同時にGmailにも通知が飛んでくるので、見逃しもありません。
しかも使うのはGAS・スプレッドシート・GmailというすべてGoogle公式の仕組みだけなので、Formspreeのような外部サービスへの業務委託も発生しません。
プライバシーポリシー上も「保管先はGoogleのみ」とシンプルに書けます。
当ブログのお問い合わせフォームも実際にこの構成で動いているので、その中身をベースに解説していきますね(^^
料金は完全に無料で、サーバーも不要です。
それではやっていきましょう!
目次
GAS製お問い合わせフォームの仕組み(全体像)
まずは全体の流れを掴んでおきましょう。
今回作るのは、次のように動く仕組みです。
ブログに置いた自作フォームからGoogle Apps Script(GAS)のWebアプリへデータを送り、GASがその内容をスプレッドシートに記録しつつ、Gmailで通知する、という構成です。
ポイントは、メール転送サービスやフォーム作成サービスといった第三者サービスを一切挟まないところです。
使うのはGAS・スプレッドシート・Gmailという公式の仕組みだけなので、追加のアカウント登録もいりません(^^b
それでは順番に作っていきます。
GASでお問い合わせフォームを作る手順
ここからは実際に、GAS+スプレッドシート+Gmail通知のお問い合わせフォームを作る手順を6ステップで進めていきます。
1. スプレッドシートを用意
まず、送信内容を記録するスプレッドシートを作ります。
Googleドライブで新規スプレッドシートを作成し、1行目に次の見出しを入れておきましょう。
1行目の見出し
1 | 日時 送信元 ニックネーム メール 種別 内容 UA Referrer |
作成したら、URLhttps://docs.google.com/spreadsheets/d/<この部分>/editの<この部分>がスプレッドシートIDです。
後でGASから参照するので控えておきます。
2. Google Apps Scriptを書く
次に、フォームから送られてきたデータを受け取ってスプレッドシートに記録し、Gmailで通知するGASを作ります。
スプレッドシートの「拡張機能 → Apps Script」を開き、下記のコードを貼り付けてください。
contact-handler.gs
1 | function doPost(e) { |
SpreadsheetApp.openByIdでシートを開いてappendRowで1行追記し、続けてMailApp.sendEmailで通知を飛ばす、という流れです。
スプレッドシートIDや通知先メールは、コードに直書きせずスクリプトプロパティから読むようにしています。
スパムが大量に来たときにこの枠を食い潰さないよう、本番では「1日90通を超えたらメール送信だけスキップ(スプレッドシート記録は継続)」というカウンターを足しておくと安心です。
3. スクリプトプロパティを設定
コード内の_prop('SPREADSHEET_ID')などが参照する値を登録します。
エディタ左の歯車アイコン(プロジェクトの設定)→「スクリプトプロパティ」で、次の2つを追加してください。
- SPREADSHEET_ID
- 手順1で控えたスプレッドシートのID
- NOTIFY_TO
- 通知メールを受け取りたい自分のメールアドレス
間違えないように注意です!!
4. ウェブアプリとしてデプロイ
GASをウェブアプリとして公開します。
右上の「デプロイ」→「新しいデプロイ」を選び、ダイアログ左上の歯車から種類を「ウェブアプリ」にして、次の設定でデプロイします。
- 次のユーザーとして実行
- 自分(自分の権限でスプレッドシートとGmailを操作する)
- アクセスできるユーザー
- 全員(ブログの訪問者が誰でも送信できるように)
デプロイするとhttps://script.google.com/macros/s/.../execという形のURLが発行されます。
これが自作フォームの送信先になるので控えておきましょう。
`SpreadsheetApp`や`MailApp`を使うコードは別途OAuthの承認が必要で、これはエディタで`doGet`を手動実行すると承認フローが立ち上がります。
「Googleで確認されていないアプリ」という警告が出ますが、自分のスクリプトなので「詳細」→「(プロジェクト名)に移動」→「許可」で進めてOKです。
5. HTMLフォームを設置
いよいよブログ側にフォームを置きます。
当ブログのフォームをベースにしたHTMLが下記です。
contact/index.html
1 | <form id="contact-form" novalidate> |
続いて、フォームを送信するJavaScriptです。GAS_ENDPOINTに手順4で控えたURLを入れてください。
contact-form.js
1 | const GAS_ENDPOINT = 'https://script.google.com/macros/s/<あなたのデプロイID>/exec'; |
入力チェック→スパム対策→GASへfetchでPOST→送信完了表示、という流れです。
ここで押さえておきたいのがfetchのmode: 'no-cors'です。
そこで`mode: 'no-cors'`を付けると、レスポンスの中身は読めなくなる代わりに、送信自体は通るようになります。
このとき開発者ツールに`ERR_ABORTED`が出ることがありますが、これはエラーではなく、GAS側の`doPost`はちゃんと最後まで動いているので問題ありません。
なお、ハニーポットや連投防止は無くても動きますが、公開フォームはどうしてもスパムボットに狙われるので、入れておくことを強くお勧めします。
6. 動作確認
最後に動作を確認します。
まずブラウザでGASの/execURLにそのままアクセスし、{"ok":true,...}が返れば疎通はOKです(403が出る場合は手順4のアクセス権かOAuth承認を見直してください)。
次に実際にフォームから送信してみて、次の2つが起きれば成功です(^^
- スプレッドシートに行が増える
- 日時・ニックネーム・メール・種別・内容などが1行追記される
- Gmailに通知が届く
NOTIFY_TOに設定したアドレスに件名付きで届く
GAS+スプレッドシート方式のメリット・デメリット
この構成の良いところと注意点もまとめておきますね。
- 完全無料・外部サービス不要
- GAS・スプレッドシート・Gmailだけで完結。第三者サービスへの業務委託が発生しない
- データが手元に溜まる
- 回答がスプレッドシートに蓄積され、フィルタやSUMIFSで集計・CSVエクスポートも自在
- 通知と記録の両取り
- スプレッドシートに残しつつGmailにも飛ぶので、見逃さず後から見返せる
- デプロイとOAuth承認に少しクセがある
- 種類を「ウェブアプリ」にする・アクセスを「全員」にする・
doGet実行で承認、ここを忘れると調査が大変
- 種類を「ウェブアプリ」にする・アクセスを「全員」にする・
- 送信の成否がJS側で取れない
no-corsのためレスポンスを読めない。確実性を求めるなら別途プロキシ等が必要
- Gmailは1日100通まで
- 大量送信があるとメール枠を使い切るので、上限手前で通知だけ止めるガードを入れておくと安心
正直、最初のデプロイとOAuth承認まわりだけ少しとっつきにくいですが、一度動いてしまえばあとはほったらかしでデータが溜まっていくので、かなりお勧めです。
Googleフォームや外部サービスと比べてどうなの?
「お問い合わせならGoogleフォームでよくない?」と思う方もいるかもしれませんね。
Googleフォームでも回答をスプレッドシートに溜めること自体はできますが、フォームの見た目はGoogle側のUIに縛られてしまい、ブログのデザインに馴染ませるのは難しいです。
今回のGAS方式なら、フォームのHTMLは手順5のように自分で書くので、サイトのデザインに合わせてレイアウトを自由に作れるのが大きな違いです。
FormspreeやFormsubmitのような外部のフォーム送信サービスと比べた場合は、送信内容の保管先がGoogleだけで完結する点が今回の方式の強みになります。
第三者サービスを挟まないので、プライバシーポリシーに「送信内容はGoogleのスプレッドシートにのみ保存します」とシンプルに書けますし、無料枠の制限や有料プランへの誘導を気にする必要もありません。
逆に、とにかく最短でメール転送だけしたいなら、以前書いた
無料で静的サイトに問い合わせフォームを実装する方法🔗 shinpinoshi.comのFormsubmit方式のほうが手軽です。
「データを手元に残して見返したい・集計したい」のか「とにかく手早くメールで受け取れればいい」のかで選び分けるのがいいと思います(^^
締め
今回は、外部サービスに頼らずGAS+スプレッドシート+Gmailだけで無料のお問い合わせフォームを作る方法を、当ブログの実装をベースに紹介しました。
Formsubmitのメール転送方式が「とにかく手軽」だとすると、今回の方式は「データを自分の手元に残しつつ、Google公式の仕組みだけで完結させる」方向ですね。
問い合わせを後から見返したり集計したりしたい方には、こちらがぴったりだと思います。
サーバーいらずかつ無料、しかも保管先がGoogleだけで規約的にもクリーンなので、個人開発のサイトやブログのお問い合わせ口としてはかなり優秀です。
ぜひ自分のサイトにも導入してみてください(^^
複数サイトで使い回せる完成版コードと、デプロイやOAuth承認でつまずいたときの対処まで入れてあるので、迷わず設置したい方はこちらもどうぞ。
▶ お問い合わせフォーム設置キット(ココナラ)
以上となります。
色々試しましたが、レイアウトも自由自在なので、この方法が良いかな?と思います。
それではお疲れさまでした!





