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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Ajax

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

Q&A

解決済

1回答

776閲覧

GASのJSONPを返す処理でフォーム送信後にページ遷移して画面に「undefined({"work":"success"})が表示される

cube_3110

総合スコア27

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Ajax

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

0グッド

0クリップ

投稿2019/03/02 02:02

前提・実現したいこと

お問い合わせフォームのsubmitボタン押下してフォーム送信後、JSONPを返してお問い合わせフォームの画面に戻ること。

発生している問題・エラーメッセージ

お問い合わせフォームのsubmitボタン押下してフォーム送信後、ページ遷移して画面にundefined({"work":"success"})が表示される

該当のソースコード

Vue

1<template> 2<div id="contact"> 3 <section class="contact_section"> 4 <div class="container"> 5 <form action="GASのウェブアプリケーションのURL" class="form-box"> 6 <input name="SPREADSHEET_ID" type="hidden" value="-スプレッドシートのID"> 7 <input name="SHEET_NAME" type="hidden" value="フォームデータ"> 8 <h2 class="contact_h2">Contact</h2> 9 <div class="form-item-box"> 10 <label class="control-label">Name</label> 11 <div class=""> 12 <input type="text" class="form-control" name="your-name" placeholder="Name"> 13 </div> 14 </div> 15 <div class="form-item-box"> 16 <label class="control-label">Email</label> 17 <div class=""> 18 <input type="email" class="form-control" name="your-email" placeholder="example@email.com"> 19 </div> 20 </div> 21 <div class="form-item-box"> 22 <label class="control-label">Message<span class="label-required">必須</span></label> 23 <div class=""> 24 <textarea class="form-control" name="your-message" placeholder="Message" rows="8" required id="message"></textarea> 25 </div> 26 </div> 27 <div class="form-item-box"> 28 <div class="form-button-box"> 29 <button class="form-button" type="submit" v-on:click="sendMessage()">Submit</button> 30 </div> 31 </div> 32 </form> 33 </div> 34 </section> 35</div> 36</template> 37 38<script> 39 export default { 40 title: 'Contact', 41 description: 'contact_pages', 42 methods: { 43 sendMessage() { 44 var form = $('form'); 45 var submitBtn = form.find('button[type=submit]'); 46 if(getElementById('message') === '') { 47 alert('メッセージを入力してください'); 48 return false; 49 } 50 $.ajax({ 51 url: form.attr('action'), 52 dataType: 'jsonp', 53 data: form.serialize(), 54 beforeSend: function() { 55 return submitBtn.prop('disabled', true); 56 }, 57 complete: function() { 58 return submitBtn.prop('disabled', false); 59 }, 60 jsonpCallback: 'console.log', 61 error: function(response) { 62 return console.log(response); 63 } 64 }); 65 } 66 } 67 } 68</script>

GoogleAppsScript

1function doGet(e){ 2 // フォームから受け取った値を使って必要な変数を作っていきます -------- 3 var sheet = SpreadsheetApp.openById(e.parameter.SPREADSHEET_ID).getSheetByName(e.parameter.SHEET_NAME) 4 var last_row = sheet.getLastRow() 5 6 // スプレッドシートに追加したくない値を「ignore_array」で指定して、 7 // 必要なデータだけを「form_data」に入れていきます。 8 var ignore_array = ['メールアドレス', 'SPREADSHEET_ID', 'SHEET_NAME', 'callback', '_'] 9 var form_data = {} 10 for(var key in e.parameter){ 11 if(ignore_array.indexOf(key) === -1){ 12 form_data[key] = e.parameter[key] 13 } 14 } 15 16 // スプレッドシートの初期設定 -------- 17 // スプレッドシートに何も値が入っていないと以降の処理で問題が起きる+フォームの送信日時を挿入する為に、 18 // A1に「タイムスタンプ」を挿入します。 19 if(last_row === 0 && sheet.getLastColumn() === 0){ 20 sheet.getRange(1, 1).setValue("タイムスタンプ") 21 last_row++ 22 } 23 24 // Spreadsheetにフォームのデータを挿入 -------- 25 // スプレッドシートの1行目をヘッダーとして取得します。 26 var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0] 27 // 「form_data」に「for in」を使ってループ処理を行います。 28 for(var key in form_data){ 29 for(var i = 0; i < headers.length; i++){ 30 if(headers[i] === key){ 31 // ヘッダーとkeyが一致した時に、そのヘッダーの列の新しい行(最後にデータが入ってる行の次の行)に 32 // フォームの値を挿入します。 33 sheet.getRange(last_row + 1, i + 1).setValue(form_data[key]) 34 break 35 } else if(headers.length === i + 1){ 36 // ヘッダーとkeyが最後まで一致なかった時は、そのkeyを新しいヘッダーとして追加して、 37 // そのヘッダーの列の新しい行にフォームの値を挿入します。 38 var new_column = sheet.getLastColumn() + 1 39 sheet.getRange(1, new_column).setValue(key) 40 sheet.getRange(last_row + 1, new_column).setValue(form_data[key]) 41 } 42 } 43 } 44 45 // フォーム以外のデータ挿入と個別処理 -------- 46 // 今回はタイムスタンプだけですが、例えば個別の「お問い合わせ番号」が要るとか、 47 // セルの最後に「進捗状態」を入れる等用の処理です。 48 headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0] 49 for(var i = 0; i < headers.length; i++){ 50 switch(headers[i]){ 51 case 'タイムスタンプ': 52 // 「タイムスタンプ」の場所に日時のデータを挿入。 53 sheet.getRange(last_row + 1, i + 1).setValue(new Date()) 54 break 55 } 56 } 57 58 // フォームのデータにメールアドレスが有ればメールを送信 -------- 59 if(e.parameter.メールアドレス){ 60 send_mail(e.parameter.メールアドレス, headers, form_data) 61 } 62 63 // JSONPを返す処理 -------- 64 // 今回は単純なデータしか返していませんが、頑張れば色々出来そうですねー。 65 var return_json = JSON.stringify({work:'success'}) 66 return ContentService.createTextOutput(e.parameter.callback + '(' + return_json + ')').setMimeType(ContentService.MimeType.JAVASCRIPT) 67} 68 69function send_mail(mail_address, headers, form_data){ 70 // HTMLメールとテキストメールのテンプレートを準備します。 71 var html_mail = HtmlService.createTemplateFromFile('html_mail') 72 html_mail.headers = headers 73 html_mail.form_data = form_data 74 75 var text_mail = HtmlService.createTemplateFromFile('text_mail') 76 text_mail.headers = headers 77 text_mail.form_data = form_data 78 79 // メール送る際のオプションを設定します。 80 var options = {} 81 options.noReply = true 82 // 「evaluate()」を行う事でテンプレート内のスクリプトを実行する事が出来ます。 83 options.htmlBody = html_mail.evaluate().getContent() 84 85 // テキストメールとオプションを設定してメールを送信。 86 GmailApp.sendEmail(mail_address, '自動返信メール - 【GAS】 スプレッドシートと連携したAjaxフォーム', text_mail.evaluate().getContent(), options) 87}

試したこと

スプレッドシートにデータが挿入されていることは確認しました。

補足情報(FW/ツールのバージョンなど)

JSONPを返す処理が怪しい気がしてます。

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

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

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

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

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

guest

回答1

0

自己解決

jQueryの設定が有効になっていませんでした。
Submitボタン押下時の動作をデベロッパーツールのconsoleで確認したら$ is not foundとエラーログが一瞬表示された為、設定を見直して再度試してみたら問題なく通りました。

投稿2019/03/02 15:46

cube_3110

総合スコア27

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問