質問編集履歴

4

今回の問題点の追記

2019/03/29 15:32

投稿

jzx100ts
jzx100ts

スコア28

test CHANGED
File without changes
test CHANGED
@@ -212,11 +212,9 @@
212
212
 
213
213
  }
214
214
 
215
- var locations = markerData;
216
-
217
- ```
215
+ ```
218
-
216
+
219
- などとしてmarkerData生成し、locationsに読み込んで使用したいのですが、上記のコードを<script>の中に記載すると、ページを開いても何も表示されないという状況です。それを削除してべた打ちの4件を入力するときちんとマップが表示されます。
217
+ などとしてスプレッドシートに入力されているデータをlocationsに読み込んで使用したいのですが、上記のコードを<script>の中に記載すると、ページを開いても何も表示されないという状況です。それを削除してべた打ちの4件を入力するときちんとマップが表示されます。
220
218
 
221
219
  HTMLファイルにいきなりこれを記載しても「SpreadsheetAppが定義されていない」ということで動かないのかと推測し、上記のものをコード.gsに関数の形で記載してみました。それでページを開くと、「その操作を実行するには承認が必要です。」となり、やはり地図は表示されません。
222
220
 
@@ -304,6 +302,32 @@
304
302
 
305
303
 
306
304
 
305
+ 今回の問題点は、
306
+
307
+ クライアント側JS[HTMLファイルに記述したJSスクリプトinitMap()の内部]から
308
+
309
+ サーバー側関数[コード.gsに記載したGASスクリプト]を直接呼び出そうとしていたことでした。
310
+
311
+ それをするにはgoogle.script.runなどが用意されているようですが、
312
+
313
+ 今回はhiroshi0240様がもっと簡単な「置換法」を教えてくださったので、すぐに解決しましたし、おかげで応用もすることができました。
314
+
315
+ 正しい表現かどうかわかりませんが、
316
+
317
+ HTMLファイルを生成する前の段階で、サーバー側(GAS)の処理でマーカーデータをスプレッドシートから読み込み、
318
+
319
+ 生成前のHTMLにマーカーデータを潜り込ませ(←ここが置換処理)、
320
+
321
+ そのデータに基づいてHTMLファイルを生成することで、
322
+
323
+ HTMLファイルのJS内部からサーバー側の処理を呼び出す必要はなくなった。というイメージです。
324
+
325
+
326
+
327
+ ゆくゆくはgoogle.script.runなども使いこなせるようになりたいと思います。
328
+
329
+
330
+
307
331
  ```GAS
308
332
 
309
333
  function doGet(e)

3

解決コードの追記

2019/03/29 15:32

投稿

jzx100ts
jzx100ts

スコア28

test CHANGED
File without changes
test CHANGED
@@ -228,10 +228,12 @@
228
228
 
229
229
 
230
230
 
231
+
232
+
233
+ ```GAS
234
+
231
235
  コード.gs
232
236
 
