質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

4回答

1187閲覧

WebサイトのフォームからGoogleフォームへデータを送信する時、チェックボックスが2つ以上の場合送信できない。

Webtuuuu

総合スコア30

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

1クリップ

投稿2018/12/19 04:20

編集2018/12/19 04:23

前提・実現したいこと

Webサイトにフォームを設置し、
入力されたデータをAjaxを使用してGoogleフォームにデータを送信→Googleスプレッドシートにデータを転記。
といったものを再現しようとしています。
現状は“データを送信”に関してはできていますが一部に関してデータを送信できない状態です。

▼流れ
0. フォームに記入
0. 「送信ボタン」をクリック
0. AjaxでValue値を取得しGoogleフォームへ転送 ※ここで問題が発生しています。
0. Googleフォームからスプレッドシートへ転記

発生している問題

実際に発生している問題は、
チェックボックスが複数選択された場合にデータが転送できない」といったものです。

テキストボックス、ラジオボタンは正常にデータ転送ができています。
チェックボックスが1つのみ選択されている場合も転送ができています。
しかし、チェックボックスが2つ以上選択された場合は転送できない。

といった状態です。
※チェックボックスが2つ以上選択されていてもその他のテキストボックスやラジオボタン等のデータの転送へは影響していません。

該当のソースコード

HTMLフォーム内のnameが一致したもののvalue値を取ってきて、
AjaxでGoogleフォーム内の一致するIDの位置に送信している形になります。

html

1<div class="box" id="googleform"> 2 <form> 3 <div> 4 <label for="name">名前</label> 5 <input id="name" type="text" name="name"> 6 </div> 7 8 <div> 9 <p>性別</p> 10 <label><input type="radio" name="gender" value="" /></label> 11 <label><input type="radio" name="gender" value="" /></label> 12 </div> 13 14 <div> 15 <p>好きな食べ物</p> 16 <label><input type="checkbox" name="food" value="ラーメン" />ラーメン</label> 17 <label><input type="checkbox" name="food" value="寿司" />寿司</label> 18 <label><input type="checkbox" name="food" value="パスタ" />パスタ</label> 19 <label><input type="checkbox" name="food" value="おにぎり" />おにぎり</label> 20 <label><input type="text" name="food" value="その他の回答" /></label> 21 </div> 22 <input id="submitBtn" type="submit" value="送信"> 23 </form> 24 25 <div id="clearopen"> 26 <h2>送信完了しました。ありがとうございました。</h2> 27 </div> 28 <div id="missopen"> 29 <h2>送信に失敗しました。ページを更新して再度送信してください。</h2> 30 </div> 31</div>

js

