4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

スプレッドシートでjsonを作成(多次元配列?)

Posted at

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

参考サイト

シートの形

img.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、data02、data03を作成
        list[index] = member;
        //data03に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
        }
      ]
    }
  }
]

やったこと

参考サイトを元に、もう1つforEachの文を作成し、追加するようにした。

反省点

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?