233
- ```
234
-
235
237
  function GETMARKERLIST(){
236
238
 
237
239
  var MarkerListSS = SpreadsheetApp.openById("SSID");
@@ -258,11 +260,15 @@
258
260
 
259
261
  }
260
262
 
263
+
264
+
265
+
266
+
261
- ```
267
+ ```
262
-
268
+
269
+
270
+
263
- map.html
271
+ ```html
264
-
265
- ```
266
272
 
267
273
  var locations = GETMARKERLIST();
268
274
 
@@ -279,3 +285,275 @@
279
285
  コード.gsとHTMLファイルでコードを書き分ける意義などはわかっておらず、それが原因して行き詰まっているのかもと思っております。
280
286
 
281
287
  私が大変初歩的な部分の理解ができていないのかもしれないと推察していますが、何卒ご教授いただけたら助かります。どうぞよろしくお願いいたします。
288
+
289
+
290
+
291
+
292
+
293
+
294
+
295
+ ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
296
+
297
+
298
+
299
+ おかげさまで解決しましたので、解決済みのコードを記載致します。
300
+
301
+ マーカーリストを2つのスプレッドシートから読み込み、
302
+
303
+ それぞれのマーカーをスプレッドシートごとに色分けする内容となっております。
304
+
305
+
306
+
307
+ ```GAS
308
+
309
+ function doGet(e)
310
+
311
+ {
312
+
313
+ var page=e.parameter["p"];
314
+
315
+ var p_map = 'map';//ファイル名
316
+
317
+
318
+
319
+ if (page == p_map) {//オートリロードGoogleMap
320
+
321
+ var markerdata = JSON.stringify(GETMARKERLIST());//GETMARKERLIST()の戻り値は配列オブジェクトなのでJSON 文字列に変換する
322
+
323
+ var markerdata2 = JSON.stringify(GETMARKERLIST2());//GETMARKERLIST()の戻り値は配列オブジェクトなのでJSON 文字列に変換する
324
+
325
+ var html = HtmlService.createHtmlOutputFromFile("map");
326
+
327
+ var content = html.getContent().replace(/%markerdata%/, markerdata );//ここで置換を実施する
328
+
329
+ var content2 = content.replace(/%markerdata2%/, markerdata2 );//ここで置換を実施する
330
+
331
+ return HtmlService.createHtmlOutput(content2)
332
+
333
+ .setTitle('地図')
334
+
335
+ .setFaviconUrl('fav.png')
336
+
337
+ .addMetaTag('viewport', "width=device-width, initial-scale=1, user-scalable=yes");
338
+
339
+ }
340
+
341
+ }
342
+
343
+
344
+
345
+ function GETMARKERLIST(){//グループ1のマーカー情報 スプレッドシートのA列にタイトル、B列に緯度、C列に経度を入力しておく
346
+
347
+ var MarkerListDATA = getData("****SSID****","MarkerList");
348
+
349
+ var markerData=[];
350
+
351
+ for (var i = 0 ; i < MarkerListDATA.length ; i++ ){
352
+
353
+ var temp_marker = [MarkerListDATA[i][0],MarkerListDATA[i][1],MarkerListDATA[i][2]];
354
+
355
+ markerData.push(temp_marker);
356
+
357
+ }
358
+
359
+ return markerData;
360
+
361
+ }
362
+
363
+
364
+
365
+ function GETMARKERLIST2(){//グループ2のマーカー情報 スプレッドシートのA列にタイトル、B列に緯度、C列に経度を入力しておく
366
+
367
+ var MarkerListDATA = getData("****SSID****","MarkerList2");
368
+
369
+ var markerData=[];
370
+
371
+ for (var i = 0 ; i < MarkerListDATA.length ; i++ ){
372
+
373
+ var temp_marker = [MarkerListDATA[i][0],MarkerListDATA[i][1],MarkerListDATA[i][2]];
374
+
375
+ markerData.push(temp_marker);
376
+
377
+ }
378
+
379
+ return markerData;
380
+
381
+ }
382
+
383
+
384
+
385
+ function getData(ssId,sheetName) {
386
+
387
+ // スプレッドシートの取得
388
+
389
+ var ss = SpreadsheetApp.openById(ssId);
390
+
391
+ // データの取得
392
+
393
+ var values = ss.getSheetByName(sheetName).getDataRange().getValues();
394
+
395
+
396
+
397
+ return values;
398
+
399
+ }
400
+
401
+ ```
402
+
403
+ ```HTML
404
+
405
+ <!DOCTYPE html>
406
+
407
+ <html>
408
+
409
+ <head>
410
+
411
+ <base target="_top">
412
+
413
+ <style type="text/css">
414
+
415
+ #ARmap{ height: 620px;
416
+
417
+ width: 100%;
418
+
419
+ margin:0 auto;}
420
+
421
+ </style>
422
+
423
+ </head>
424
+
425
+
426
+
427
+ <body>
428
+
429
+
430
+
431
+ <script type="text/javascript">
432
+
433
+
434
+
435
+ function initMap() {
436
+
437
+ var locations = %markerdata%;//ここがスプレッドシートの情報に置換される
438
+
439
+ var locations2 = %markerdata2%;//ここがスプレッドシートの情報に置換される
440
+
441
+
442
+
443
+ var map = new google.maps.Map(document.getElementById('ARmap'), {
444
+
445
+ zoom: 16,
446
+
447
+ center: new google.maps.LatLng(35.678244, 139.736343),
448
+
449
+ mapTypeId: google.maps.MapTypeId.ROADMAP
450
+
451
+ });
452
+
453
+
454
+
455
+ var infowindow = new google.maps.InfoWindow;
456
+
457
+ var marker, i;
458
+
459
+
460
+
461
+
462
+
463
+ //マーカーの読み込み(グループ1)
464
+
465
+ for (i = 0; i < locations.length; i++) {
466
+
467
+ marker = new google.maps.Marker({
468
+
469
+ position: new google.maps.LatLng(locations[i][1], locations[i][2]),
470
+
471
+ icon: 'http://chart.apis.google.com/chart?chst=d_map_pin_letter&chld=|00bfff|',//グループ2のマーカーの色指定
472
+
473
+ map: map
474
+
475
+ });
476
+
477
+
478
+
479
+ google.maps.event.addListener(marker, 'click', (function(marker, i) {
480
+
481
+ return function() {
482
+
483
+ infowindow.setContent(locations[i][0]);
484
+
485
+ infowindow.setContent(locations[i][0]);
486
+
487
+ infowindow.open(map, marker);
488
+
489
+ }
490
+
491
+ })(marker, i));
492
+
493
+ }
494
+
495
+
496
+
497
+ //マーカーの読み込み(グループ2)
498
+
499
+ for (i = 0; i < locations2.length; i++) {
500
+
501
+ marker = new google.maps.Marker({
502
+
503
+ position: new google.maps.LatLng(locations2[i][1], locations2[i][2]),
504
+
505
+ icon: 'http://chart.apis.google.com/chart?chst=d_map_pin_letter&chld=|aaaaaa|',//グループ1のマーカーの色指定
506
+
507
+ map: map
508
+
509
+ });
510
+
511
+
512
+
513
+ google.maps.event.addListener(marker, 'click', (function(marker, i) {
514
+
515
+ return function() {
516
+
517
+ infowindow.setContent(locations2[i][0]);
518
+
519
+ infowindow.setContent(locations2[i][0]);
520
+
521
+ infowindow.open(map, marker);
522
+
523
+ }
524
+
525
+ })(marker, i));
526
+
527
+ }
528
+
529
+ }
530
+
531
+ </script>
532
+
533
+
534
+
535
+ <script async defer
536
+
537
+ src="https://maps.googleapis.com/maps/api/js?key=xxxxxxxxxxxx&callback=initMap">//keyは自分のものを入力する
538
+
539
+ </script>
540
+
541
+
542
+
543
+
544
+
545
+ <div class="waku">
546
+
547
+ <h1>地図</h1>
548
+
549
+ <div id="ARmap"></div>
550
+
551
+ </div>
552
+
553
+
554
+
555
+ </body>
556
+
557
+ </html>
558
+
559
+ ```

2

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

2019/03/29 15:13

投稿

jzx100ts
jzx100ts

スコア28

test CHANGED
File without changes
test CHANGED
@@ -1,12 +1,8 @@
1
1
  ### 前提・実現したいこと
2
2
 
3
- 現在、GASによるウェブアプリケーション上で、
4
-
5
- GoogleMapを使って複数のマーカーを設置し、吹き出しも動くようになりました。
3
+ 現在、GASによるウェブアプリケーション上で、GoogleMapを使って複数のマーカーを設置し、吹き出しも動くようになりました。
6
-
7
- 複数のマーカーデータはスクリプト内に直接記述されているのですが、
4
+
8
-
9
- 表示したいマーカーデータは日々変わるので、スプレッドシートから情報を読み込むようにしたいと思っております。
5
+ 複数のマーカーデータはスクリプト内に直接記述されているのですが、設置したい複数のマーカーデータは日々位置と情報をえたいので、スプレッドシートに保存してある情報からマーカーデータを読み込むようにしたいと思っております。
10
6
 
11
7
 
12
8
 
@@ -168,9 +164,31 @@
168
164
 
169
165
  ### 発生している問題・エラーメッセージ
170
166
 
171
-
167
+ ```
168
+
172
-
169
+ [
170
+
171
+ ['しぶや<br><a href="http://www.yahoo.co.jp">やふー</a>', 35.658319, 139.700922],
172
+
173
+ ['はらじゅく<br><a href="http://www.google.co.jp">ぐーぐる</a>', 35.669276, 139.702762],
174
+
175
+ ['おもてさんどう<br><a href="http://www.apple.co.jp">あぽ</a>', 35.665435, 139.711565],
176
+
177
+ ['えびす<br><a href="http://www.amazon.co.jp">あま</a>', 35.647915, 139.709687 ]
178
+
179
+ ]
180
+
181
+ ```
182
+
183
+ 上記の部分をスプレッドシートに保存されたデータから読み込みたいのですが実現できません。
184
+
185
+
186
+
187
+ ### 試したこと
188
+
189
+
190
+
173
- 不勉強でお恥ずかしいのですが、スプレッドシートから情報を読み込むために、
191
+ 不勉強でお恥ずかしいのですが、とあるスプレッドシートに保存されているマーカーデータ随時var locationsに読み込むために、
174
192
 
175
193
  ```
