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)
我知道已经有一段时间了,但我想出了一个稍微更灵活的解决方案。我创建了一个恰当命名的函数,在给定一组标题和一组行的情况下,将电子表格数据转换为对象。
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)
如果您对此有任何改进,请在下面的评论中告诉我。