Googleドライブのフォルダに格納したcsvファイルをGASで読み取りスプレッドシート->json化して出力する

# はじめに
## What is this
Googleドライブの特定の名称のフォルダ内に格納したcsvファイルを全て読み取り、
シートに出力するGoogle App Scriptと、
スプレッドシートを外部公開することで、URLのクエリパラメータのコピペのみでjsonファイルを公開する手順を示しました。

##  背景
[pythonsスクリプトでcsvをスクレイピングしてjson出力する方法](https://qiita.com/iori_ama/items/6cc8f4162b52387e4a46)を示しましたが、
csvをサーバーに置く前の段階として、しばらくcsvデータをメールで受領する時期がありました。
* 今後の運用を踏まえるとjsonデータを読みとる方法は変えたくない
* 可能な限りjsonデータ化する手間を少なくしたい
の2点を解決するため、下記のようなフローを考えました。
* メールで受領したcsvを特定のGoogleドライブフォルダにアップロードする
* 自動でスプレッドシートのデータが更新される
* googleスプレッドシートから出力したjsonファイルから情報取得する

本件ではその説明をしています。

## ソースコード
https://github.com/iamakawa/CSV2JSON_GAS

# how to use
## csvファイルの読み込み
本コードをGoogle App Scriptにコピーし、CSVを格納するフォルダ名を任意の名称に変更してください。
※直下のフォルダでなくとも使用できますが、固有名詞としてください
csvを格納し、本スクリプトを実行するとcsvを読み取り、スプレッドシートにファイル名のシートを作成します。
(すでにシートが作成されている場合は`clear`します)
![スクリーンショット 2020-04-17 13.53.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90313/957d1a71-75f7-98d6-6a04-dabc9de65832.png)
![スクリーンショット 2020-04-17 13.53.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90313/7f354566-9eb4-2498-c807-955919c51f57.png)


## APIとしてスプレッドシートを出力する方法
- Googleスプレッドシートのメニューで「ファイル->ウェブに公開」で「公開」を選択する
![スクリーンショット 2020-04-17 13.51.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90313/bab75b85-9b1e-d822-5859-d04db569486b.png)
![スクリーンショット 2020-04-17 13.52.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90313/1e8677a5-37fd-42ba-e652-32bfe178dca9.png)

- https://docs.google.com/spreadsheets/d/xxxxx/edit#gid=0
  - スプレッドシートの「xxxx」部分をコピー
 ![スクリーンショット 2020-04-17 14.03.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90313/3e925be5-0b97-d115-9df0-142166366196.png)

- https://spreadsheets.google.com/feeds/list/YYYY/ZZ/public/values?alt=json
  - `YYYY`:先程コピーした「xxxx」の部分をペースト
  - `ZZ`: シートを左から数えた順番。左から2番目なら「2」
  - 置き換えた値で実行するとjsonファイルを出力できる。
![スクリーンショット 2020-04-17 14.05.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90313/4b5bf7e1-6139-285d-2e98-6481d91a927e.png)
  
# 技術仕様
```javascript:csv2json_gas.gs
function csv2json() {
  //書き込む対象のSpread Sheetを定義
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sh = ss.getActiveSheet();
  
  // 対象のCSVファイルが置かれているフォルダ名、ファイル名を定義
  var folderName = "data";
  var folders = DriveApp.getFoldersByName(folderName);

 while (folders.hasNext()) {
    var folder = folders.next();
    if (folder.getName() == folderName) {
      var files = folder.getFiles();
      while (files.hasNext()) {
        var file = files.next();
        var sheetName = file.getName();
        sheetName = sheetName.substr(0,sheetName.length-4);
        
        var sh = ss.getSheetByName(sheetName);
        if(sh == null)
        {
          ss.insertSheet(sheetName);
          sh = ss.getSheetByName(sheetName);
        }
        else
        {
          sh.clear()
        }
        
        var data = file.getBlob().getDataAsString("Shift_JIS");
        var csv = Utilities.parseCsv(data);
        sh.getRange(1,1,csv.length,csv[0].length).setValues(csv);
      }
      return;
    }
  }
}
```
*  フォルダ内の全データを対象にしている
* ファイル名からシート名を抽出、シートが無ければ新たに生成、あればシートをcleanする
* コードを簡略化するため、エラーケースは未考慮(csv以外のファイルを入れないこと)

# 参考
Google Apps ScriptでCSVファイルをGoogleスプレッドシートにインポートする
https://qiita.com/YusukeKameyama/items/5ae840ec8d4382a215db