176
194
 
@@ -182,6 +200,48 @@
182
200
 
183
201
 
184
202
 
203
+ var locations = [];
204
+
205
+ for (var i = 0 ; i < MarkerListDATA.length ; i++ )
206
+
207
+ {
208
+
209
+ temp_marker = [MarkerListDATA[i][0],MarkerListDATA[i][1],MarkerListDATA[i][2]];
210
+
211
+ locations.push(temp_marker);
212
+
213
+ }
214
+
215
+ var locations = markerData;
216
+
217
+ ```
218
+
219
+ などとしてmarkerDataを生成し、locationsに読み込んで使用したいのですが、上記のコードを<script>の中に記載すると、ページを開いても何も表示されないという状況です。それを削除してべた打ちの4件を入力するときちんとマップが表示されます。
220
+
221
+ HTMLファイルにいきなりこれを記載しても「SpreadsheetAppが定義されていない」ということで動かないのかと推測し、上記のものをコード.gsに関数の形で記載してみました。それでページを開くと、「その操作を実行するには承認が必要です。」となり、やはり地図は表示されません。
222
+
223
+ HTMLファイルに直接記述した最初のトライのときには「このアプリケーションは、Google ではなく、別のユーザーによって作成されたものです。不正行為を報告 - 利用規約」が表示され、地図だけが出ない状態でしたが、
224
+
225
+ コード.gsに関数を作って試した2回目のトライでは、GASのロゴと「その操作を実行するには承認が必要です。」だけが表示されました。
226
+
227
+ 以下が2回目のトライで試したコードになります。
228
+
229
+
230
+
231
+ コード.gs
232
+
233
+ ```
234
+
235
+ function GETMARKERLIST(){
236
+
237
+ var MarkerListSS = SpreadsheetApp.openById("SSID");
238
+
239
+ var MarkerListSH = MarkerListSS.getSheetByName("SheetName");
240
+
241
+ var MarkerListDATA = MarkerListSH.getDataRange().getValues();
242
+
243
+
244
+
185
245
  var markerData=[];
186
246
 
187
247
  for (var i = 0 ; i < MarkerListDATA.length ; i++ )
@@ -194,48 +254,6 @@
194
254
 
195
255
  }
