回答編集履歴

4

追記

2021/05/28 00:06

投稿

Tatsunosuke
Tatsunosuke

スコア599

test CHANGED
@@ -36,7 +36,7 @@
36
36
 
37
37
 
38
38
 
39
- myData.forEach(e => {
39
+ myData.forEach((e) => {
40
40
 
41
41
  var category = e[0];
42
42
 

3

修正

2021/05/28 00:06

投稿

Tatsunosuke
Tatsunosuke

スコア599

test CHANGED
@@ -68,9 +68,7 @@
68
68
 
69
69
  result += '<td valign="top"><font style="bold" size="2px" color="#000000">' + content + '</font></td>' +
70
70
 
71
- '</tr>' +
71
+ '</tr>'
72
-
73
- '</table>'
74
72
 
75
73
  })
76
74
 

2

追記

2021/05/27 13:18

投稿

Tatsunosuke
Tatsunosuke

スコア599

test CHANGED
@@ -2,6 +2,154 @@
2
2
 
3
3
 
4
4
 
5
+ ノーテストで申し訳ないですが、これでいけるはずです!
6
+
7
+
8
+
9
+
10
+
11
+ ```gas
12
+
13
+ const id = 'スプレッドシートのID';
14
+
15
+ const mySheet = SpreadsheetApp.openById(id).getSheetByName("用語集");
16
+
17
+ const endrow = mySheet.getLastRow();
18
+
19
+ const myData = mySheet.getRange(2, 1, endrow - 1, 4).getValues();
20
+
21
+
22
+
23
+
24
+
25
+ function getValue(searchWord) {  //④
26
+
27
+ //スプレッドシートから必要な処理を行う。
28
+
29
+
30
+
31
+ var result = '検索文字=' + escape_html(searchWord) +
32
+
33
+ '<table class="search" border="1">' +
34
+
35
+ '<tr bgcolor="#aaccff"><th>カテゴリ</th><th>用語</th><th>内容</th></tr>';
36
+
37
+
38
+
39
+ myData.forEach(e => {
40
+
41
+ var category = e[0];
42
+
43
+ var word = e[1];
44
+
45
+ var content = e[2];
46
+
47
+ var url = e[3];
48
+
49
+
50
+
51
+ result += '<tr>' +
52
+
53
+ '<td width="10%" valign="top"><font color="#000000" size="2px">' + category + '</font></td>';
54
+
55
+
56
+
57
+ if (searchWord || word.indexOf(searchWord) !== -1) {
58
+
59
+ var replace = word.replace(searchWord, '<font color="#ff0000" size="2px"><b>' + search + '</b></font>');
60
+
61
+ result += '<td width="20%" align="left" valign="top"><font size="2px">' + replace + '</font></td>';
62
+
63
+ } else {
64
+
65
+ result += '<td width="20%" align="left" valign="top"><font color="#000000" size="2px">' + word + '</font></td>';
66
+
67
+ }
68
+
69
+ result += '<td valign="top"><font style="bold" size="2px" color="#000000">' + content + '</font></td>' +
70
+
71
+ '</tr>' +
72
+
73
+ '</table>'
74
+
75
+ })
76
+
77
+ result += "</table>"
78
+
79
+
80
+
81
+ if (myData.length <= 1) {
82
+
83
+ result += '検索できませんでした。キーワードを変えてもう一度検索してください。'
84
+
85
+ }
86
+
87
+
88
+
89
+ return result
90
+
91
+ }
92
+
93
+
94
+
95
+ function escape_html(string) {
96
+
97
+ if (typeof string !== 'string') {
98
+
99
+ return string;
100
+
101
+ }
102
+
103
+ return string.replace(/[&'`"<>]/g, function (match) {
104
+
105
+ return {
106
+
107
+ '&': '&amp;',
108
+
109
+ "'": '&#x27;',
110
+
111
+ '`': '&#x60;',
112
+
113
+ '"': '&quot;',
114
+
115
+ '<': '&lt;',
116
+
117
+ '>': '&gt;',
118
+
119
+ }[match]
120
+
121
+ });
122
+
123
+ }
124
+
125
+
126
+
127
+
128
+
129
+
130
+
131
+ function doGet(e) {
132
+
133
+ return HtmlService.createTemplateFromFile("index").evaluate();
134
+
135
+
136
+
137
+ }
138
+
139
+
140
+
141
+ ```
142
+
143
+
144
+
145
+
146
+
147
+ ---
148
+
149
+ 追記
150
+
151
+
152
+
5
153
  コードバッサリ省略させていただきました!
6
154
 
7
155
 

1

修正

2021/05/27 13:17

投稿

Tatsunosuke
Tatsunosuke

スコア599

test CHANGED
@@ -1,3 +1,153 @@
1
+ 追記
2
+
3
+
4
+
5
+ コードバッサリ省略させていただきました!
6
+
7
+
8
+
9
+ ①送信ボタンを押すとsend()が呼ばれます。
10
+
11
+ ②検索値を取得します。
12
+
13
+ ③検索値をGAS側のgetValue関数に、検索値を渡します。
14
+
15
+ ④GAS側で必要な処理を行い、値を返します。
16
+
17
+ ⑤ ④が成功したらinnerHTMLFunc関数を呼び出します。
18
+
19
+ ⑥HTMLに値を書き込みます。
20
+
21
+
22
+
23
+
24
+
25
+ こんな流れになります。
26
+
27
+
28
+
29
+ 今のコードを見させていただくと、
30
+
31
+ <?= … ?>でhtml上でGAS側の処理を行われているようなので、管理や修正がしにくい状態になっています。
32
+
33
+ そのためdoGetが呼び出された時に、スプレッドシートの内容を取得し、グローバル変数等に保存しておきます。
34
+
35
+ そして、htmlが読み込まれる際に、処理を行い表示してあげれば良いかと!
36
+
37
+
38
+
39
+ すみません、全部のコード修正しようと思ったんですが、諦めてしまいました。
40
+
41
+
42
+
43
+
44
+
45
+ ```html
46
+
47
+ <html>
48
+
49
+
50
+
51
+ <body>
52
+
53
+ <form name="searchForm">
54
+
55
+   検索文字:<input type="text" width="30%" id="searchWord">
56
+
57
+   <input type="button" value="送信" onclick="send()">  //①
58
+
59
+   <div id="innerResluts"></div>
60
+
61
+ </form>
62
+
63
+
64
+
65
+
66
+
67
+ <script>
68
+
69
+ // HTMLに書き込む処理
70
+
71
+ function innerHTMLFunc(resluts) {   //⑥
72
+
73
+ innerResluts.innerHTML = resluts
74
+
75
+ }
76
+
77
+
78
+
79
+ function send() {
80
+
81
+ //検索ワード
82
+
83
+ var searchWord = document.getElementById("searchWord") //②
84
+
85
+     //GAS側の関数を呼び出す。
86
+
87
+ //=>GAS側:getValue関数(検索値)成功したら、HTML側:innerHTMLFuncに結果を渡す。
88
+
89
+ google.script.run.withSuccessHandler(innerHTMLFunc)  //③  //⑤
90
+
91
+ .getValue(searchWord.value)
92
+
93
+ }
94
+
95
+
96
+
97
+ </script>
98
+
99
+ </body>
100
+
101
+
102
+
103
+ </html>
104
+
105
+
106
+
107
+ ```
108
+
109
+ ```gas
110
+
111
+ const id ='スプレッドシートのID';
112
+
113
+ const mySheet = SpreadsheetApp.openById(id).getSheetByName("用語集");
114
+
115
+ const endrow = mySheet.getLastRow();
116
+
117
+ const myData = mySheet.getRange(2, 1 , endrow-1 , 4).getValues();
118
+
119
+
120
+
121
+
122
+
123
+ function getValue(searchWord){  //④
124
+
125
+ //スプレッドシートから必要な処理を行う。
126
+
127
+ var resluts = "サンプルテキスト 検索値は:"+searchWord;
128
+
129
+ return resluts
130
+
131
+ }
132
+
133
+ function doGet(e) {
134
+
135
+ return HtmlService.createTemplateFromFile("index").evaluate();
136
+
137
+
138
+
139
+ }
140
+
141
+ ```
142
+
143
+
144
+
145
+ ---
146
+
147
+
148
+
149
+
150
+
1
151
  簡易版にして試してみたのですがGASの仕様か不明ですが元のURLに戻ってこれませんでした。
2
152
 
3
153
  循環してしまうので、ダメなのかも。。。