Google マイマップのバックアップを Google Apps Script で定期的に取得する

## 背景
友人達と [Google マイマップ](https://www.google.co.jp/intl/ja/maps/about/mymaps/) を共有し、身内用の [ツーリングマップル](http://www.mapple.co.jp/mapple/product/map/drive/touringmapple.html) のようなものを作成しています。
おかげさまで、かなりピンが増えて凄いことになってきました...
<img src="https://qiita-image-store.s3.amazonaws.com/0/59994/2f751469-f2f4-123b-d8c9-13bfeaa8e9ff.png" width="50%">

マイマップを使ってみて、以下のような欠点があることが分かりました。

- 編集履歴が残らない。( => 誰が編集したかが分からない )
- レイヤがワンアクションで簡単に削除できてしまう

友人のみで運用しているとはいえ、誤操作のロールバックができないのは非常にまずいと思い、
定期的に Google Drive にバックアップを取得する方法を考えました。

## 使用したツール
- Google Apps Script (以下 GAS)
- Google Drive

## 定期バックアップ実現までの手順

### 1. マイマップの KMZ 形式でのエクスポートリンクを取得
注意: 仕様が公開されているわけではないので、今後仕様変更の可能性も高いので注意してください。
(1) マイマップの編集画面から、 「KML / KMZ にエクスポート」 を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/59994/ec2d1f4d-63cd-608f-9ff9-3e665896823d.png)

(2) 何にもチェックを入れないまま、ダウンロードします。 KMZ ファイルがダウンロードできます。
この画面も結構仕様が変わる様子なので、今後微妙に内容が変わるかもしれません。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/59994/ba1e07cf-c9f1-b3de-90ce-5d59a237bda3.png)

(3) ダウンロードしたファイルの情報から、入手先 URL を取得します。
以下は Mac でファイルの 「情報を見る」 で確認したところです。
Windows でもファイルのプロパティを開くと詳細情報タブあたりにあったはずです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/59994/21c0b884-c1e4-29e8-db04-dad81623c2c0.png)

(4) (3) の URL の `&cid` までの部分を抜き出します。
これが KMZ ファイルを直接ダウンロードできるリンクになります。
`mid`... map id ですかね
`https://www.google.com/maps/d/u/1/kml?hl=ja&mid=[ユニークなIDっぽい文字列]`

(5) マップの共有範囲を 「リンクを知っている全員」 に変更
忘れがちなので注意！
「共有」 → 「アクセスできるユーザー」 → 「変更」 で共有範囲の変更ができます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/59994/1395f96c-5076-faa3-9970-f22e601ccf3c.png)


### 2. バックアップスクリプト作成
(1) Google Drive にバックアップ用フォルダを作っておきます。
一番上の階層にフォルダを作りました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/59994/fd35a429-ca08-85b4-9718-15960251e757.png)


(2) https://script.google.com/ から 「新規スクリプト」 を作成します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/59994/5fd0c719-2e34-6241-26ba-6df6e224c052.png)

(3) バックアップを実行するスクリプトを記述します。

```javascript:コード.gs
function myFunction() {
  var dir = DriveApp.getFoldersByName("[Google Drive 保存先フォルダパス]").next();
  var url = "[1. (4) で得たダウンロードリンク]";
  var response = UrlFetchApp.fetch(url, { muteHttpExceptions: true });
  if (response.getResponseCode() == 200) {
    var formattedDate = Utilities.formatDate(new Date(), "JST", "yyyy_MMdd_HHmm");
    var blob = response.getBlob().setName("mapbak_" + formattedDate + ".kmz");
    dir.createFile(blob);
  }
}
```
`Google Drive 保存先フォルダパス`は一番上の階層のフォルダなので `"mapbaktest"` だけで十分です。
`setName` のバックアップファイル名はお好みで調整してください。

(4) 実行してみます。
実行時プロジェクト名入力を求められたり、権限を要求されたりしますが、適当に入力や承認してください。
(もちろん権限承認は内容を精査してた上で行ってください)
実行時エラーが出なければ、 Drive の保存先フォルダを確認してみてください。
エラーが出た場合は、 `Logger.log` を駆使して `response` あたりを確認してみるといいでしょう(適当)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/59994/128a28e7-3dfb-d295-e4a1-07ffbc91d18f.png)
これで、 GAS を実行するだけで KMZ ファイルがバックアップできるようになりました。


### スクリプトの定期実行設定
このままでは毎日手動で実行しにこないと駄目なので、自動的に実行するようにします。

矢印のマークから 「プロジェクトのトリガー」 を設定できます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/59994/2fdcb83c-61ae-b652-e3a0-917d4918330c.png)

一例ですが、以下の設定で 「毎日」、 「AM 4~5 時の間」 に実行されるようになります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/59994/5bd16e95-0e6b-8b50-c10f-3559799b3a28.png)

毎日きっちりの時間に動作させることもできるのですが、ここでは説明しません。

以下、毎日動いてる様子
![image.png](https://qiita-image-store.s3.amazonaws.com/0/59994/584d6d52-793c-8870-20e5-3d4a8359f8e7.png)


## 応用

取得した最新の KMZ から県ごとのピン数を集計し、人気の県ランキングを作るみたいなこともできます。
今後気力があったら書きます。
(`.KMZ` = `.ZIP` ファイルなので、 `unzip` などで解凍することで、ピンの情報が格納されている `XML` ファイルが得られます)

## おわりに
- GAS は超便利
- 「GAS で操作しやすいから」 は Google のサービスを選択する十分な理由になりそう
- マイマップも楽しいので是非使ってみて下さい