Javascript 从GoogleSheets创建JSON对象

Javascript 从GoogleSheets创建JSON对象,javascript,json,google-apps-script,google-sheets,Javascript,Json,Google Apps Script,Google Sheets,我正在尝试学习AppScript,并以Google Sheets为例。我想使用工作表中填充的一些数据创建一个简单的JSON对象 表格示例 Name ID Price Qty ABC 123 100 1 DEF 342 56 2 HIJ 233 90 3 IJK 213 68 5 我从以下Youtube教程开始:。但是,该视频讨论了如何将每个列标题创建为对象的标题。其中,我希望列名为键,行值为值 这

我正在尝试学习AppScript,并以Google Sheets为例。我想使用工作表中填充的一些数据创建一个简单的JSON对象

表格示例

Name ID Price Qty ABC 123 100 1 DEF 342 56 2 HIJ 233 90 3 IJK 213 68 5 我从以下Youtube教程开始:。但是,该视频讨论了如何将每个列标题创建为对象的标题。其中,我希望列名为
,行值为

这是我当前的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;
}
PS:我不是程序员,我只是在用黑客的方式学习一些脚本。抱歉不了解基本知识:)

请尝试:

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;  

}

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

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;
}
您可以这样调用上述函数:

var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('YourSheetName');
var [headers, ...rows] = sheet.getDataRange().getValues();
var objects = convertToObjects(headers, rows);
如果需要忽略第一行并从第二行获取标题(与我一样),则可以这样做:

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

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

哇,这真是太棒了。非常感谢你。我正在研究代码以了解它的功能。如果你能添加一些评论,那将非常有用。我想我犯的主要错误是返回Object
obj
而不是数组,对吗?具体来说,你能解释一下这行代码是什么意思吗?obj[headers[col]]=行[col]@maverick340它从第一行(列的标题)获取值并将其设置为键。然后,它将取您所在行中的值,并将其设置为值。希望有帮助@maverick340,您可以在每个步骤中使用
Logger.log()
,运行脚本并按
Ctrl+Enter
查看日志。看到中间结果可能会有帮助。@JordanRhea:谢谢你的初始视频教程和解释。非常有用!非常感谢。不客气!
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;
}
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('YourSheetName');
var [headers, ...rows] = sheet.getDataRange().getValues();
var objects = convertToObjects(headers, rows);
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('YourSheetName');
var [_, headers, ...rows] = sheet.getDataRange().getValues();
var objects = convertToObjects(headers, rows);