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

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

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

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

Google Apps Script

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

Q&A

解決済

1回答

2832閲覧

Google apps Scriptで作成のHTMLテキストボックス2箇所に数値入力(数値1,数値2)→数値1でスプレッドシートの行検索→更に数値2で絞り込み行検索→検索行の値をHTML上に表示したい

MasakiTM

総合スコア115

Google スプレッドシート

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

Google Apps Script

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

0グッド

1クリップ

投稿2020/06/20 03:43

編集2020/06/21 06:25

【スプレッドシート】
A列からE列まで2000行のデータがあります。

A列:2000行まで1~2000の数値が順に入力されています。
B列:2000行まで全てにバラバラの値が入っています。
C列:2000行まで1~2000の数値がランダムに入力されています。
D列:2000行まで1~2000の数値がランダムに入力されています。
E列:2000行まで全てにバラバラの値が入っています。

(フォーム表示)
1.Google apps ScriptにアクセスしdoGet()で別途作成したフォームを表示させます。
2.フォームにはテキストボックスが2つあります。テキストボックス1とテキストボックス2とします。

【やりたいこと】
(1つ目)
1.テキストボックス1に100と入力する→スプレッドシートのA列で100のある行を検索→同じ行にあるB列の値を
テキストボックス1の下に表示させたい。

(2つ目)
1.テキストボックス2に200と入力する。
2.スプレッドシートで「C列100(テキストボックス1に入力されている値)」かつ
「D列200(テキストボックス2に入力されている値)」と一致する行を検索
3.同じ行にあるE列の値をテキストボックス2の下に表示させたい。

※(2つ目)について、C列D列の数値がランダムなら検索ヒット確率低くないか?と思われるかもしれませんが
実際はC~E列は数万行あるのでかならずヒットするようになっています。
全2000行前提でご教授いただければ助かります。

【進捗】
以下のコードで上記1つ目のやりたいことは達成できました。2つ目の検索方法がわからない状態です。(検索実行時間の短縮などについてもご見解いただければ助かります)
ご教授いただければ助かります。

Google

1【1つ目のコード】**正常に動作します。** 2//main.gs 3 4function doGet() { 5 return HtmlService.createTemplateFromFile('index').evaluate; 6} 7 8function kensaku(e) { 9//HTMLからうまく取得できなければ"undefined"を返す 10if (e === undefined) 11{ 12e="undefined"; 13return e; 14} 15//HTMLからうまく取得できればスプレッドシートを検索し、検索結果を返す 16else{ 17 var text = e; 18 var datasheet = SpreadsheetApp.openById("スプレッドシートのID").getSheetByName("シート名"); 19 var range = datasheet.getRange("A:A").getValues();  20 var lastRow = range.filter(String).length; 21 var loginData = datasheet.getRange(1, 1, lastRow, 5).getValues(); //1~lastRow行目、5列分を二次元配列として取得 22 loginData = loginData.filter(function(v) { 23 return v[0] == text; 24 }); 25try{ 26 var seikou = loginData[0][1]; 27 return seikou; 28 29 }catch(e){ 30 seikou = "該当なし"; 31 return seikou; 32 } 33} 34} 35 36 37//index.html 38 39//略 401つ目 41<input type="number" id="input"> 42 43<!--このボタンを押すと下のスクリプト動作--> 44<input type="button" onclick="test()" value="ここを押すとアウトプット"> 45 46<!--表示成功しました--> 47<div id="output"></div> 48 49<script> 50 function test() { 51 var a= document.getElementById("input").value; 52 google.script.run.withSuccessHandler(result).kensaku(a); 53 function result(data) { 54 document.getElementById("output").innerHTML = data; 55 } 56</script> 57//略

google

1【2つ目のコード】とりあえずここまでできてます。。 2 3//main.gs 4function doGet() { 5 return HtmlService.createTemplateFromFile('index').evaluate; 6} 7 8function kensakus(a,b) { 9if (a=== undefined) 10{ 11b="undefined"; 12return b; 13} 14else if (b=== undefined) 15{ 16b="undefined"; 17return b; 18} 19else{ 20 var texta = a; 21 var textb = b; 22 var datasheet = SpreadsheetApp.openById("スプレッドシートのID").getSheetByName("シート名"); 23 var range = datasheet.getRange("C:C").getValues(); //一番長いC列の最終行取得 24 var lastRow = range.filter(String).length; 25 var loginData = datasheet.getRange(1, 3, lastRow, 5).getValues(); //1~lastRow行目、3~5列分を二次元配列として取得 26 loginData = loginData.filter( 27 function(v) {return v[?] == ??;} ** //ここの検索方法がわかりません。** 28 ); 29 try{ 30 var seikou = loginData[?][?]; **//どう記述したらいいのかわかりません。** 31 return seikou; 32 }catch(e){ 33 seikou = "該当なし"; 34 return seikou; 35 } 36} 37} 38 39//index.html 40//略 412つのテキストボックス 42<input type="number" id="input"> 43<input type="number" id="inputs"> 44 45<!--このボタンを押すと下のスクリプト動作--> 46<input type="button" onclick="test()" value="ここを押すとアウトプット"> 47 48<!--ここで検索結果表示したい。--> 49<div id="outputs"></div> 50<script> 51 function test() { 52 var a= document.getElementById("input").value; 53 var b= document.getElementById("inputs").value; 54 google.script.run.withSuccessHandler(results).kensakus(a,b); 55 function results(data) { 56 document.getElementById("outputs").innerHTML = data; 57 } 58</script> 59//略 60```

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

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

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

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

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

guest

回答1

0

自己解決

2つ目のコードのわからない部分を以下のように修正したらうまくいけました。
後はボタンを押さなくても表示できる方法と実行時間早くできる方法考えてみます。

loginData = loginData.filter(
function(v) {return v[0] == texta;})
.filter(function(v) {return v[1] == textb;})
;

try{
var seikou = loginData[0][2];
return seikou;


【追記補足】
<input type="number" id="input" onchange="test()">とするとテキスト編集で自動実行できるが
2つめ目コードでinputを書き換えした場合の動作的に大幅修正が必要というのがわかったので、こちらは実装せず。

・index.htmlに以下処理を追加してボタンクリック後に「検索中」を表示させることで
視覚的に実行していることをわかるようにする。

google

1function test(){ 2var ken="検索中...しばらくお待ちください"; 3document.getElementById("output").innerHTML = ken;

・main.gsに以下処理追加

google

1//kensaku(e) 2else if (e=== "") 3{ 4e=""; 5return e; 6} 7 8// kensakus(a,b) 9else if (b=== "") 10{ 11b=""; 12return brh; 13}

投稿2020/06/21 06:39

編集2020/06/22 22:31
MasakiTM

総合スコア115

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問