Creating a JSON object from Google Sheets

前端 未结 2 1730
傲寒
傲寒 2020-12-16 02:39

I am trying to learn AppScript and I am using Google Sheets as an example. I want to create a simple JSON object using some data populated in the Sheet.

Table Exampl

相关标签:
2条回答
  • 2020-12-16 03:15

    Please try:

    function getJsonArrayFromData(data)
    {
    
      var obj = {};
      var result = [];
      var headers = data[0];
      var cols = headers.length;
      var row = [];
    
      for (var i = 1, l = data.length; i < l; i++)
      {
        // get a row to fill the object
        row = data[i];
        // clear object
        obj = {};
        for (var col = 0; col < cols; col++) 
        {
          // fill object with new values
          obj[headers[col]] = row[col];    
        }
        // add object in a final result
        result.push(obj);  
      }
    
      return result;  
    
    }
    

    Test function:

    function test_getJsonArrayFromData()
    {
      var data =   
        [
          ['Planet', 'Mainland', 'Country', 'City'],
          ['Earth', 'Europe', 'Britain', 'London'],
          ['Earth', 'Europe', 'Britain', 'Manchester'],
          ['Earth', 'Europe', 'Britain', 'Liverpool'],
          ['Earth', 'Europe', 'France', 'Paris'],
          ['Earth', 'Europe', 'France', 'Lion']
        ];
    
        Logger.log(getJsonArrayFromData(data));
    
        // =>  [{Mainland=Europe, Country=Britain, Planet=Earth, City=London}, {Mainland=Europe, Country=Britain, Planet=Earth, City=Manchester}, {Mainland=Europe, Country=Britain, Planet=Earth, City=Liverpool}, {Mainland=Europe, Country=France, Planet=Earth, City=Paris}, {Mainland=Europe, Country=France, Planet=Earth, City=Lion}]
    
    }
    
    0 讨论(0)
  • 2020-12-16 03:25

    I know it's been a while, but I came up with a slightly more flexible solution. I've created an aptly named function that converts spreadsheet data to objects, given a set of headers and a set of rows.

    function convertToObjects(headers, rows)
    {
      return rows.reduce((ctx, row) => {
        ctx.objects.push(ctx.headers.reduce((item, header, index) => {
          item[header] = row[index];
          return item;
        }, {}));
        return ctx;
      }, { objects: [], headers}).objects;
    }
    

    You can call the above function like this:

    var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('YourSheetName');
    var [headers, ...rows] = sheet.getDataRange().getValues();
    var objects = convertToObjects(headers, rows);
    

    If you need to ignore the first row and get headers from the second row (like I do), then you can do this instead:

    var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('YourSheetName');
    var [_, headers, ...rows] = sheet.getDataRange().getValues();
    var objects = convertToObjects(headers, rows);
    

    If you have any improvements to this, please let me know in the comments below.

    0 讨论(0)
提交回复
热议问题