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

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

新規登録して質問してみよう
ただいま回答率
85.31%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

1310閲覧

HTMLフォームのPOSTデータをPHP→GASの順番で利用したい。

teratail_masa

総合スコア2

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2023/07/02 14:08

編集2023/07/03 07:24

実現したいこと

HTMLで作成されているフォームから受け取ったPOSTデータをPHPファイルに送り、そのPHPファイルでユーザーにPOST内容の確認メールを送信した後、データをGASに送りgoogleスプレットシートにも出力される仕組みを作りたい。

前提

表題の通りです。ただし会社のサーバーの関係上、composerを使用したりgoogle cloud platformを使用することができません。
HTMLフォーム → ユーザーへメールを送る機能を実装したPHPファイル → googleスプレットにPOSTデータの内容を出力(GAS言語)
の流れでデータを送りたい所存です。

ユーザーへPOSTデータを使用した確認メールを送る機能はすでにPHPファイルに実装されています。

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

コードは一通り実装したが、googleスプレットシートに出力がこない。

該当のソースコード

HTMLフォーム

1<form action="./mail.php" method="post" enctype="multipart/form-data" id="myform"> 2 <div class="l-main-form__bg"> 3 <table class="p-main-form--survey"> 4 <tbody class="p-main-form__tbody"> 5 <tr class="p-main-form__tr--survey"> 6 <th class="p-main-form__th--survey"><span class="--blue">必須</span>お名前</th> 7 <td class="p-main-form__td--survey"> 8 <input type="text" name="お名前" class="--input" placeholder="例:鈴木太郎" autocomplete="name"> 9 </td> 10 </tr> 11 <tr class="p-main-form__tr--survey"> 12 <th class="p-main-form__th--survey --sp-block"><span class="--blue">必須</span>生年月日</th> 13 <td class="p-main-form__td--survey"> 14 <input type="text" name="生年月日" class="--input js-retype" placeholder="例:19921201 ※1992/12/1生まれの場合" autocomplete="tel"> 15 <p id="previous_input2" class="c-previous_alert js-retype-alert"></p> 16 </td> 17 </tr> 18  〜〜〜〜〜〜〜〜 一部省略 〜〜〜〜〜〜〜〜 19 <!-- 選択エリア1 --> 20 21 <!-- 選択エリア2 --> 22 <tr class="p-main-form__tr--survey"> 23 <th class="p-main-form__th--survey --adjust"><span class="--blue">必須</span>下記項目の中で特に興味があるものを2つお選びください。</th> 24 <td class="p-main-form__td--survey"> 25 <input type="checkbox" name="Q2" id="c-select-about1" class="c-previous-radio js-count2-checkbox" onclick="limitCheckboxSelection(this)" value="ホワイトニング材・照射器の漂白効果の実証体験"> 26 <label for="c-select-about1">ホワイトニング材・照射器の漂白効果の実証体験</label><br><br> 27 <input type="checkbox" name="Q2" id="c-select-about2" class="c-previous-radio js-count2-checkbox" onclick="limitCheckboxSelection(this)" value="ホワイトニングで予防歯科強化"> 28 <label for="c-select-about2">ホワイトニングで予防歯科強化</label><br><br> 29 <input type="checkbox" name="Q2" id="c-select-about3" class="c-previous-radio js-count2-checkbox" onclick="limitCheckboxSelection(this)" value="ホワイトニングで自費増収"> 30 <label for="c-select-about3">ホワイトニングで自費増収</label><br><br> 31 <input type="checkbox" name="Q2" id="c-select-about4" class="c-previous-radio js-count2-checkbox" onclick="limitCheckboxSelection(this)" value="オフィスとホームホワイトニングの使い分け知識"> 32 <label for="c-select-about4">オフィスとホームホワイトニングの使い分け知識</label><br><br> 33 <input type="checkbox" name="Q2" id="c-select-about5" class="c-previous-radio js-count2-checkbox" onclick="limitCheckboxSelection(this)" value="難症例の術式選択や処置方法、知覚過敏を抑制する診断のコツ"> 34 <label for="c-select-about5">難症例の術式選択や処置方法、知覚過敏を抑制する診断のコツ</label> 35 </td> 36 </tr> 37 <!-- //選択エリア2 --> 38  〜〜〜〜〜〜〜〜 一部省略 〜〜〜〜〜〜〜〜 39 <!-- 入力エリア--> 40 <tr class="p-main-form__tr--survey"> 41 <th class="p-main-form__th--survey --adjust"> 42 <span class="--blue">必須</span> 43 <p class="c-form-survey--text"> 44 セミナーの参加目的をできる限り詳細に教えてください。<br class="u-db"> 45 (当日の講義内容の参考にさせていただきます。)<span class="--white --adjust">50文字以上</span> 46 </p> 47 </th> 48 <td class="p-main-form__td--survey"> 49 <textarea name="input_area" rows="4" cols="50" class="c-form-survey--textarea js-textarea" placeholder="〇〇〇〇〇〇〇〇〇●〇〇〇〇〇〇〇〇〇●〇〇〇〇〇〇〇〇〇●〇〇〇〇〇〇〇〇〇●〇〇〇〇〇〇〇〇〇●"></textarea> 50 <p id="previous_input_textarea" class="c-previous_alert js-retype-alert"></p> 51 </td> 52 </tr> 53 <!-- //入力エリア--> 54 </tbody> 55 </table> 56 </div> 57 <div class="privacy-box__parent--wrap"> 58 <div class="privacy-box__parent"> 59 <p class="c-previous-text">回答のコピーが指定したアドレスにメールで送信されます。</p> 60 </div> 61 <p id="previous_alert" class="c-previous_alert"></p> 62 <div class="submit_box-wrap"> 63 <input type="submit" value="送信する" class="c-previous-submit" onclick="checkForm(event)"> 64 </div> 65 </div> 66 </form>

