Javascript 从GoogleSheets创建JSON对象
我正在尝试学习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教程开始:。但是,该视频讨论了如何将每个列标题创建为对象的标题。其中,我希望列名为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代码
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);