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

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

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

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

Google Apps Script

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

Q&A

解決済

2回答

3765閲覧

doGetのパラメータを他の関数で使用したい

kontake

総合スコア6

Google スプレッドシート

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

Google Apps Script

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

0グッド

1クリップ

投稿2019/11/14 14:16

前提・実現したいこと

Google App scriptを使用し、スプレッドシートに入力してある番号とurlのパラメータと一致した行をHTMLで出力したい。
複数のサイトを参考に作成してみたのですがdoGetで取得したパラメータを引き渡しができませんでした。
ご示唆願えれば幸いです。

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

TypeError: undefined からプロパティ「3」を読み取れません。(行 7、ファイル「コード」)

該当のソースコード

var cache = CacheService.getPublicCache(); function doGet(e) { var siri2 = e.parameter.siri; cache.put('key',siri2 , 30);//キャッシュ書き込み return HtmlService.createTemplateFromFile("index").evaluate(); } function getSheet(name){ // SSIDからスプレッドシートの取得 var ssId = 'スプレッドシートID'; var ss = SpreadsheetApp.openById(ssId); var sheet = ss.getSheetByName(name); return sheet; } function getData() { var sheet = SpreadsheetApp.getActiveSheet(); var data = sheet.getDataRange().getValues(); //2次元配列取得 var data1 = data.filter(function(element) { //条件に一致する要素で2次元配列を再作成 var siri3 = cache.get('key');//キャッシュ読み込み return element.indexOf(siri3) !== -1;//該当する行を抽出 }); return data1; }

試したこと

キャッシュを使ってみたのですが、キャッシュの読み込みで失敗してしまいます。

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

HTMLのソースです。

<!DOCTYPE html> <html> <head> <base target="_top"> </head> <body> <? var data = getData(); output.append(data[0][3]+data[0][5]); ?> </body> </html>

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

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

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

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

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

guest

回答2

0

今さらですが、パラメーターを数字として認識すれば解決しました。
var siri = e.parameter.siri;
var serialno = Number(siri);

投稿2020/02/22 07:29

kontake

総合スコア6

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

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

0

ベストアンサー

doGet()からパラメータをHTMLテンプレートへ渡したいということでしょうか。

詳しくは公式ドキュメントの HTML Service: Templated HTML -> Pushing variables to templates をどうぞ。

(2019/11/18 コメントの内容をサンプルソースへ反映しました。)

  • test.gs

JavaScript

1function doGet(e) { 2 var template = HtmlService.createTemplateFromFile("index"); 3 ////テンプレートで利用する値をセット 4 template.mydata = "abcdefg"; 5 6 return template.evaluate(); 7} 8 9//テンプレートからパラメータを引数として受け取る 10function getData(mydata) { 11 return "getData()の引数は" + mydata + "です。"; 12}
  • index.html

HTML

1<!DOCTYPE html> 2<html> 3 <head> 4 <base target="_top"> 5 </head> 6 <body> 7 <!-- テンプレートで渡されたパラメータをgetData()の引数として渡す --> 8 <?= getData(mydata) ?> 9 </body> 10</html>

投稿2019/11/16 15:05

編集2019/11/17 17:57
draq

総合スコア2573

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

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

kontake

2019/11/17 03:10

説明が足らず申し訳ございません。 doGet()からパラメータをHTMLへ渡すことはできています。 また、変数siri3をスプレッドシートに実在する番号に置き換えても、HTMLへ渡すことはできています。 doGet()のパラメータを変数siri3に渡すことができないのです。 そもそも変数を別の関数で使用することはタブーなのでしょうか。 プログラム経験がないため、何がだめなのかわからず…すみません。
kontake

2019/11/17 03:23

スプレッドシートのA列に番号、B列に名前、C列に住所・・・があったとして、パラメータsiri1を100にしたときに、A列の一致する番号の行(例えばa34行目が100なら、34行目のみ)をHTMLに出力したいのです。 他の方法でもよいので教えていただけると助かります。宜しくお願いいたします。
draq

2019/11/17 04:23 編集

index.gs側を function getData(siri3) {} として、 html側を、 var data = getData(siri3); とすればいいのでは。
kontake

2019/11/17 12:02

ご回答いただきありがとうございます。 これは、cacheを使わないということでよかったでしょうか。 function(element,siri2)はやってみたのですが、function getData(siri2) {}はやってませんでした。 試してみましたが、cacheを使わなくても使ってもダメでした。 {}の内容は変えていませんが、何か変えなければならないのでしょうか。 もう少し詳しく教えていただけないでしょうか。 宜しくお願いいたします。
draq

2019/11/17 17:53

doGet() → (HTMLテンプレート) → getData() の順番で呼ばれているわけです。 だから、 - doGet()からテンプレートへパラメータを渡す。 - テンプレートからgetData()へパラメータを引数として渡す ということです。 回答をそれに合わせて編集しましたので、そちらもご覧ください。
kontake

2019/11/18 17:10

度々ありがとうございます。 が、ヒントを頂いているのに、同じエラーが発生してしまいます。 理解できずすいません。質問は最後にします。 getData()の中の.filter(function(element)にあるindexOfにe.palameter.siri(または変数siri3、またはmydata)を引き渡したいのです。 getData()へパラメータを引数として渡しても、その中にある.filter(function(element)内に引き渡せないのです。。。 getData(mydata)にしても、.filter(function(element,mydata)にしても、 「return element.indexOf(mydata) !== -1;」がundefinedとなり、エラーになってしまいます。 例えば、「return element.indexOf(100) !== -1;」にすると、正常にスプレッドシートの該当行がhtmlに出力されます。 getData()のヒントから進めずにいます。。。
draq

2019/11/18 20:17

コメントの回答を読んでもどこまで期待通りに動いてると確認できているのかわかりません。 ①e.parameter.siriに期待する値が入ってきている ②テンプレートへパラメータを渡せている ③テンプレートからgetData(mydata)へパラメータが渡されている ④getData()からテンプレートへ結果を返している のどこまで確認できているのでしょうか。
kontake

2019/11/19 13:57

ほんとに何度もすいません。。。 ①~③までは確認ができていると思います。 ④は2次元配列取得までgetData()からテンプレートへ結果を返しているのも確認できています。 (質問したソースのままでもそこまでは確認ができました) ④のindexOfメソッドでundefinedとなり、テンプレートへ結果を返せずエラーになると思ってます。 draq様のように、質問したソースの編集方法がわからない為、test.gsを参考にした新規のソースと実行トランスクリプトを記載します。
kontake

2019/11/19 13:59

function doGet(e) { var template = HtmlService.createTemplateFromFile("index"); ////テンプレートで利用する値をセット template.mydata = e.parameter.siri; return template.evaluate(); } function getSheet(name){ // SSIDからスプレッドシートの取得 var ssId = 'スプレッドシートID'; var ss = SpreadsheetApp.openById(ssId); // 指定されたシート名からシートを取得して返却 var sheet = ss.getSheetByName(name); return sheet; } //テンプレートからパラメータを引数として受け取る function getData2(mydata) { return mydata; } function getData() { var sheet = SpreadsheetApp.getActiveSheet(); var data = sheet.getDataRange().getValues(); //2次元配列取得 var data1 = data.filter(function(element,mydata){ //条件に一致する要素で2次元配列を再作成 return element.indexOf(mydata) !== -1; //e.parameter.siriと一致する番号の行を取得 }); return data1; }
kontake

2019/11/19 14:03

実行トランスクリプトです。 e.parameter.siriは、/?siri=102を期待値として値を入れています。 ---------------------------- [19-11-19 22:54:30:886 JST] 実行を開始しています [19-11-19 22:54:30:898 JST] HtmlService.createTemplateFromFile([index]) [0.001 秒] [19-11-19 22:54:30:901 JST] Function.apply([[]]) [0.001 秒] [19-11-19 22:54:30:902 JST] HtmlService.createHtmlOutput() [0 秒] [19-11-19 22:54:30:904 JST] HtmlService.HtmlOutput.append([<!DOCTYPE html> ]) [0 秒] [19-11-19 22:54:30:904 JST] HtmlService.HtmlOutput.append([<html> <head> <base target="_top"> </head> <body> <!-- テンプレートで渡されたパラメータをgetData()の引数として渡す --> ]) [0 秒] [19-11-19 22:54:30:905 JST] HtmlService.HtmlOutput.appendUntrusted([102]) [0 秒] [19-11-19 22:54:30:905 JST] HtmlService.HtmlOutput.append([ ]) [0 秒] [19-11-19 22:54:31:138 JST] SpreadsheetApp.getActiveSheet() [0.231 秒] [19-11-19 22:54:31:363 JST] SpreadsheetApp.Sheet.getDataRange() [0.224 秒] [19-11-19 22:54:31:477 JST] SpreadsheetApp.Range.getValues() [0.113 秒] [19-11-19 22:54:31:624 JST] 実行に失敗: TypeError: undefined からプロパティ「1」を読み取れません。(行 5、ファイル「コード」)(合計ランタイム 0.583 秒)
draq

2019/11/19 14:10

一応確認ですが、前後の空白や型なども含めて一致するデータがスプレッドシートにあることは確認できているのでしょうか。
draq

2019/11/19 14:12

質問の編集は左下の「編集」ボタンから行えます。
kontake

2019/11/20 14:01

長々とお付き合いいただきありがとうございました。解決しました。 理由は・・・indexOfは二次配列で使用できない事の様です。。。 下記を参考にindexofを使用せず、for文で回したら出来ました。 https://teratail.com/questions/94255 お付き合いいただき本当にありがとうございました。
draq

2019/11/20 18:56

おまりお役に立てなくて申し訳なかったですが、解決できたようでよかったです。 ただ、動作確認しましたが Array.prototype.indexOf はGASでも利用できます。 質問のソースコードでも、indexOf を利用しているのは2次元配列ではなく1次元の配列なのでコメントに書かれた参考URLとは事情が違うかと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問