teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

4

今回の問題点の追記

2019/03/29 15:32

投稿

jzx100ts
jzx100ts

スコア28

title CHANGED
File without changes
body CHANGED
@@ -105,9 +105,8 @@
105
105
  temp_marker = [MarkerListDATA[i][0],MarkerListDATA[i][1],MarkerListDATA[i][2]];
106
106
  locations.push(temp_marker);
107
107
  }
108
- var locations = markerData;
109
108
  ```
110
- などとしてmarkerData生成し、locationsに読み込んで使用したいのですが、上記のコードを<script>の中に記載すると、ページを開いても何も表示されないという状況です。それを削除してべた打ちの4件を入力するときちんとマップが表示されます。
109
+ などとしてスプレッドシートに入力されているデータをlocationsに読み込んで使用したいのですが、上記のコードを<script>の中に記載すると、ページを開いても何も表示されないという状況です。それを削除してべた打ちの4件を入力するときちんとマップが表示されます。
111
110
  HTMLファイルにいきなりこれを記載しても「SpreadsheetAppが定義されていない」ということで動かないのかと推測し、上記のものをコード.gsに関数の形で記載してみました。それでページを開くと、「その操作を実行するには承認が必要です。」となり、やはり地図は表示されません。
112
111
  HTMLファイルに直接記述した最初のトライのときには「このアプリケーションは、Google ではなく、別のユーザーによって作成されたものです。不正行為を報告 - 利用規約」が表示され、地図だけが出ない状態でしたが、
113
112
  コード.gsに関数を作って試した2回目のトライでは、GASのロゴと「その操作を実行するには承認が必要です。」だけが表示されました。
@@ -151,6 +150,19 @@
151
150
  マーカーリストを2つのスプレッドシートから読み込み、
152
151
  それぞれのマーカーをスプレッドシートごとに色分けする内容となっております。
153
152
 
153
+ 今回の問題点は、
154
+ クライアント側JS[HTMLファイルに記述したJSスクリプトinitMap()の内部]から
155
+ サーバー側関数[コード.gsに記載したGASスクリプト]を直接呼び出そうとしていたことでした。
156
+ それをするにはgoogle.script.runなどが用意されているようですが、
157
+ 今回はhiroshi0240様がもっと簡単な「置換法」を教えてくださったので、すぐに解決しましたし、おかげで応用もすることができました。
158
+ 正しい表現かどうかわかりませんが、
159
+ HTMLファイルを生成する前の段階で、サーバー側(GAS)の処理でマーカーデータをスプレッドシートから読み込み、
160
+ 生成前のHTMLにマーカーデータを潜り込ませ(←ここが置換処理)、
161
+ そのデータに基づいてHTMLファイルを生成することで、
162
+ HTMLファイルのJS内部からサーバー側の処理を呼び出す必要はなくなった。というイメージです。
163
+
164
+ ゆくゆくはgoogle.script.runなども使いこなせるようになりたいと思います。
165
+
154
166
  ```GAS
155
167
  function doGet(e)
156
168
  {

3

解決コードの追記

2019/03/29 15:32

投稿

jzx100ts
jzx100ts

スコア28

title CHANGED
File without changes
body CHANGED
@@ -113,8 +113,9 @@
113
113
  コード.gsに関数を作って試した2回目のトライでは、GASのロゴと「その操作を実行するには承認が必要です。」だけが表示されました。
114
114
  以下が2回目のトライで試したコードになります。
115
115
 
116
+
117
+ ```GAS
116
118
  コード.gs
117
- ```
118
119
  function GETMARKERLIST(){
119
120
  var MarkerListSS = SpreadsheetApp.openById("SSID");
120
121
  var MarkerListSH = MarkerListSS.getSheetByName("SheetName");
@@ -128,9 +129,11 @@
128
129
  }
129
130
  return markerData
130
131
  }
132
+
133
+
131
134
  ```
135
+
132
- map.html
136
+ ```html
133
- ```
134
137
  var locations = GETMARKERLIST();
135
138
  ```