196
256
 
197
- ```
198
-
199
- などとしてmarkerDataを作成し、それを読み込みリストに使用したいのですが、
200
-
201
- 上記のコードを<script>の中に記載すると、ページを開いても何も表示されないという状況です。
202
-
203
- それを削除するとマップが表示されます。
204
-
205
- HTMLファイルにいきなり記載しても「SpreadsheetAppが定義されていない」ということで動かないのかと推測し、
206
-
207
- 上記のものをコード.gsに関数の形で記載してみました。
208
-
209
- 以下が最後に試したコードになります。
210
-
211
-
212
-
213
- コード.gs
214
-
215
- ```
216
-
217
- function GETMARKERLIST(){
218
-
219
- var MarkerListSS = SpreadsheetApp.openById("SSID");
220
-
221
- var MarkerListSH = MarkerListSS.getSheetByName("SheetName");
222
-
223
- var MarkerListDATA = MarkerListSH.getDataRange().getValues();
224
-
225
-
226
-
227
- var markerData=[];
228
-
229
- for (var i = 0 ; i < MarkerListDATA.length ; i++ )
230
-
231
- {
232
-
233
- temp_marker = [MarkerListDATA[i][0],MarkerListDATA[i][1],MarkerListDATA[i][2]];
234
-
235
- markerData.push(temp_marker);
236
-
237
- }
238
-
239
257
  return markerData
240
258
 
241
259
  }
@@ -246,166 +264,18 @@
246
264
 
