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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Google Apps Script

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

Q&A

1回答

1558閲覧

WHERE文で検索した結果をgetData()へ渡す?

kimii

総合スコア12

Google Apps Script

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

0グッド

0クリップ

投稿2019/02/07 00:21

前提・実現したいこと

現在 GoogleAppScriptとCloudSQLを利用して
Webアプリを作っていますが、フォームの値をGasへ渡して
検索結果をHTML側に表示させようとしていますが、検索した結果の関数を
getData()で渡せばいいとはわかるのですが、問題は
WHERE文で検索した結果をgetData()へ渡すにはgetData()に対しても引数で
渡さなければいけないのではと考えましたが、引数を付けて渡しても
next文が読み取れない=値が渡っておらず

どうしたらいいのかわからなくなっております。
どなたか知恵をお貸し頂ければと思います。

■■な機能を実装中に以下のエラーメッセージが発生しました。

HTML側

<!DOCTYPE html> <html> <head> <base target="_top"> </head> <body> <script> function onSuccess(res){ var list=document.getElementById("list"); list.innerHTML=res;

}
</script>

<h1>SQL 2</h1> <form name="f1" method="post" onsubmit="return false;"> name:<input type="text" id="name1" name="name" value=""><br/><br/> <input type="button" value="検索" onclick="google.script.run.withSuccessHandler(onSuccess).sendForm(this.parentNode);"> </form> <br/> <br/> <br/> <table id="list"> <? var datas =getData(); while(datas.next()){ var name =datas.getString("name"); var mail =datas.getString("mail"); var tel =datas.getString("tel"); result+='<tr><td>'+name+'</td><td>'+mail+'</td><td>'+tel+'</td></tr>'; } ?> </table> </body> </html>

gas側

function doGet() {
var output=HtmlService.createTemplateFromFile('index');
return output.evaluate().setTitle('SQL2');
}

function sendForm(form){
var name =form.name;
var mail=form.mail;
var tel =form.tel;
var conn = Jdbc.getCloudSqlConnection(dbUrl, user, userPwd);
var stmt = conn.createStatement();
var datas= stmt.executeQuery('select name,mail,tel from MyData where name="'+name+'";');
getData(datas);
return datas
}

function getData(datas){

???
}

ソースコード

試したこと

ここに問題に対して試したことを記載してください。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

  • サーバサイド(Google App Script)

javascript