136
139
 
@@ -138,4 +141,140 @@
138
141
  感覚としてはそれほど難しいことでは無いのではないかと感じるものの、これまで独学でスプレッドシート周りのことを中心にGASを扱ってきましたので、
139
142
  HTMLが絡んできたとたん、理解が追いついておりません。
140
143
  コード.gsとHTMLファイルでコードを書き分ける意義などはわかっておらず、それが原因して行き詰まっているのかもと思っております。
141
- 私が大変初歩的な部分の理解ができていないのかもしれないと推察していますが、何卒ご教授いただけたら助かります。どうぞよろしくお願いいたします。
144
+ 私が大変初歩的な部分の理解ができていないのかもしれないと推察していますが、何卒ご教授いただけたら助かります。どうぞよろしくお願いいたします。
145
+
146
+
147
+
148
+ ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
149
+
150
+ おかげさまで解決しましたので、解決済みのコードを記載致します。
151
+ マーカーリストを2つのスプレッドシートから読み込み、
152
+ それぞれのマーカーをスプレッドシートごとに色分けする内容となっております。
153
+
154
+ ```GAS
155
+ function doGet(e)
156
+ {
157
+ var page=e.parameter["p"];
158
+ var p_map = 'map';//ファイル名
159
+
160
+ if (page == p_map) {//オートリロードGoogleMap
161
+ var markerdata = JSON.stringify(GETMARKERLIST());//GETMARKERLIST()の戻り値は配列オブジェクトなのでJSON 文字列に変換する
162
+ var markerdata2 = JSON.stringify(GETMARKERLIST2());//GETMARKERLIST()の戻り値は配列オブジェクトなのでJSON 文字列に変換する
163
+ var html = HtmlService.createHtmlOutputFromFile("map");
164
+ var content = html.getContent().replace(/%markerdata%/, markerdata );//ここで置換を実施する
165
+ var content2 = content.replace(/%markerdata2%/, markerdata2 );//ここで置換を実施する
166
+ return HtmlService.createHtmlOutput(content2)
167
+ .setTitle('地図')
168
+ .setFaviconUrl('fav.png')
169
+ .addMetaTag('viewport', "width=device-width, initial-scale=1, user-scalable=yes");
170
+ }
171
+ }
172
+
173
+ function GETMARKERLIST(){//グループ1のマーカー情報 スプレッドシートのA列にタイトル、B列に緯度、C列に経度を入力しておく
174
+ var MarkerListDATA = getData("****SSID****","MarkerList");
175
+ var markerData=[];
176
+ for (var i = 0 ; i < MarkerListDATA.length ; i++ ){
177
+ var temp_marker = [MarkerListDATA[i][0],MarkerListDATA[i][1],MarkerListDATA[i][2]];
178
+ markerData.push(temp_marker);
179
+ }
180
+ return markerData;
181
+ }
182
+
183
+ function GETMARKERLIST2(){//グループ2のマーカー情報 スプレッドシートのA列にタイトル、B列に緯度、C列に経度を入力しておく
184
+ var MarkerListDATA = getData("****SSID****","MarkerList2");
185
+ var markerData=[];
186
+ for (var i = 0 ; i < MarkerListDATA.length ; i++ ){
187
+ var temp_marker = [MarkerListDATA[i][0],MarkerListDATA[i][1],MarkerListDATA[i][2]];
188
+ markerData.push(temp_marker);
189
+ }
190
+ return markerData;
191
+ }
192
+
193
+ function getData(ssId,sheetName) {
194
+ // スプレッドシートの取得
195
+ var ss = SpreadsheetApp.openById(ssId);
196
+ // データの取得
197
+ var values = ss.getSheetByName(sheetName).getDataRange().getValues();
198
+
199
+ return values;
200
+ }
201
+ ```
202
+ ```HTML
203
+ <!DOCTYPE html>
204
+ <html>
205
+ <head>
206
+ <base target="_top">
207
+ <style type="text/css">
208
+ #ARmap{ height: 620px;
209
+ width: 100%;
210
+ margin:0 auto;}
211
+ </style>
212
+ </head>
213
+
214
+ <body>
215
+
216
+ <script type="text/javascript">
217
+
218
+ function initMap() {
219
+ var locations = %markerdata%;//ここがスプレッドシートの情報に置換される
220
+ var locations2 = %markerdata2%;//ここがスプレッドシートの情報に置換される
221
+
222
+ var map = new google.maps.Map(document.getElementById('ARmap'), {
223
+ zoom: 16,
224
+ center: new google.maps.LatLng(35.678244, 139.736343),
225
+ mapTypeId: google.maps.MapTypeId.ROADMAP
226
+ });
227
+
228
+ var infowindow = new google.maps.InfoWindow;
229
+ var marker, i;
230
+
231
+
232
+ //マーカーの読み込み(グループ1)
233
+ for (i = 0; i < locations.length; i++) {
234
+ marker = new google.maps.Marker({
235
+ position: new google.maps.LatLng(locations[i][1], locations[i][2]),
236
+ icon: 'http://chart.apis.google.com/chart?chst=d_map_pin_letter&chld=|00bfff|',//グループ2のマーカーの色指定
237
+ map: map
238
+ });
239
+
240
+ google.maps.event.addListener(marker, 'click', (function(marker, i) {
241
+ return function() {
242
+ infowindow.setContent(locations[i][0]);
243
+ infowindow.setContent(locations[i][0]);
244
+ infowindow.open(map, marker);
245
+ }
246
+ })(marker, i));
247
+ }
248
+
249
+ //マーカーの読み込み(グループ2)
250
+ for (i = 0; i < locations2.length; i++) {
251
+ marker = new google.maps.Marker({
252
+ position: new google.maps.LatLng(locations2[i][1], locations2[i][2]),
253
+ icon: 'http://chart.apis.google.com/chart?chst=d_map_pin_letter&chld=|aaaaaa|',//グループ1のマーカーの色指定
254
+ map: map
255
+ });
256
+
257
+ google.maps.event.addListener(marker, 'click', (function(marker, i) {
258
+ return function() {
259
+ infowindow.setContent(locations2[i][0]);
260
+ infowindow.setContent(locations2[i][0]);
261
+ infowindow.open(map, marker);
262
+ }
263
+ })(marker, i));
264
+ }
265
+ }
266
+ </script>
267
+
268
+ <script async defer
269
+ src="https://maps.googleapis.com/maps/api/js?key=xxxxxxxxxxxx&callback=initMap">//keyは自分のものを入力する
270
+ </script>
271
+
272
+
273
+ <div class="waku">
274
+ <h1>地図</h1>
275
+ <div id="ARmap"></div>
276
+ </div>
277
+
278
+ </body>
279
+ </html>
280
+ ```