247
265
  ```
248
266
 
249
- GETMARKERLIST()
267
+ var locations = GETMARKERLIST();
250
-
268
+
251
- ```
269
+ ```
252
-
253
-
254
-
255
-
256
-
257
- ### 該当のソースコード
270
+
258
-
259
-
260
-
261
- var map;
271
+
262
-
263
- var marker = [];
272
+
264
-
265
- var infoWindow = [];
266
-
267
- var markerData = [ // マーカーを立てる場所名・緯度・経度
268
-
269
- {
270
-
271
- name: 'TAM 東京',
272
-
273
- lat: 35.6954806,
274
-
275
- lng: 139.76325010000005,
276
-
277
- icon: 'tam.png' // TAM 東京のマーカーだけイメージを変更する
278
-
279
- }, {
280
-
281
- name: '小川町駅',
282
-
283
- lat: 35.6951212,
284
-
285
- lng: 139.76610649999998
286
-
287
- }, {
288
-
289
- name: '淡路町駅',
290
-
291
- lat: 35.69496,
292
-
293
- lng: 139.76746000000003
294
-
295
- }, {
296
-
297
- name: '御茶ノ水駅',
298
-
299
- lat: 35.6993529,
300
-
301
- lng: 139.76526949999993
302
-
303
- }, {
304
-
305
- name: '神保町駅',
306
-
307
- lat: 35.695932,
308
-
309
- lng: 139.75762699999996
310
-
311
- }, {
312
-
313
- name: '新御茶ノ水駅',
314
-
315
- lat: 35.696932,
316
-
317
- lng: 139.76543200000003
318
-
319
- }
320
-
321
- ];
322
-
323
-
324
-
325
- function initMap() {
326
-
327
- // 地図の作成
328
-
329
- var mapLatLng = new google.maps.LatLng({lat: markerData[0]['lat'], lng: markerData[0]['lng']}); // 緯度経度データ作成
273
+ ネットで情報を探しても、マーカーや吹き出しについての情報は見つかるのですが、Googleスプレッドシートに保存されている文字データやlatlangを読み込んで、マーカー設置リストに使用している実例が見つからず、こちらで質問させていただきました。
330
-
331
- map = new google.maps.Map(document.getElementById('sample'), { // #sampleに地図を埋め込む
274
+
332
-
333
- center: mapLatLng, // 地図の中心を指定
334
-
335
- zoom: 15 // 地図のズームを指定
336
-
337
- });
338
-
339
-
340
-
341
- // マーカー毎の処理
342
-
343
- for (var i = 0; i < markerData.length; i++) {
344
-
345
- markerLatLng = new google.maps.LatLng({lat: markerData[i]['lat'], lng: markerData[i]['lng']}); // 緯度経度のデータ作成
346
-
347
- marker[i] = new google.maps.Marker({ // マーカーの追加
348
-
349
- position: markerLatLng, // マーカーを立てる位置を指定
350
-
351
- map: map // マーカーを立てる地図を指定
352
-
353
- });
354
-
355
-
356
-
357
- infoWindow[i] = new google.maps.InfoWindow({ // 吹しの追加
275
+ 感覚としてはそれほど難しいことでは無いのではないかと感じるものの、これまで独学でスプレッドシート周りのことを中心にGASを扱ってで、
358
-
359
- content: '<div class="sample">' + markerData[i]['name'] + '</div>' // 吹き出しに表示する内容
276
+
360
-
361
- });
362
-
363
-
364
-
365
- markerEvent(i); // マーカーにクリックイベントを追加
366
-
367
- }
368
-
369
-
370
-
371
- marker[0].setOptions({// TAM 東京のマーカーのオプション設定
372
-
373
- icon: {
374
-
375
- url: markerData[0]['icon']// マーカーの画像を変更
376
-
377
- }
378
-
379
- });
380
-
381
- }
382
-
383
-
384
-
385
- // マーカーにクリックイベントを追加
386
-
387
- function markerEvent(i) {
388
-
389
- marker[i].addListener('click', function() { // マーカーをクリックしたとき
390
-
391
- infoWindow[i].open(map, marker[i]); // 吹き出しの表示
392
-
393
- });
394
-
395
- }
396
-
397
-
398
-
399
- ### 試したこと
400
-
401
-
402
-
403
- ここに問題に対して試しを記載しください
277
+ HTMLが絡んできたとたん、理解が追いついおりません
404
-
405
-
406
-
278
+
407
- ### 補足情報(FW/ツールのバジョンなど
279
+ ド.gsとHTMLファイでコドを書き分ける意義などはわかっておらず、それが原因して行き詰まっているのかもと思っております。
408
-
409
-
410
-
280
+
411
- ここにより詳細情報を記載してください。
281
+ 私が大変初歩的部分の理解ができていないのかもれないと推察しいますが、何卒ご教授いただけたら助かります。どうぞよろしお願いたします

1

誤字

2019/03/26 18:01

投稿

jzx100ts
jzx100ts

スコア28

test CHANGED
File without changes
test CHANGED
@@ -10,7 +10,7 @@
10
10
 
11
11
 
12
12
 
13
- 現在は下記の状態で、var locationsに。
13
+ 現在は下記の状態で、var locationsに入れた4件のマーカーデータに基づき、マーカーが設置できています
14
14
 
15
15
 
16
16