1$(document).ready(function () { 2 $("#googleform").submit(function (event) { 3 //名前を取得 4 var name = $("#googleform input[name=name]").val(); 5 //性別を取得 6 var gender = $("#googleform input[name=gender]:checked").val(); 7 //好きな食べ物を配列で取得 8 var food = $("#googleform input[name=food]:checked").map(function () { 9 return $(this).val() 10 }).get().join(','); 11 12 //検証ツール確認用 13 console.log(food); 14 15 $.ajax({ 16 url: "https://docs.google.com/forms/d/e/1FAIpQLSdSqqBScuvl2wd0BYtgGFM7bK3_M01NTZyVm8Qt8dntDW4TJg/formResponse", 17 data: { 18 "entry.1484943732": name, 19 "entry.1660322412": gender, 20 "entry.652964602": food 21 }, 22 type: "POST", 23 dataType: "xml", 24 statusCode: { 25 0: function () { 26 //送信に成功したときの処理 27 $("form").slideUp(); 28 $('#clearopen').slideDown(); 29 }, 30 200: function () { 31 //送信に失敗したときの処理 32 $("form").slideUp(); 33 $('#missopen').slideDown(); 34 } 35 } 36 }); 37 event.preventDefault(); 38 }); 39});

試したこと

もともとは以下のコードは.mapを使用しておらず.valで取得していましたが、
チェックボックスが複数選択の場合は先頭の一つしか取得できないということでしたので.mapに変更しました。

js

1var food = $("#googleform input[name=food]:checked").map(function () { 2  return $(this).val() 3}).get().join(',');

問題は以下の箇所だと考えており、今現状は変数foodの中に'ラーメン','寿司'のような形でデータが入っています。

js

1$.ajax({ 2data: { 3  "entry.1484943732": name, 4  "entry.1660322412": gender, 5  "entry.652964602": food 6},

entry.652964602の中に'ラーメン','寿司'としてGoogleフォームに送るから反映されないものだと考え
.mapで取得した配列から配列ごとに個別の変数を定義してみましたがこちらもうまくいきませんでした。

その時のコードは以下です。
※先ほど上に書いたコードから変更ない部分はハショってます

js

1$(document).ready(function () { 2 $("#googleform").submit(function (event) { 3 //好きな食べ物を配列で取得 4 var food = $("#googleform input[name=food]:checked").map(function () { 5 return $(this).val() 6 }).get(); 7 8 var food_a = food[0]; 9 var food_b = food[1]; 10 var food_c = food[2]; 11 var food_d = food[3]; 12 13 $.ajax({ 14 data: { 15 "entry.652964602": food_a, 16 "entry.652964602": food_b, 17 "entry.652964602": food_c, 18 "entry.652964602": food_d 19 } 20 }); 21 event.preventDefault(); 22 }); 23});

しかしそもそもこれだとチェックボックスが1つしか選択されていなくても送信できなくなりました。
(私の知識量ではそのようになったのか原因がわかっていません…。)

補足情報

サンプルを作成したのでご確認ください。
デモページ
でもページ内のフォームはテスト用ですのでお好きにデータを送信いただいて構いません。

また、テスト用の送信先のGoogleフォームとスプレッドシートのURLも公開しますのでご自由にアクセスいただけます。
Googleフォーム
Googleスプレッドシート

▼以下参考にしたサイト
【jQuery】チェックされたチェックボックスを取得する
stack overflow

今回質問するにあたった経緯が、私自身がやっておりますブログでこのWebサイトフォームからGoogleフォームへデータを送信するやり方の解説記事を掲載していた所、コメントでチェックボックスの複数選択の場合正常に動作しないと指摘を頂いたためです。

↓その対象の記事
Googleform埋め込みでラジオボタンのデータを送信する方法
Googleform埋め込みで回答完了画面に遷移させない方法

あれやこれやと試行錯誤してみてはいるものの配列でvalue値を取得するところまではできてもAjaxでの制御が上手くできずに手詰まりの状態です。

GASを使用すればできるとの情報もありましたができれば外部のツールは使用せずにクリアしたいため、
解決策があればご教示いただきたい次第です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

フォームデータとしてJavaScriptのオブジェクトを渡す場合は、同じ名前のメンバは最後のデータで上書きされてしまうとためうまくいかないのだと思います。
JavaScriptのFormDataクラスを利用して実現できないでしょうか。
jQueryが苦手なので、間違っているかもしれないですが、こんな感じかと思います。

JavaScript

1var data = new FormData; 2data.append('entry.1484943732', $("#googleform input[name=name]").val()); 3data.append('entry.1660322412', $("#googleform input[name=gender]:checked").val()); 4$("#googleform input[name=food]:checked").each(function () { 5 data.append('entry.652964602', $(this).val()); 6}); 7$.ajax({ 8 url: "https://docs.google.com/forms/d/e/1FAIpQLSdSqqBScuvl2wd0BYtgGFM7bK3_M01NTZyVm8Qt8dntDW4TJg/formResponse", 9 data: data, 10 processData: false, 11 contentType: false, 12 type: "POST", 13 statusCode: { 14 0: function () { 15 //送信に成功したときの処理 16 $("form").slideUp(); 17 $('#clearopen').slideDown(); 18 }, 19 200: function () { 20 //送信に失敗したときの処理 21 $("form").slideUp(); 22 $('#missopen').slideDown(); 23 } 24 } 25});

追記

FormDataをjQueryのajaxで送るのがうまくいかない場合は、processDatacontentTypefalseを設定しないとうまくいかなかったんだった気がします。コードに追記してます。

投稿2018/12/19 05:08

編集2018/12/19 05:23
mks

総合スコア80

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Webtuuuu

2018/12/19 08:47

回答ありがとうございました。 mks様の回答いただいたソースコードで実行したところ、無事正常に複数の値をGoogleフォームに送信することができました。 デモページにあるチェックボックス選択エリア内にあるテキストボックスからの取得はできていませんが、 当質問の内容とは異なる事象ですので解決とさせていただきます。 ----- mks様の回答をベストアンサーとさせていただきます。 大変助かりました。ありがとうございます。
guest

0

これはまさに、Google Formの特性ですね。
Google Formは、urlにパラメータをつけてもチェックを入れられます(質問者様のはそれをPOSTでやっているにすぎないです)。以下、そのパターンで動作する例を示します。なので、POSTで動作できるかは分からないです。

そこで

とすると、ラーメンにチェックが入ります。

しかし

とすると、ラーメンにも寿司にもチェックが入りません。

そして

とすると、ラーメンにも寿司にもチェックが入ります。

従って、動作としてチェックボックスパーツは、nameが自分と同じものの=のあとに自分と全く同じ値があったときだけチェックがつく挙動だと推測されます。
ですので、postするdataに同じキーを2つ持って、それぞれにラーメン、寿司、パスタとしていかないといけないと思います。
ただ、これはjsのオブジェクトとしては不適切なデータではないかと思うので(同じキーを複数持つのはどう考えても変。検証してませんが)正常に送信できない可能性が高いと思います。(予想する挙動は同じキーの最後の値だけチェックが付く挙動)
→ここは質問の後段で検証済みでしたね。やはりobjectとして(同じキー複数は)不正なので、どう頑張っても複数のチェック分を正常には送信できないでしょう。

回避策としては、チェックのものを使わないでなんとかするか、チェックの部分はurlにするか、じゃないでしょうか?

投稿2018/12/19 04:53

編集2018/12/19 04:58
papinianus

総合スコア12705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/12/19 04:57

特性というか癖がすごい(感想・・・)
Webtuuuu

2018/12/19 08:56

「URLにパラメーターをつければいけるのでは?」ということまでは頭が回りましたが それもまたスタイリッシュではないなぁと思ったりしてました…。 しかしながらベストアンサーに選んだ方のコードで無事取得から送信まで実装できました! 回答ありがとうございました!
guest

0

チェックボックスで「複数選択」とする場合は、通常はnameに[]をつけてhtml側を配列にします。

html

1 <label><input type="checkbox" name="food[]" value="ラーメン" />ラーメン</label> 2 <label><input type="checkbox" name="food[]" value="寿司" />寿司</label> 3 <label><input type="checkbox" name="food[]" value="パスタ" />パスタ</label> 4 <label><input type="checkbox" name="food[]" value="おにぎり" />おにぎり</label> 5 <label><input type="text" name="food[]" value="その他の回答" /></label>

でないと「チェックした中で順番的に最後にある要素」のみしか送信されません。

投稿2018/12/19 04:26

編集2018/12/19 04:27
m.ts10806

総合スコア80842

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

papinianus

2018/12/19 04:59

そこの部分は、mapで頑張っているように思います。またいくらfood[]としても、post先がgoogle formなので、うまく解釈してくれないと思います。
x_x

2018/12/19 05:01

nameに[]をつけるというのはPHPの話では?
m.ts10806

2018/12/19 05:05

ご指摘ありがとうございます。 「そこまで頑張って作らなくても取得部分は楽に出来るよ」というヒントになればと(Googleフォーム基準の回答になっていないことは承知です・・)
Webtuuuu

2018/12/19 08:59

純粋に知識不足で「複数取得の配列にする場合はHTML側のnameに[]つける必要がある」ということを今日初めて知りました…。 大変勉強になりました。 ありがとうございます!
mks

2018/12/19 09:33 編集

横槍すみません。誤解が生じてしまっているようなので補足しますが、'[]'をつけないと取得できないのはx_xさんも指摘されている通り、サーバ側がPHPの場合の制限で、フォーム内の要素のnameが同じでも、送信自体はちゃんとされるはずだったかと。 たとえばサーバ側がPerlの場合なら、 read(STDIN, $postdata, $ENV{'CONTENT_LENGTH'}); を実行すると、'entry.652964602=ラーメン&entry.65642964602=寿司'のようなデータが取れたはずです。
m.ts10806

2018/12/19 09:48 編集

補足ありがとうございます
guest

0

まず、 .join(',') は不要です。つけると「ラーメン,寿司」というデータを送ることになります。
PHP以外で配列を送る際には、ajax()のtraditionalオプションを true にしてください
https://api.jquery.com/jQuery.ajax/

投稿2018/12/19 05:44

x_x

総合スコア13749

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Webtuuuu

2018/12/19 08:53

.join(',')は不要だったのですね…。 二つ以降取得した場合の形式が 「 [ " hoge " , " hoge " ] 」 ではうまくいかないと考えたので 「 hoge , hoge 」 にすべきだという頭になっていました…。 勉強不足でした…
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問