2

下書きのまま投稿してしまったので修正

2019/03/29 15:13

投稿

jzx100ts
jzx100ts

スコア28

title CHANGED
File without changes
body CHANGED
@@ -1,8 +1,6 @@
1
1
  ### 前提・実現したいこと
2
- 現在、GASによるウェブアプリケーション上で、
3
- GoogleMapを使って複数のマーカーを設置し、吹き出しも動くようになりました。
2
+ 現在、GASによるウェブアプリケーション上で、GoogleMapを使って複数のマーカーを設置し、吹き出しも動くようになりました。
4
- 複数のマーカーデータはスクリプト内に直接記述されているのですが、
5
- 表示したいマーカーデータは日々変わるので、スプレッドシートから情報を読み込むようにしたいと思っております。
3
+ 複数のマーカーデータはスクリプト内に直接記述されているのですが、設置したい複数のマーカーデータは日々位置と情報をえたいので、スプレッドシートに保存してある情報からマーカーデータを読み込むようにしたいと思っております。
6
4
 
7
5
  現在は下記の状態で、var locationsに入れた4件のマーカーデータに基づき、マーカーが設置できています。
8
6
 
@@ -83,26 +81,37 @@
83
81
  ```
84
82
 
85
83
  ### 発生している問題・エラーメッセージ
84
+ ```
85
+ [
86
+ ['しぶや<br><a href="http://www.yahoo.co.jp">やふー</a>', 35.658319, 139.700922],
87
+ ['はらじゅく<br><a href="http://www.google.co.jp">ぐーぐる</a>', 35.669276, 139.702762],
88
+ ['おもてさんどう<br><a href="http://www.apple.co.jp">あぽ</a>', 35.665435, 139.711565],
89
+ ['えびす<br><a href="http://www.amazon.co.jp">あま</a>', 35.647915, 139.709687 ]
90
+ ]
91
+ ```
92
+ 上記の部分をスプレッドシートに保存されたデータから読み込みたいのですが実現できません。
86
93
 
94
+ ### 試したこと
95
+
87
- 不勉強でお恥ずかしいのですが、スプレッドシートから情報を読み込むために、
96
+ 不勉強でお恥ずかしいのですが、とあるスプレッドシートに保存されているマーカーデータ随時var locationsに読み込むために、
88
97
  ```
