【GAS】GoogleAppsScriptで地図を扱うTips【GoogleMap】

## 概要
Googleのサービスでは、特にGoogleMapを頻繁に使う。GASでもGoogleMapを利用することができるので、地図を描写したり、画像として使うための操作をメモがてら紹介。

**参考**
[【Maps Service 公式リファレンス】](https://developers.google.com/apps-script/reference/maps)

**続編あり**
[GoogleAppsScriptで地図に線や円を描写する](https://qiita.com/YasumiYasumi/items/b5b24eadfe795b07a4e1)
[GoogleAppsScriptで2点間のルートと道中の標高を表示](https://qiita.com/YasumiYasumi/items/efc09921ae357e8aed1c)

## 地図を作成
まずは基本形。無から地図オブジェクトを生み出すメソッド`Maps.newStaticMap();`に、中心位置やサイズ、縮尺などのステータスを追加して地図を作成する。

```javascript
var map = Maps.newStaticMap()
              .setLanguage('ja')
              .setSize(250,250)
              .setZoom(15)
              .setCenter(35.684035700289, 139.7745919723237);
```

`.setLanguage()`：言語を指定。日本語なら「ja」。
`.setSize()`：地図のサイズ。1000×1000が最大。
`.setZoom()`：地図の縮尺。1～21で数字が大きいほど寄る。
`.setCenter()`：地図の中心。

上記のコードだと、こんな地図になる。
![map.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708687/350c6cb5-a351-15c8-7f49-af8f3d10d8af.png)

ちなみに`.setCenter()`はGoogleMapの検索結果をもとにしているので、緯度経度でなく住所やランドマークでもOK。上記の場合日本橋を中心にしているので`.setCenter('東京都中央区日本橋室町１丁目８−１')`や`.setCenter('日本橋麒麟像')`でも同じような結果になる。

## 地図にマーカーを追加する
作成した地図データに`.addMarker()`でマーカーを追加できる。

```javascript
var map = Maps.newStaticMap()
              .setLanguage('ja')
              .setSize(250,250)
              .setZoom(15)
              .setCenter(35.684035700289, 139.7745919723237)
              .addMarker(35.684035700289, 139.7745919723237);
```

中心と同じ位置にマーカーを指してるが、もちろん別の場所も指定可能。中心の設定と同じく、住所やランドマークでも設定できる。
![map (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708687/f29f2621-cc11-9cf1-b44f-7bcb97329829.png)
こんな風に`.addMarker()`の後付けもOK！同じ結果になる。

```javascript
var map = Maps.newStaticMap()
              .setLanguage('ja')
              .setSize(250,250)
              .setZoom(15)
              .setCenter(35.684035700289, 139.7745919723237);

map.addMarker(35.684035700289, 139.7745919723237);
```
別々に追加したり、一気に追加したり。

```javascript
map.addMarker(35.684035700289, 139.7745919723237);

map.addMarker(35.687110871398, 139.7732810636109)
   .addMarker(35.681878545635, 139.7716198826273)
   .addMarker(35.680605074855, 139.7770018267006);
```
![map (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708687/6b1c5d4c-71b3-0fef-e78d-090b52248285.png)
画角から外れても、エラーにはならず見切れるだけ。
## マーカーに続き番号を付ける
`.addMarker()`する前に`.setMarkerStyle()`でマーカーのスタイルを設定できる。ここではマーカーに番号を付ける事にだけ触れるが、同じメソッドでサイズや色も指定できる。

書き方はこんな感じ。

```javascript
map.setMarkerStyle(Maps.StaticMap.MarkerSize.MID, Maps.StaticMap.Color.RED, 1);
map.addMarker(35.684035700289, 139.7745919723237);
```
マーカーに「1」と番号が付いた。
![map.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708687/01fb52d1-6388-ecff-da0c-81f26d977fdc.png)

for文なんかで繰り返し番号を付けることもできる。ただ、`MarkerSize.MID`だと数字を２桁表示できないので、マーカーが多い場合はA～Zがオススメ。

```javascript
for(var i=1; i<=3; i++){
  var str = String.fromCharCode(64+i);
  map.setMarkerStyle(Maps.StaticMap.MarkerSize.MID, Maps.StaticMap.Color.RED, str);
  map.addMarker('日本橋' + i + '-1-1');
}
```

繰り返しながら「日本橋1-1-1」にA、「日本橋2-1-1」にB、「日本橋3-1-1」にCをそれぞれプロットした結果。
![map (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708687/a7acc48c-8a99-278f-244a-d4f47575cec9.png)
`CharaCode(65)`が「A」なので +1 することで B,C,D... と進められる。

他にも地図メソッドはあるけど目的が変わるだけで書き方は似ているので、あとはリファレンス見ながら応用するだけ。
## 地図をスプレッドシートに描写
いくつかある画像の描写方法で、スプレッドシートに描写するのが一番シンプル。

```javascript
var map = Maps.newStaticMap()
              .setLanguage('ja')
              .setSize(250,250)
              .setZoom(15)
              .setCenter(35.684035700289, 139.7745919723237)
              .addMarker(35.684035700289, 139.7745919723237);

var sheet = SpreadsheetApp.getActiveSheet();
sheet.insertImage(map, 1, 1);
```
地図オブジェクトと開始位置を指定するだけ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708687/1e4751e7-28bb-eb37-2363-2b1c7fc8bd33.png)
簡単^^

ただスプレッドシートに描写すると、地図を画像データとして取得するのが面倒。できないわけではないけど、一旦スプレッドシートをHTMLとかエクセルとしてダウンロードする作業が必要。

そのまま画像として使いたい場合はこの後。
## 地図をメールに添付
地図の用途は色々あるかと思うけど、GASで描写するのでGmailとの連携が出来たら便利そう。とりあえず描写した地図画像を添付した下書きを作ってみる。

先ほどのスプレッドシートへの描写と違い、地図オブジェクトを一度画像に変換する。

```javascript
var image = map.getBlob().getAs('image/png').setName('map.png');

GmailApp.createDraft(
        'test@gmail.com',//宛先
        'test',//件名
        'test',//本文
        {attachments: [image]}
        );
```
地図オブジェクトの作成部分はこれまでと同じなので省略。作成した`map`を、形式と名前を指定して`.getBlob()`する。あとはBlobを添付してメール下書きを作成する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708687/55758d2a-2a32-47da-cc0f-49e828ea761b.png)
出来た^^)b
## 地図をドライブに保存
もちろんドライブに保存することもできる。

```javascript
var image = map.getBlob().getAs('image/png').setName('map.png');

var folder = DriveApp.getFolderById('xxxxxxxxxx');
folder.createFile(image);
```
メールに添付するときと同じくBlobして、ドライブのフォルダを指定してファイルを作成している。
### おしまい