Google Spreadsheetで各シートをCSVとしてダウンロードするためのリンクを表示する。

#やりたいこと
Google Spreadsheetの複数シートをCSVとしてダウンロードする作業があります。
`file > Download as > Comma-separated values(.csv, current sheet)`を各シートでやるのは大変なので、簡略化したい。

下記の記事を参考に作成しました。

- [google apps script - Download "automatically" spreadsheet as .xlsx to local machine on event - Stack Overflow](https://stackoverflow.com/questions/37212135/download-automatically-spreadsheet-as-xlsx-to-local-machine-on-event/37336778#37336778)

差分としては、下記二点です。

- ダウンロード形式がxlsxではなく、csvファイルである。
- 上記に付随して、各シートごとのリンクを生成する必要がある。


##完成したコード
```javascript
//カスタムメニューを作成する。
function onOpen(e) {
  SpreadsheetApp.getUi()
      .createMenu('Custom')
      .addItem('Download as CSV', 'downloadCSV_GUI')
      .addToUi();
}

//ダウンロード用のURLを生成する。
function downloadCSV_GUI() {
  const ssID = SpreadsheetApp.getActive().getId();
  const URL = 'https://docs.google.com/spreadsheets/d/'+ssID+'/export?format=csv&gid=';
  const sheetID = {
    （シート1のID）:'（シート1の名前）',
    （シート2のID）:'（シート2の名前）'
  };

  //空の配列を作成する。
  var htmlObject = [];

  //対象シートの数だけ、配列にHTML（リンク）を追加する。
  for(key in sheetID)
  {
    htmlObject.push('<br><a href="'+URL+key+'">'+sheetID[key]+'</a>');
  }
    
  // ダウンロード用URLを表示したモーダル画面の表示
  var htmlOutput = HtmlService
                  .createHtmlOutput(htmlObject)
                  .setSandboxMode(HtmlService.SandboxMode.IFRAME)
                  .setWidth(400)
                  .setHeight(180);
  SpreadsheetApp.getUi().showModalDialog(htmlOutput, 'Click to Download');
}
```

#コードの説明
```javascript
//カスタムメニューを作成する。
function onOpen(e) {
  SpreadsheetApp.getUi()
      .createMenu('Custom')
      .addItem('Download as CSV', 'downloadCSV_GUI')
      .addToUi();
}
```
ダウンロード用のURLを表示するため、メニューに項目を追加します。

```javascript
//ダウンロード用のURLを生成する。
function downloadCSV_GUI() {
  const ssID = SpreadsheetApp.getActive().getId();
  const URL = 'https://docs.google.com/spreadsheets/d/'+ssID+'/export?format=csv&gid=';
```
ダウンロード用のURLは`https://docs.google.com/spreadsheets/d/（スプレッドシートID）/export?（オプション）`という形で指定することができるようです。
下記にまとまっています。

- [Example on how to export a Google sheet to various formats, includes most PDF options · GitHub](https://gist.github.com/Spencer-Easton/78f9867a691e549c9c70)

今回はCSVでダウンロードするので、`format=csv`として、各シートをシートID`gid=`で指定します。
シートIDは該当のシートを表示したときのURLで確認可能です。

```javascript
  const sheetID = {
    （シート1のID）:'（シート1の名前）',
    （シート2のID）:'（シート2の名前）'
  };
```
ダウンロード用リンクの表示名称をシート名にしたいので、連想配列で紐づけて格納しておきます。

```javascript
  //空の配列を作成する。
  var htmlObject = [];

  //対象シートの数だけ、配列にHTML（リンク）を追加する。
  for(key in sheetID)
  {
    htmlObject.push('<br><a href="'+URL+key+'">'+sheetID[key]+'</a>');
  }
```
表示したいURLのリストは配列として持っておきます。
空の配列を作成してから、シートの数だけURLを生成して配列に追加します。

連想配列`sheetID`の`key`がシートIDになっているため、それをURLの末尾に付与します。
`<a>`タグのテキストはIDに紐づくシート名なので、`sheetID[key]`で取り出します。

- [【JavaScript】連想配列のkeyとvalueの取得 - Qiita](https://qiita.com/glaytomohiko/items/852ea64bcfc1e4fc1b51)

```javascript
  // ダウンロード用URLを表示したモーダル画面の表示
  var htmlOutput = HtmlService
                  .createHtmlOutput(htmlObject)
                  .setSandboxMode(HtmlService.SandboxMode.IFRAME)
                  .setWidth(400)
                  .setHeight(180);
  SpreadsheetApp.getUi().showModalDialog(htmlOutput, 'Click to Download');
}
```
カスタムメニューをクリックすると、モーダルウィンドウが表示されます。
リンクをクリックすれば各シートがCSVとしてダウンロード可能です。

#参考URL
- [google apps script - Download "automatically" spreadsheet as .xlsx to local machine on event - Stack Overflow](https://stackoverflow.com/questions/37212135/download-automatically-spreadsheet-as-xlsx-to-local-machine-on-event/37336778#37336778)
- [Example on how to export a Google sheet to various formats, includes most PDF options · GitHub](https://gist.github.com/Spencer-Easton/78f9867a691e549c9c70)
- [【JavaScript】連想配列のkeyとvalueの取得 - Qiita](https://qiita.com/glaytomohiko/items/852ea64bcfc1e4fc1b51)