89
98
  var MarkerListSS = SpreadsheetApp.openById("SSID");
90
99
  var MarkerListSH = MarkerListSS.getSheetByName("SheetName");
91
100
  var MarkerListDATA = MarkerListSH.getDataRange().getValues();
92
101
 
93
- var markerData=[];
102
+ var locations = [];
94
103
  for (var i = 0 ; i < MarkerListDATA.length ; i++ )
95
104
  {
96
105
  temp_marker = [MarkerListDATA[i][0],MarkerListDATA[i][1],MarkerListDATA[i][2]];
97
- markerData.push(temp_marker);
106
+ locations.push(temp_marker);
98
107
  }
108
+ var locations = markerData;
99
109
  ```
100
- などとしてmarkerDataを作成し、それを読み込みリストに使用したいのですが、
101
- 上記のコードを<script>の中に記載すると、ページを開いても何も表示されないという状況です。
110
+ などとしてmarkerDataを生成し、locationsに読み込んで使用したいのですが、上記のコードを<script>の中に記載すると、ページを開いても何も表示されないという状況です。それを削除してべた打ちの4件を入力するときちんとマップが表示されます。
102
- それを削除するとマップが表示されます。
103
- HTMLファイルにいきなり記載しても「SpreadsheetAppが定義されていない」ということで動かないのかと推測し、
111
+ HTMLファイルにいきなりこれを記載しても「SpreadsheetAppが定義されていない」ということで動かないのかと推測し、上記のものをコード.gsに関数の形で記載してみました。それでページを開くと、「その操作を実行するには承認が必要です。」となり、やはり地図は表示されません。
112
+ HTMLファイルに直接記述した最初のトライのときには「このアプリケーションは、Google ではなく、別のユーザーによって作成されたものです。不正行為を報告 - 利用規約」が表示され、地図だけが出ない状態でしたが、
104
- 上記のものをコード.gsに関数の記載してみました。
113
+ コード.gsに関数を作って試した2回目トライは、GASのロゴと「その操作を実行するには承認が必要です。」だけが表示されました。
105
- 以下が最後に試したコードになります。
114
+ 以下が2回目のトライで試したコードになります。
106
115
 
107
116
  コード.gs
108
117
  ```
@@ -122,85 +131,11 @@
122
131
  ```
123
132
  map.html
124
133
  ```
