回答編集履歴

8

 

2022/09/20 15:05

投稿

退会済みユーザー
test CHANGED
@@ -1,6 +1,6 @@
1
1
  変更を最小限にするならば、下記の方法で行うことは一応可能です。
2
2
 
3
- ① Vue を適用したい部分を、Vue 内の ID である app を指定した div で囲みます。
3
+ ① Vue を適用したい部分を、<div id="app"> </div> で囲みます。
4
4
  ```HTML
5
5
  <body>
6
6
  <div id="app">

7

 

2022/09/20 15:02

投稿

退会済みユーザー
test CHANGED
@@ -56,7 +56,7 @@
56
56
 
57
57
  ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-09-20/a76b686f-b4fd-469f-8f19-443492674b56.gif)
58
58
 
59
- 上記のユースケースで可能な限り Vue を使ったコードは下記になります。
59
+ 上記のユースケースでできる限り Vue を活用したコードはたとえば下記になります。
60
60
  【コード】
61
61
  **index.html**
62
62
  ```html

6

 

2022/09/20 15:01

投稿

退会済みユーザー
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

 

2022/09/20 15:00

投稿

退会済みユーザー
test CHANGED
@@ -37,7 +37,9 @@
37
37
 
38
38
  ------
39
39
 
40
+ # Vueを活用する
41
+
40
- ただし、せっかくVueを使用しているので、DOMを直接いじってTableを構築したり、Vueの外からボタンのクリックイベントをハンドリングしたりするのではなく、可能な限りVueの世界で完結させた方が良いとは思います。(table の構築や、プルダウンから選択した変数とボタンのイベント処理の連携等)
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

追記

2022/09/20 14:58

投稿

退会済みユーザー
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
+ ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-09-20/773dec2a-85d3-49fe-8588-adf4325afccb.jpeg)
47
+
48
+
49
+ 【WEBアプリ】
50
+ + セレクトボックスから担当者氏名を選んで「SEND」ボタンをクリックすると、
51
+ その担当者が担当する施設名の一覧が、スプレッドシートから読み込まれて、下部のテーブルに表示される。
52
+ + 各行の「test」ボタンをクリックすると、モーダルウィンドウが表示される。
53
+ (※ 下記のコードは質問文と同じように簡便的に showContent の切り替えで代用しています)
54
+
55
+ ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-09-20/a76b686f-b4fd-469f-8f19-443492674b56.gif)
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

 

2022/09/19 13:02

投稿

退会済みユーザー
test CHANGED
@@ -1,6 +1,6 @@
1
1
  変更を最小限にするならば、下記の方法で行うことは一応可能です。
2
2
 
3
- vue を適用したい部分を、Vue 内の ID である app を指定した div で囲みます。
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の外からボタンのクリックイベントをハンドリングしたりするのではなく、全部Vueの世界で完結させた方が良いとは思います。(table の構築や、プルダウンから選択した変数とボタンのイベント処理の連携等)
40
+ ただし、せっかくVueを使用しているので、DOMを直接いじってTableを構築したり、Vueの外からボタンのクリックイベントをハンドリングしたりするのではなく、可能な限りVueの世界で完結させた方が良いとは思います。(table の構築や、プルダウンから選択した変数とボタンのイベント処理の連携等)
41
41
 

2

 

2022/09/19 13:01

投稿

退会済みユーザー
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

 

2022/09/19 13:00

投稿

退会済みユーザー
test CHANGED
@@ -25,7 +25,7 @@
25
25
  })
26
26
  ```
27
27
 
28
- ③ 動的に構築する HTML 内のボタンのクリックイベントを、②で設定した変数(appvue)経由で設定します。
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>"