从Google表格创建JSON对象

mav*_*340 5 javascript json google-sheets google-apps-script

我正在尝试学习AppScript,我正在使用Google表格作为示例.我想使用Sheet中填充的一些数据创建一个简单的JSON对象.

表格示例

Name    ID   Price   Qty
ABC     123  100      1
DEF     342   56      2
HIJ     233   90      3
IJK     213   68      5

我想让JSON成为类似的东西

[
  {
    "Name": "ABC",
    "ID": "123",
    "Price": 100,
    "Qty": 1
  },
  {
    "Name": "DEF",
    "ID": "342",
    "Price": 56,
    "Qty": 2
  },
  {
    "Name": "HIJ",
    "ID": "233",
    "Price": 90,
    "Qty": 3
  },
  {
    "Name": "IJK",
    "ID": "213",
    "Price": 68,
    "Qty": 5
  }
]
Run Code Online (Sandbox Code Playgroud)

我开始关注这个Youtube教程:https://www.youtube.com/watch?v = TQzPIVJf6-w.但是,该视频讨论了将每个列标题创建为对象的问题.在哪里我想要列名称key和行值为value.

这是我目前的AppScript代码

function doGet() {
  var result={};
  var rewards = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1')
  .getDataRange()
  .getValues();

  result.rewardObj = makeObject(rewards);
  //Logger.log(result.rewardObj);
  return ContentService.createTextOutput(JSON.stringify(result))
  .setMimeType(ContentService.MimeType.JSON)


}

function makeObject(multiArray)
{
  var obj = {}; 
  var colNames = multiArray.shift();
  var rowNames = multiArray.slice(0,1);
  var rowCount = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1').getLastRow();
  var colCount = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1').getLastColumn();

  for(var j=0;j<4;j++)
  {
    for(var i=0;i<4;i++)
      {
        //obj[colNames] = rowNames.map(function(item){return item[i];});
        obj[colNames[j][i]] = multiArray[j][i];
      }
  }
  Logger.log(rowCount)
  Logger.log(colCount)
  Logger.log(multiArray[57][12]);
  return obj;
}
Run Code Online (Sandbox Code Playgroud)

输出是单个对象

{"rewardObj":{"Name":"ABC","ID":"123","Price":"100","Qty":"1"}}
Run Code Online (Sandbox Code Playgroud)

PS:我不是程序员,我只是以hackey的方式学习一些脚本.不知道基础的道歉:)

Max*_*rov 11

请试试:

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;  

}
Run Code Online (Sandbox Code Playgroud)

测试功能:

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}]

}
Run Code Online (Sandbox Code Playgroud)

  • @ maverick340它从第一行(列的标题)中获取值并将其设置为键.然后它将获取您所在行中的值,并将其设置为值.希望有所帮助! (2认同)
  • @ maverick340,你可以在每一步中使用`Logger.log()`,运行脚本并按"Ctrl + Enter"查看日志.看到中间结果可能会有所帮助. (2认同)

Rya*_*ney 9

我知道已经有一段时间了,但我想出了一个稍微更灵活的解决方案。我创建了一个恰当命名的函数,在给定一组标题和一组行的情况下,将电子表格数据转换为对象。

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;
}
Run Code Online (Sandbox Code Playgroud)

您可以像这样调用上面的函数:

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

如果您需要忽略第一行并从第二行获取标题(就像我一样),那么您可以这样做:

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

如果您对此有任何改进,请在下面的评论中告诉我。