mail.php

1<?php 2メールを送る関数() 3setSheet(); 4function setSheet(){ 5 // GASのURLにPOSTデータを送信 6 $postData = array('input_data' => json_encode($_POST)); 7 $content = http_build_query($postData, '', '&'); 8 9 $options = array( 10 'http' => array( 11 'header' => 'Content-type: application/x-www-form-urlencoded', 12 'method' => 'POST', 13 'content' => $content 14 ) 15 ); 16 17 $context = stream_context_create($options); 18 $result = file_get_contents("GASをデプロイした後に発行されるURLを指定", false, $context); 19} 20?>

GAS

1function doPost(e) { 2 var inputJSON = e.parameter.input_data; 3 var inputData = JSON.parse(inputJSON); 4 5 // データの利用例 6 var tmp1 = inputData['お名前']; 7 var tmp2 = inputData['生年月日']; 8 var tmp3 = inputData['電話番号']; 9 var tmp4 = inputData['Email']; 10 var tmp5 = inputData['勤務区分']; 11 var tmp6 = inputData['1回目セミナー']; 12 var tmp7 = inputData['Q1']; 13 var tmp8 = inputData['Q2']; 14 var tmp9 = inputData['Q3']; 15 var tmp10 = inputData['Q4']; 16 var tmp11 = inputData['Q5']; 17 var tmp12 = inputData['input_area']; 18 19 // スプレッドシートへのデータ出力処理 20 var spreadsheet = SpreadsheetApp.openByUrl("スプレットーシートのURLを指定"); 21 var sheet = spreadsheet.getSheetByName("該当シートの名前"); 22 var row = sheet.getLastRow() + 1; 23 sheet.appendRow([ 24 tmp1, 25 tmp2, 26 tmp3, 27 tmp4, 28 tmp5, 29 tmp6, 30 tmp7, 31 tmp8, 32 tmp9, 33 tmp10, 34 tmp11, 35 tmp12 36 ]); 37} 38

試したこと

PHPまでの処理まうまくいっており、ユーザーへ確認メールも届いています。
しかしスプレットシート側に出力がきません。
お恥ずかしながらGASのデバック方法がよくわからずdoPost()をテストする方法を
https://prtn-life.com/blog/gas-log-gcp
を参考にしながらやろうとしたのですが、テスト関数にどのような内容を入れて良いかわからず手が止まってしましました。

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

GASのデプロイは「ウェブアプリ」として実行。

GASへの理想の出力としてはフォームで入力された各10種類のname属性の値がスプレットシートの1フィールドに1個ずつ入ることです。そして、type="checkbox"などのフォームで複数選択されていた場合はその全ての値が1フィールドの中に出力される状態が最終目標です。

※ こちら複数サイトでマルチポストしている内容ですが、他サイトで仮に回答が得られた場合はすべてのサイトで回答結果を追記いたしますので、何卒ご理解の程よろしくお願いいたします。
teratail.com/questions/i18lo1u46bw74j
qiita.com/bugright/questions/14f7c9edb6043f1362e8
マルチポストしている先の URLはこちらですべてとなります。

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

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

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

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

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

guest

回答2

0

自己解決

自己解決いたしました。PHP側で正しくPOSTの値をエンコードし、GAS側でJSON.parse(e.postData.getDataAsString());で正しくパースすることで反映しました。
JSONエンコードに関する問題でした。

PHP

1function setSheet() { 2 3 // POSTデータをそのまま使用する 4 $postData = $_POST; 5 6 // POSTデータをJSONエンコード 7 $postData = json_encode($postData, JSON_UNESCAPED_UNICODE); 8 9 $options = array( 10 'http' => array( 11 'header' => 'Content-type: application/json', // Content-typeをapplication/jsonに変更 12 'method' => 'POST', 13 'content' => $postData 14 ) 15 ); 16 17 $context = stream_context_create($options); 18 19 ile_get_contents("GASのデプロイURLを指定", false, $context); 20}

GAS

1function doPost(e) { 2 var postData = JSON.parse(e.postData.getDataAsString()); 3 4 // スプレッドシートのIDとシート名を設定してください 5 var spreadsheetId = "スプレットシートID"; 6 var sheetName = "シートの名前"; 7 8 // スプレッドシートのオブジェクトを取得 9 var sheet = SpreadsheetApp.openById(spreadsheetId).getSheetByName(sheetName); 10 11 // データの書き込み先の行を取得 12 var lastRow = sheet.getLastRow() + 1; 13 14 // POSTデータをスプレッドシートに出力する 15 var rowData = []; 16 for (var key in postData) { 17 var values = postData[key]; 18 if (Array.isArray(values)) { 19 // 配列の場合は値をカンマ区切りの文字列に変換 20 values = values.join(", "); 21 } 22 rowData.push(values); 23 } 24 25 sheet.getRange(lastRow, 1, 1, rowData.length).setValues([rowData]); 26

投稿2023/07/04 02:28

teratail_masa

総合スコア2

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

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

0

「GAS」の上から2行目の

var inputJSON = e.parameter.input_data;

var inputJSON = e.postData.contents;

に修正した場合どうでしょうか。
(これでもダメな倍は、GASに送るPHP側でCORS周りのエラーが出ている可能性もあります)

投稿2023/07/02 21:26

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

teratail_masa

2023/07/03 01:50

ご回答いただきありがとうございます。 var inputJSON = e.parameter.input_data; に修正し、再度実行してみたのですが変わらず、、 このGASのdoPoat自体にアクセスが来ているかどうか怪しかったので、GASコードに MailApp.sendEmail("自分のメールアドレス", "GASテスト","GASでメールします。"); の一文を追加してみたところメールすら来なかったのでPHPで送信したPOSTデータ自体がGAS側に来ていない気がします。 PHP側で書いたsetSheet()自体が間違っているのでしょうか、、?
teratail_masa

2023/07/03 01:51

自分のメールアドレス部分には本当に存在するメールアドレス(sample@gmail.com)を指定しています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問