回答編集履歴
8
test
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
変更を最小限にするならば、下記の方法で行うことは一応可能です。
|
2
2
|
|
3
|
-
① Vue を適用したい部分を、
|
3
|
+
① Vue を適用したい部分を、<div id="app"> と </div> で囲みます。
|
4
4
|
```HTML
|
5
5
|
<body>
|
6
6
|
<div id="app">
|
7
test
CHANGED
@@ -56,7 +56,7 @@
|
|
56
56
|
|
57
57
|

|
58
58
|
|
59
|
-
上記のユースケースで
|
59
|
+
上記のユースケースでできる限り Vue を活用したコードはたとえば下記になります。
|
60
60
|
【コード】
|
61
61
|
**index.html**
|
62
62
|
```html
|
6
test
CHANGED
@@ -39,7 +39,7 @@
|
|
39
39
|
|
40
40
|
# Vueを活用する
|
41
41
|
|
42
|
-
せっかくVueを使用しているので、DOMを直接いじってTableを構築したり、Vueの外からボタンのクリックイベントをハンドリングしたりするのではなく、可能な限りVueの世界で完結させた方が良いとは思います。(table の構築や、プルダウンから選択した変数とボタンのイベント処理の連携等)
|
42
|
+
上記でも一応期待通りの動作にはなると思いますが、せっかくVueを使用しているので、DOMを直接いじってTableを構築したり、Vueの外からボタンのクリックイベントをハンドリングしたりするのではなく、可能な限りVueの世界で完結させた方が良いとは思います。(table の構築や、プルダウンから選択した変数とボタンのイベント処理の連携等)
|
43
43
|
|
44
44
|
コード例を示す前に、下記のようなユースケースを考えます。
|
45
45
|
【スプレッドシート】
|
5
test
CHANGED
@@ -37,7 +37,9 @@
|
|
37
37
|
|
38
38
|
------
|
39
39
|
|
40
|
+
# Vueを活用する
|
41
|
+
|
40
|
-
|
42
|
+
せっかくVueを使用しているので、DOMを直接いじってTableを構築したり、Vueの外からボタンのクリックイベントをハンドリングしたりするのではなく、可能な限りVueの世界で完結させた方が良いとは思います。(table の構築や、プルダウンから選択した変数とボタンのイベント処理の連携等)
|
41
43
|
|
42
44
|
コード例を示す前に、下記のようなユースケースを考えます。
|
43
45
|
【スプレッドシート】
|
@@ -186,3 +188,28 @@
|
|
186
188
|
</tr>
|
187
189
|
</tbody>
|
188
190
|
```
|
191
|
+
③ 呼び出す関数をすべて methods に閉じ込めています。
|
192
|
+
```js
|
193
|
+
methods:{
|
194
|
+
openModal: function(){
|
195
|
+
this.showContent = true
|
196
|
+
},
|
197
|
+
closeModal: function(){
|
198
|
+
this.showContent = false
|
199
|
+
},
|
200
|
+
sendData: function() {
|
201
|
+
google.script.run
|
202
|
+
.withFailureHandler(this.fail)
|
203
|
+
.withSuccessHandler(this.data_table)
|
204
|
+
.search(this.selected)
|
205
|
+
},
|
206
|
+
data_table: function(result) {
|
207
|
+
var json = JSON.parse(result)
|
208
|
+
this.rowdata.splice(0)
|
209
|
+
this.rowdata.push(...json)
|
210
|
+
},
|
211
|
+
fail:function(e) {
|
212
|
+
console.log("Error"+e)
|
213
|
+
}
|
214
|
+
}
|
215
|
+
```
|
4
追記
test
CHANGED
@@ -39,3 +39,150 @@
|
|
39
39
|
|
40
40
|
ただし、せっかくVueを使用しているので、DOMを直接いじってTableを構築したり、Vueの外からボタンのクリックイベントをハンドリングしたりするのではなく、可能な限りVueの世界で完結させた方が良いとは思います。(table の構築や、プルダウンから選択した変数とボタンのイベント処理の連携等)
|
41
41
|
|
42
|
+
コード例を示す前に、下記のようなユースケースを考えます。
|
43
|
+
【スプレッドシート】
|
44
|
+
+ Webアプリに表示する元データ。C列に担当者氏名、B列に施設名が記入されている。
|
45
|
+
|
46
|
+

|
47
|
+
|
48
|
+
|
49
|
+
【WEBアプリ】
|
50
|
+
+ セレクトボックスから担当者氏名を選んで「SEND」ボタンをクリックすると、
|
51
|
+
その担当者が担当する施設名の一覧が、スプレッドシートから読み込まれて、下部のテーブルに表示される。
|
52
|
+
+ 各行の「test」ボタンをクリックすると、モーダルウィンドウが表示される。
|
53
|
+
(※ 下記のコードは質問文と同じように簡便的に showContent の切り替えで代用しています)
|
54
|
+
|
55
|
+

|
56
|
+
|
57
|
+
上記のユースケースで可能な限り Vue を使ったコードは下記になります。
|
58
|
+
【コード】
|
59
|
+
**index.html**
|
60
|
+
```html
|
61
|
+
<!DOCTYPE html>
|
62
|
+
<html>
|
63
|
+
|
64
|
+
<head>
|
65
|
+
<base target="_top">
|
66
|
+
<meta charset="utf-8">
|
67
|
+
<meta name="viewport" content="width=device-with, initial-scale=1, shrink-to-fit=no">
|
68
|
+
<meta http-equiv="content-type" content="text/html; charset = UTF-8">
|
69
|
+
<title>施設DB</title>
|
70
|
+
<link type="text/css" rel="stylesheet" href="https://unpkg.com/bootstrap/dist/css/bootstrap.min.css" />
|
71
|
+
<link type="text/css" rel="stylesheet" href="https://unpkg.com/bootstrap-vue@latest/dist/bootstrap-vue.css" />
|
72
|
+
</head>
|
73
|
+
|
74
|
+
<body>
|
75
|
+
<div id="app">
|
76
|
+
<label>【氏名】</label>
|
77
|
+
<select class="form-control" v-model="selected" style="width: 50%">
|
78
|
+
<option value="田中 太郎"> 田中 </option>
|
79
|
+
<option value="鈴木 一郎"> 鈴木 </option>
|
80
|
+
<option value="佐藤 次郎"> 佐藤 </option>
|
81
|
+
</select>
|
82
|
+
<input type="button" v-on:click="this.sendData" value="SEND"/>
|
83
|
+
<div id="add"></div>
|
84
|
+
|
85
|
+
<h4>test情報</h4>
|
86
|
+
<table class='table table-striped table-bordered table-condensed newline'>
|
87
|
+
<thead>
|
88
|
+
<tr style='font-size: 80%'>
|
89
|
+
<th class='col-xs-1 col-ms-1 col-md-1 col-lg-1'>名前</th>
|
90
|
+
<th class='col-xs-1 col-ms-1 col-md-1 col-lg-1'>ボタン</th>
|
91
|
+
</tr>
|
92
|
+
</thead>
|
93
|
+
<tbody>
|
94
|
+
<tr v-for="row in rowdata">
|
95
|
+
<td class='col-xs-1 col-ms-1 col-md-1 col-lg-1'> {{ row[1] }}</td>
|
96
|
+
<td class='col-xs-1 col-ms-1 col-md-1 col-lg-1'><button v-on:click='openModal'>test</button></td>
|
97
|
+
</tr>
|
98
|
+
</tbody>
|
99
|
+
</table>
|
100
|
+
|
101
|
+
<div id="overlay" v-show="showContent">
|
102
|
+
<div id="content">
|
103
|
+
<p>これがモーダルウィンドウです。</p>
|
104
|
+
<button v-on:click="closeModal">Close</button>
|
105
|
+
</div>
|
106
|
+
</div>
|
107
|
+
</div>
|
108
|
+
|
109
|
+
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.7.10/vue.min.js"></script>
|
110
|
+
<script src="https://unpkg.com/babel-polyfill@latest/dist/polyfill.min.js"></script>
|
111
|
+
<script src="https://unpkg.com/bootstrap-vue@latest/dist/bootstrap-vue.js"></script>
|
112
|
+
<script>
|
113
|
+
new Vue({
|
114
|
+
el: '#app',
|
115
|
+
data: {
|
116
|
+
showContent: false,
|
117
|
+
rowdata: [],
|
118
|
+
selected: '', // プルダウン初期値
|
119
|
+
},
|
120
|
+
methods:{
|
121
|
+
openModal: function(){
|
122
|
+
this.showContent = true
|
123
|
+
},
|
124
|
+
closeModal: function(){
|
125
|
+
this.showContent = false
|
126
|
+
},
|
127
|
+
sendData: function() {
|
128
|
+
google.script.run
|
129
|
+
.withFailureHandler(this.fail)
|
130
|
+
.withSuccessHandler(this.data_table)
|
131
|
+
.search(this.selected)
|
132
|
+
},
|
133
|
+
data_table: function(result) {
|
134
|
+
var json = JSON.parse(result)
|
135
|
+
this.rowdata.splice(0)
|
136
|
+
this.rowdata.push(...json)
|
137
|
+
},
|
138
|
+
fail:function(e) {
|
139
|
+
console.log("Error"+e)
|
140
|
+
}
|
141
|
+
}
|
142
|
+
})
|
143
|
+
</script>
|
144
|
+
</body>
|
145
|
+
|
146
|
+
</html>
|
147
|
+
```
|
148
|
+
|
149
|
+
**code.gs**
|
150
|
+
```js
|
151
|
+
function doGet() {
|
152
|
+
return HtmlService.createHtmlOutputFromFile('index');
|
153
|
+
}
|
154
|
+
|
155
|
+
function search(data) {
|
156
|
+
var ss = SpreadsheetApp.openById('スプレッドシートID');
|
157
|
+
var sh = ss.getSheetByName('施設DB');
|
158
|
+
|
159
|
+
// 全データ取得
|
160
|
+
var mst = sh.getDataRange().getValues();
|
161
|
+
// フロントから取得した氏名でフィルタリング
|
162
|
+
var inv = mst.filter(function(e){return e[2] === data});
|
163
|
+
return JSON.stringify(inv);
|
164
|
+
}
|
165
|
+
```
|
166
|
+
|
167
|
+
----
|
168
|
+
|
169
|
+
① セレクトボックスにv-model を使うことで、セレクトボックスの選択した要素を Vue内の指定した変数(selected)に紐付けています。
|
170
|
+
```html
|
171
|
+
<select class="form-control" v-model="selected" style="width: 50%">
|
172
|
+
...略...
|
173
|
+
data: {
|
174
|
+
showContent: false,
|
175
|
+
rowdata: [],
|
176
|
+
selected: '', // プルダウン初期値
|
177
|
+
},
|
178
|
+
```
|
179
|
+
|
180
|
+
② テーブルの表示は、htmlタグを文字列で構築するのではなく、v-forを使っています。
|
181
|
+
```html
|
182
|
+
<tbody>
|
183
|
+
<tr v-for="row in rowdata">
|
184
|
+
<td class='col-xs-1 col-ms-1 col-md-1 col-lg-1'> {{ row[1] }}</td>
|
185
|
+
<td class='col-xs-1 col-ms-1 col-md-1 col-lg-1'><button v-on:click='openModal'>test</button></td>
|
186
|
+
</tr>
|
187
|
+
</tbody>
|
188
|
+
```
|
3
test
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
変更を最小限にするならば、下記の方法で行うことは一応可能です。
|
2
2
|
|
3
|
-
①
|
3
|
+
① Vue を適用したい部分を、Vue 内の ID である app を指定した div で囲みます。
|
4
4
|
```HTML
|
5
5
|
<body>
|
6
6
|
<div id="app">
|
@@ -37,5 +37,5 @@
|
|
37
37
|
|
38
38
|
------
|
39
39
|
|
40
|
-
ただし、せっかくVueを使用しているので、DOMを直接いじってTableを構築したり、Vueの外からボタンのクリックイベントをハンドリングしたりするのではなく、
|
40
|
+
ただし、せっかくVueを使用しているので、DOMを直接いじってTableを構築したり、Vueの外からボタンのクリックイベントをハンドリングしたりするのではなく、可能な限りVueの世界で完結させた方が良いとは思います。(table の構築や、プルダウンから選択した変数とボタンのイベント処理の連携等)
|
41
41
|
|
2
test
CHANGED
@@ -37,5 +37,5 @@
|
|
37
37
|
|
38
38
|
------
|
39
39
|
|
40
|
-
ただし、せっかくVueを使用しているので、DOMを直接いじってTableを構築したり、Vueの外からハンドリングするのではなく、全部Vueの世界で完結させた方が良いとは思います。(table の構築や、プルダウンから選択した変数とボタンのイベント処理の連携等)
|
40
|
+
ただし、せっかくVueを使用しているので、DOMを直接いじってTableを構築したり、Vueの外からボタンのクリックイベントをハンドリングしたりするのではなく、全部Vueの世界で完結させた方が良いとは思います。(table の構築や、プルダウンから選択した変数とボタンのイベント処理の連携等)
|
41
41
|
|
1
test
CHANGED
@@ -25,7 +25,7 @@
|
|
25
25
|
})
|
26
26
|
```
|
27
27
|
|
28
|
-
③ 動的に構築する HTML 内のボタンのクリックイベントを、②で設定した変数(app
|
28
|
+
③ 動的に構築する HTML 内のボタンのクリックイベントを、②で設定した変数(vueapp)経由で設定します。
|
29
29
|
このとき v-on:click ではなく onclick を使用します。
|
30
30
|
```js
|
31
31
|
html2 += "<td class='col-xs-1 col-ms-1 col-md-1 col-lg-1'><button v-on:click='openModal'>test</button></td>"
|