1function doGet() { 2 var output=HtmlService.createTemplateFromFile('index'); 3 return output.evaluate().setTitle('SQL2'); 4} 5 6function sendForm(form){ 7 var name =form.name; 8 var mail=form.mail; 9 var tel =form.tel; 10 var conn = Jdbc.getCloudSqlConnection(dbUrl, user, userPwd); 11 var stmt = conn.createStatement(); 12 var connect = stmt.executeQuery('select name,mail,tel from MyData where name="'+name+'";'); 13 var datas = []; 14 var i = 0; 15 while(connect.next()){ 16 datas[i] = [connect.getString('name'), connect.getString('mail'), connect.getString('tel')]; 17 i++; 18 } 19// getData(datas);多分無意味 20 return datas; 21} 22 23/* sendFormでwhereやってるので不要。関数を分割する意図なら、設計を見直すべきだが、動いてからでも遅くない 24function getData(datas){ 25??? 26} 27*/
  • クライアント(HTML)

html

1<!DOCTYPE html> 2<html> 3<head> 4<base target="_top"> 5 6</head> 7<body> 8<script> 9function onSuccess(res){ 10var list=document.getElementById("list"); 11//list.innerHTML=res; 12// ↓こういうのを行数とかを考えながら作っていく 13 var row = list.insertRow(-1); 14 // 一行目にセルを挿入 15 var nameCell = row.insertCell(-1); 16 17 // 作成したセルにテキストノードを挿入 18 var name = document.createTextNode(res[0][0]) 19 nameCell.appendChild(name); 20// 地獄のように面倒なのでこれ以上やりたくないです。 21} 22</script> 23 24<h1>SQL 2</h1> 25<form name="f1" method="post" onsubmit="return false;"> 26name:<input type="text" id="name1" name="name" value=""><br/><br/> 27<input type="button" value="検索" onclick="google.script.run.withSuccessHandler(onSuccess).sendForm(this.parentNode);"> 28</form> 29<br/> 30<br/> 31<br/> 32<table id="list"> 33</table> 34 35</body> 36</html>

javascript

1<? 2var datas =getData(); 3while(datas.next()){ 4var name =datas.getString("name"); 5var mail =datas.getString("mail"); 6var tel =datas.getString("tel"); 7result+='<tr><td>'+name+'</td><td>'+mail+'</td><td>'+tel+'</td></tr>'; 8} 9?>

ここが何がしたいか分からないです。動いていない気がしましたが、動くらしいです。

google.script.run.withSuccessHandler(onSuccess).sendForm(this.parentNode);によって、gas側のgetData()の中(???で書いている箇所)でreturnをすると、html側のonSuccess関数のres引数に渡されます。
今はinnerHtmlにresを書いているようなので、getData()で、この際固定の文字列("helloworld"とかでもいい)をreturnすれば、それが表示されてくると予想します。

<??>にかこまれた部分は意味がないです。その中身をonSuccessの中に移植してください。

投稿2019/02/07 00:41

編集2019/02/07 01:27
papinianus

総合スコア12705

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

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

kimii

2019/02/07 00:50

質問の仕方が悪く、またコードが間違っておりすいません。 google.script.run.withSuccessHandler(onSuccess).sendForm(this.parentNode); からsendForm関数で受け取り、DB検索を行い、結果をHTMLに一覧として表示させたいんですが 参考書を見るとHTML側で受け取る際は引数がついてないgetData()関数でHTML側へ渡しているので それになぞってやってみたのですがご指摘の通り動かない状態です。 <? var datas =getData(datas); while(datas.next()){ var name =datas.getString("name"); var mail =datas.getString("mail"); var tel =datas.getString("tel"); output.append('<tr><td>'+name+'</td><td>'+mail+'</td><td>'+tel+'</td></tr>'); ?>
papinianus

2019/02/07 00:54

質問の仕方が悪いとは思わないのですが、<?で囲んでもjavascriptは動きません(と思う) その参考書が分からない&多分持ってないので意図が分かりません。 回答を追記しますが、とりあえず<??>の部分は忘れてください。
kimii

2019/02/07 01:02 編集

google app script だとhtmlへの強制出力なるもので動くようです。 以下データをinput後に追加されたデータを再度DB一覧として出力させるコードです。 HTML側 <!DOCTYPE html> <html> <head> <base target="_top"> </head> <body> <script> function onSuccess(res){ var list=document.getElementById("list"); list.innerHTML=res; } </script> <h1>SQL 2</h1> <form name="f1" method="post" onsubmit="return false;"> name:<input type="text" id="name1" name="name" value=""><br/><br/> mail:<input type="text" name="mail" value=""><br/><br/> tel:<input type="num" name="tel" value=""><br/><br/> <input type="button" value="追加" onclick="google.script.run.withSuccessHandler(onSuccess).sendForm(this.parentNode);"> </form> <br/> <br/> <br/> <table id="list"> <? var datas=getData(); if(datas ==null){return} while(datas.next()){ var name =datas.getString("name"); var mail =datas.getString("mail"); var tel =datas.getString("tel"); output.append('<tr><td>'+name+'</td><td>'+mail+'</td><td>'+tel+'</td></tr>'); } ?> </table> </body> </html> gas コード側 function doGet() { var output=HtmlService.createTemplateFromFile('index'); return output.evaluate().setTitle('SQL2') } function getData(){ var conn = Jdbc.getCloudSqlConnection(dbUrl, user, userPwd); var stmt = conn.createStatement(); var result= stmt.executeQuery('select *from MyData'); return result; } function sendForm(form){ addData(form); var datas =getData(); return formatData(datas); } function addData(data){ var name =data.name; var mail=data.mail; var tel =data.tel; var conn = Jdbc.getCloudSqlConnection(dbUrl, user, userPwd); var query="insert into MyData(name,mail,tel) values('"+name+"','"+mail+"','"+tel+"')"; conn.createStatement().execute(query); conn.close(); var datas=getData(); var result =formatData(datas); return result; } function formatData(datas){ var result=''; while(datas.next()){ var name =datas.getString("name"); var mail =datas.getString("mail"); var tel =datas.getString("tel"); result+='<tr><td>'+name+'</td><td>'+mail+'</td><td>'+tel+'</td></tr>' } return result; }
macaron_xxx

2019/02/07 01:12

たぶん期待している動作は再読込がいるんじゃないかなと思います。 GASで生成したHTMLは動的に動かせなかった気がする。
papinianus

2019/02/07 01:30 編集

お二方ありがとうございます。動くんですね。 質問者様 とりあえず、動いたところでそのdoGetのタイミングじゃどうしようもないと思うんで、そのアプローチは忘れてください。 雰囲気こんなんじゃないのっていうのを書いたんでご参考まで。 ※ 回答案での最低限の動作確認しました。
macaron_xxx

2019/02/07 01:22 編集

検索結果をこれ自身にPostして、doPostでレンダリングしてやるのが一番簡単な気がしますが。 >papinianusさん いや、できないのは<? ... ?>で書いた部分の再描画の話で、クライアント側での操作は可能だと思うので、(ちゃんとコード見てないですが)papinianusさんのアプローチだといけるかも。
papinianus

2019/02/07 01:29

レビューありがとうございます。 他の回答でも動かした気がするんで確認しました。sqlまでは用意できませんでしたが、sendFormで適当な配列を返したら表示ができました(もちろん、1レコード目の名前しか出ませんでしたが)。 質問者様へ 回答案としてはこんな感じで。
kimii

2019/02/07 01:37

お二方ご教示ありがとうございました。 もう少し自分でも頑張ってみます
papinianus

2019/02/07 01:39

> もう少し自分でも頑張ってみます 動かない(=この回答が間違いである)のであれば、どこがどう問題なのかお知らせください。自己解決投稿でもいいですが。
kimii

2019/02/07 04:00

すいません>< 回答例のコードってどうやってみたらいいんでしょうか??
papinianus

2019/02/22 07:55

> 回答例のコードってどうやってみたらいいんでしょうか?? どういう意味でしょうか? * サーバサイド(Google App Script)が質問者様の言うgas側 * クライアント(HTML)が質問者様の言うHTML側 のそれぞれ書き換え案です。 クライアント側はもう少し加筆が必要だと思いますが、動きませんか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問