前提
プログラムど素人です。
GASでウェブアプリを作っています。
右も左も分からない状態から、ほぼコピペでなんとか手をつけてみましたが、
どうにもつまずいてしまい、投稿させていただきます。
HTMLのテーブルのデータを検索(フィルタリング)して、
該当のデータを抽出して、「検索ワードに紐づいているデータ」をソートして、
重複するデータに色付けするウェブアプリを作りたいと考えています。
具体的には、
複数人対戦のゲームの1試合ごとのメンバー4人の名前(ID)のデータベースをGoogleスプレッドシートにまとめて、
それをHTMLに出力して、上記の処理をかけるという内容となります。
スプレッドシートのデータを出力、検索抽出まではなんとかできましたが、
それ以降の処理の方法が分からない状態です。
以下、おかしな点や不明な点など多々あるかもしれませんが、
お力添えいただきたく存じます。
実現したいこと
- データベースのテーブルからの検索結果をソートして別のテーブルや結果表示欄に出力(検索ワードを除いて出力)
- ソート、出力したデータの重複するデータ(テキスト又は背景)に色をつける
- 可能であれば検索前のデータベースは非表示にしたい。(検索結果のみを出力できれば望ましい)
- テキストボックスのサイズやデザインをカスタマイズしたい。(見つけたcssのテンプレートをうまく適用させることができず)
制作中のソースコード①
gs
1 2function valsget() { 3 let ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("data"); 4 let vals = ss.getDataRange().getValues(); 5 Logger.log(vals); 6 return vals; 7} 8 9 10function doGet(){ 11 let hotpt = HtmlService.createTemplateFromFile('index').evaluate(); 12 hotpt.setTitle(Sample'); 13 return hotpt; 14} 15 16 17function valsget() { 18 let ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("data"); 19 let vals = ss.getDataRange().getValues(); 20 vals.shift(); 21 return vals; 22} 23
制作中のソースコード②
html
1<!DOCTYPE html> 2<html> 3 <head> 4 <base target="_top"> 5 <?!= HtmlService.createHtmlOutputFromFile('css').getContent(); ?> 6 </head> 7 <body> 8 <section class="container"> 9 <div class="cp_iptxt"> 10 <input type="search" size="25" class="light-table-filter" data-table="order-table" placeholder="ここにプレイヤー名を入力" /> 11 <i class="fa fa-user fa-lg fa-fw" aria-hidden="true"></i> 12 </div> 13 14 <table class="order-table" id="tbl" border="1"> 15 <tr> 16 <th>Player 1</th> 17 <th>Player 2</th> 18 <th>Player 3</th> 19 <th>Player 4</th> 20 </tr> 21 </table> 22 </section> 23 </body> 24</html> 25 26 27 28 29<!--jQueryのCDN読み込み--> 30<script 31 32 src="https://code.jquery.com/jquery-3.6.0.slim.min.js" 33 integrity="sha256-u7e5khyithlIdTpu22PHhENmPcRdFiHRjhAuHcs05RI=" 34 crossorigin="anonymous"> 35 36</script> 37 38 39 40<!--クライアント側javascript--> 41 42<script> 43 44 window.onload = function(){ 45 46 google.script.run.withSuccessHandler(function(dt){ //dtにvalgetの取得値を渡す 47 for(let i =0;i<dt.length;i++){ //dtの配列の数だけ繰り返し 48 let $tr = $('<tr></tr>'); //jqueryオブジェクトでtr作成 49 $tr.append($('<td></td>').text(dt[i][0])); //trにtdを追加していく 50 $tr.append($('<td></td>').text(dt[i][1])); 51 $tr.append($('<td></td>').text(dt[i][2])); 52 $tr.append($('<td></td>').text(dt[i][3])); 53 54 $('#tbl').append($tr); //出来上がったtrをtableに行追加 55 } 56 }).valsget(); 57 } 58 59</script> 60 61 62 63 64<!--検索javascript--> 65<script> 66 67(function(document) { 68 'use strict'; 69 70 var LightTableFilter = (function(Arr) { 71 72 var _input; 73 74 function _onInputEvent(e) { 75 _input = e.target; 76 var tables = document.getElementsByClassName(_input.getAttribute('data-table')); 77 Arr.forEach.call(tables, function(table) { 78 Arr.forEach.call(table.tBodies, function(tbody) { 79 Arr.forEach.call(tbody.rows, _filter); 80 }); 81 }); 82 } 83 84 function _filter(row) { 85 var text = row.textContent.toLowerCase(), val = _input.value.toLowerCase(); 86 row.style.display = text.indexOf(val) === -1 ? 'none' : 'table-row'; 87 } 88 89 return { 90 init: function() { 91 var inputs = document.getElementsByClassName('light-table-filter'); 92 Arr.forEach.call(inputs, function(input) { 93 input.oninput = _onInputEvent; 94 }); 95 } 96 }; 97 })(Array.prototype); 98 99 document.addEventListener('readystatechange', function() { 100 if (document.readyState === 'complete') { 101 LightTableFilter.init(); 102 } 103 }); 104 105})(document); 106 107 108 109</script> 110 111
制作中のソースコード③
css
1<style> 2 3table { 4 border-collapse: collapse; /* セルの線を重ねる */ 5} 6 7tr:nth-child(odd) { 8 background-color: #ffffff; /* 背景色指定 */ 9} 10 11th,td { 12 padding: 5px 5px; /* 余白指定 */ 13} 14
試したこと
ここまではひたすらググって、意味を確認しながらコピペで様々なコードの組み合わせで行いました。
(記述されているコードをすべてを理解できているわけではありません。)
やりたいことをググって試してみましたが、これ以上欲しい情報にたどり着けず、現状進めることができなくなってしまいました。
最初はSQLを使おうとしましたが、難しかったためスプレッドシートを採用しました。
補足情報(FW/ツールのバージョンなど)
データベースは、4カラムに1試合ごとに4人のPlayer名を入力しています。
各試合のデータが入力されるごとに、レコードも増えるというものです。
例えば、以下ようにデータがスプレッドシートにあるとした場合、
ーーーーーー
A B C D
E F G H
I C A J
ーーーーーー
”A”と検索したら以下のような結果を出力したいということです。
ーーーーーー
C ←色掛け
C ←色掛け
B
D
I
J
ーーーーーー
”C”と検索した場合はこのようなイメージです。
ーーーーーー
A ←色掛け
A ←色掛け
B
D
I
J
ーーーーーー
”B”と検索した場合はこのようなイメージです。
ーーーーーー
A
C
D
ーーーーーー
回答1件
あなたの回答
tips
プレビュー