125
- GETMARKERLIST()
134
+ var locations = GETMARKERLIST();
126
135
  ```
127
136
 
128
-
129
- ### 該当のソースコード
130
-
131
- var map;
132
- var marker = [];
133
- var infoWindow = [];
134
- var markerData = [ // マーカーを立てる場所名・緯度・経度
135
- {
136
- name: 'TAM 東京',
137
- lat: 35.6954806,
138
- lng: 139.76325010000005,
139
- icon: 'tam.png' // TAM 東京のマーカーだけイメージを変更する
140
- }, {
141
- name: '小川町駅',
142
- lat: 35.6951212,
143
- lng: 139.76610649999998
144
- }, {
145
- name: '淡路町駅',
146
- lat: 35.69496,
147
- lng: 139.76746000000003
148
- }, {
149
- name: '御茶ノ水駅',
150
- lat: 35.6993529,
151
- lng: 139.76526949999993
152
- }, {
153
- name: '神保町駅',
154
- lat: 35.695932,
155
- lng: 139.75762699999996
156
- }, {
157
- name: '新御茶ノ水駅',
158
- lat: 35.696932,
159
- lng: 139.76543200000003
160
- }
161
- ];
162
-
163
- function initMap() {
164
- // 地図の作成
165
- var mapLatLng = new google.maps.LatLng({lat: markerData[0]['lat'], lng: markerData[0]['lng']}); // 緯度経度のデータ作成
137
+ ネットで情報を探しても、マーカーや吹き出しについて情報は見つかるのですが、Googleスプレッドシートに保存されている文字データやlatlangを読み込んで、マーカー設置のリストに使用している実例が見つからず、こちらで質問させていただきました。
166
- map = new google.maps.Map(document.getElementById('sample'), { // #sampleに地図を埋め込む
167
- center: mapLatLng, // 地図の中心を指定
168
- zoom: 15 // 地図のズームを指定
169
- });
170
-
171
- // マーカー毎の処理
172
- for (var i = 0; i < markerData.length; i++) {
173
- markerLatLng = new google.maps.LatLng({lat: markerData[i]['lat'], lng: markerData[i]['lng']}); // 緯度経度のデータ作成
174
- marker[i] = new google.maps.Marker({ // マーカーの追加
175
- position: markerLatLng, // マーカーを立てる位置を指定
176
- map: map // マーカーを立てる地図を指定
177
- });
178
-
179
- infoWindow[i] = new google.maps.InfoWindow({ // 吹しの追加
138
+ 感覚としてはそれほど難しいことでは無いのではないかと感じるものの、これまで独学でスプレッドシート周りのことを中心にGASを扱ってで、
180
- content: '<div class="sample">' + markerData[i]['name'] + '</div>' // 吹き出しに表示する内容
181
- });
182
-
183
- markerEvent(i); // マーカーにクリックイベントを追加
184
- }
185
-
186
- marker[0].setOptions({// TAM 東京のマーカーのオプション設定
187
- icon: {
188
- url: markerData[0]['icon']// マーカーの画像を変更
189
- }
190
- });
191
- }
192
-
193
- // マーカーにクリックイベントを追加
194
- function markerEvent(i) {
195
- marker[i].addListener('click', function() { // マーカーをクリックしたとき
196
- infoWindow[i].open(map, marker[i]); // 吹き出しの表示
197
- });
198
- }
199
-
200
- ### 試したこと
201
-
202
- ここに問題に対して試しを記載してください。
139
+ HTMLが絡んできたとたん、理解が追ついておりません
203
-
204
- ### 補足情報(FW/ツールのバジョンなど
140
+ ド.gsとHTMLファイでコドを書き分ける意義などはわかっておらず、それが原因して行き詰まっているのかもと思っております。
205
-
206
- ここにより詳細情報を記載してい。
141
+ 私が大変初歩的部分の理解ができていないのかもれないと推察しいますが、何卒ご教授いたけたら助かります。どうぞよろしくお願いたします

1

誤字

2019/03/26 18:01

投稿

jzx100ts
jzx100ts

スコア28

title CHANGED
File without changes
body CHANGED
@@ -4,7 +4,7 @@
4
4
  複数のマーカーデータはスクリプト内に直接記述されているのですが、
5
5
  表示したいマーカーデータは日々変わるので、スプレッドシートから情報を読み込むようにしたいと思っております。
6
6
 
7
- 現在は下記の状態で、var locationsに。
7
+ 現在は下記の状態で、var locationsに入れた4件のマーカーデータに基づき、マーカーが設置できています
8
8
 
9
9
  HTMLファイル(map.html)
10
10
  ```