スプレッドシートでjsonを作成（多次元配列？）

スプレッドシートからjsonデータを作成することになり、それが多次元配列（？）だったので、参考サイトを元に作成しました。

### 参考サイト
https://liginc.co.jp/179788

### シートの形
![img.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287209/ca7176f8-5e1a-d864-3967-5fb010377f44.png)

### ソース

```
  function getJsonData(){
    //今開いているシートを取得する
    var sheet = SpreadsheetApp.getActiveSheet();
    
    //項目になる行までを入れる
    var dataline = 3;
    
    //最大行数から項目の行数を削り、値になる範囲までの行数にする
    var maxline = sheet.getLastRow() - dataline;

    // シートの一部分の値を取得する
    // 1階層目
    var keys01 = sheet.getSheetValues(1, 1, 1, sheet.getLastColumn())[0].filter(String);
    var data01 = sheet.getRange(4, 1, maxline, 3).getValues();
    
    // 2階層目
    var keys02 = sheet.getSheetValues(2, 3, 1, 9)[0].filter(String);
    var data02 = sheet.getRange(4, 3, maxline, 9).getValues();
    
    // 3階層目
    var keys03 = sheet.getSheetValues(3, 3, 1, 3)[0].filter(String);
    var data03A = sheet.getRange(4, 3, maxline, 3).getValues();
    var data03B = sheet.getRange(4, 6, maxline, 3).getValues();
    var data03C = sheet.getRange(4, 9, maxline, 3).getValues();
    
    //空の配列を作成
    var list = [];
    var list02 = [];
    var dataA = [];
    var dataB = [];
    var dataC = [];
    
    //data03の中に入るA~Cまでを作成
    data02.forEach(function(elm,index){
        var template = indexBy(keys02);
        var member = generate(elm, template);
        //まずはA~Cまでのsubject、time、scoreを作成
        list02[index] = member;
        //A~Cのsubject、time、scoreを入れていく
        data03A.forEach(function (elm, index) {
            var member = [];
            var template = indexBy(keys03);
            member.push(generate(elm, template));
            dataA[index] = member;
        });
        data03B.forEach(function (elm, index) {
            var member = [];
            var template = indexBy(keys03);
            member.push(generate(elm, template));
            dataB[index] = member;
        });
        data03C.forEach(function (elm, index) {
            var member = [];
            var template = indexBy(keys03);
            member.push(generate(elm, template));
            dataC[index] = member;
        });
        //list02にA~Cを入れていく
        list02[index].A = dataA[index]
        list02[index].B = dataB[index]
        list02[index].C = dataC[index]
    });
    
    data01.forEach(function(elm,index){
        var template = indexBy(keys01);
        var member = generate(elm, template);
      　//listにdata01、data0２、data0３を作成
        list[index] = member;
        //data0３にlist02を入れる
        list[index].data03 = list02[index]
    });
    
    return JSON.stringify(list, null, "  ");
      
    function generate(elm,obj){
      var i = 0;
      for(var key in obj){
        obj[key] = elm[i];
        i++;
      }
      return obj;
    }

    function indexBy(ary){
      var obj = {};
      for(var i = 0, len = ary.length; i < len; i++){
        var key = ary[i];
        obj[key] = key;
      }
      return obj;
    }
```
### 結果
```
[
  {
    "data01": "学校01",
    "data02": "会場01",
    "data03": {
      "A": [
        {
          "subject": "国語",
          "time": 100,
          "score": 100
        }
      ],
      "B": [
        {
          "subject": "数学",
          "time": 90,
          "score": 90
        }
      ],
      "C": [
        {
          "subject": "英語",
          "time": 80,
          "score": 80
        }
      ]
    }
  },
  {
    "data01": "学校02",
    "data02": "会場02",
    "data03": {
      "A": [
        {
          "subject": "国語",
          "time": 110,
          "score": 110
        }
      ],
      "B": [
        {
          "subject": "数学",
          "time": 100,
          "score": 100
        }
      ],
      "C": [
        {
          "subject": "英語",
          "time": 90,
          "score": 90
        }
      ]
    }
  }
]
```


### やったこと
参考サイトを元に、もう１つforEachの文を作成し、追加するようにした。

### 反省点
- 繰り返しやっている処理はもっと省略できると思う
- data3とかは、list02を入れるためにいったん適当な値を入れているが、空にする方法もあると思う
- 急ぎの中でやったので荒々しい