如何在生成的 JSON 中获取相应的列名称和值?
How do I get respective column names along with values in my generated JSON?
我正在使用此应用程序脚本代码在 Google 表格中的 sheet 中获取某些数据的 JSON 格式。
function doGet(request){
var mode = request.parameter.mode;
var search = request.parameter.q;
var sheetname = "Members"; //sheet name
var startcol = 1;
var endcol = 10;
var filtercol = 7;
var doc = SpreadsheetApp.openById(PropertiesService.getScriptProperties().getProperty("key"));
var sheet = doc.getSheetByName(sheetname);
var lastrow = sheet.getLastRow();
var rows = [];
var range = sheet.getRange(2,startcol,lastrow, endcol);
var values = range.getValues();
for(var row in values) {
rows.push([]);
for(var col in values[row]){
rows[row].push(values[row][col]);
}
}
//data retrieved, JSON formatting begins below (on the basis of presence of a filtering key)
if(search != null) { //if there is something to filter
var rowstoreturn = rows.filter(a => a[filtercol] == search);
return ContentService.createTextOutput(JSON.stringify({"data":rowstoreturn,"error":false})).setMimeType(ContentService.MimeType.JSON);
}
return ContentService.createTextOutput(JSON.stringify({"data":rows,"error":false})).setMimeType(ContentService.MimeType.JSON);
}
function setup() {
var doc = SpreadsheetApp.getActiveSpreadsheet();
PropertiesService.getScriptProperties().setProperty("key", doc.getId());
}
(在我上面的脚本中,如果我想获取过滤后的数据,我会发送参数q
,否则不会。所以如果我发送了它,我会得到一个JSON,它包含过滤后的数据。)
上面代码的成功 运行 给了我这个结果 -
{
"data": [
[
"LM-6000",
"Yes",
"Mr.",
"John",
"Doe",
1998,
"B.Com",
1234567890,
"sample@gmail.com",
"NYC"
]
],
"error": false
}
现在,如您所见,这些只是单元格值 - 我想要做的是获取相应的列名和值。像这样 -
{
"data": [
[
{
"Membership No.": "LM-6000",
"Logged In": "Yes",
"Salutation": "Mr.",
"FName": "John",
"LName": "Doe",
"GradYr": 1998,
"Course": "B.Com",
"Mobile No.": 1234567890,
"Email ID": "sample@gmail.com",
"City": "NYC"
}
]
],
"error": false
}
我应该如何修改我的代码以获得预期的结果?感谢任何帮助:) 谢谢!
据我所知,您想将数组转换为 object,其中 object 的键是 headers 列,object 的值] 是数组元素。可以用一个循环来完成:
var headers = ['a','b','c'];
var row = ['cell1','cell2','cell3'];
var obj = {};
row.forEach((cell,i) => obj[headers[i]] = cell);
console.log(obj);
预期输出:
{
"a": "cell1",
"b": "cell2",
"c": "cell3"
}
因此,函数 doGet()
的最后几行应如下所示:
...
if (search != null) {
var rows = rows.filter(a => a[filtercol] == search);
}
// get the first row of the table as a header
var header = sheet.getRange(1,startcol,1,endcol).getValues().flat();
// convert array of rows into the array of objects
rows = rows.map(row => {
var obj = {};
row.forEach((cell,i) => obj[headers[i]] = cell);
return obj;
})
// return the array of objects
return ContentService
.createTextOutput(JSON.stringify({"data":[rows],"error":false}))
.setMimeType(ContentService.MimeType.JSON);
}
我正在使用此应用程序脚本代码在 Google 表格中的 sheet 中获取某些数据的 JSON 格式。
function doGet(request){
var mode = request.parameter.mode;
var search = request.parameter.q;
var sheetname = "Members"; //sheet name
var startcol = 1;
var endcol = 10;
var filtercol = 7;
var doc = SpreadsheetApp.openById(PropertiesService.getScriptProperties().getProperty("key"));
var sheet = doc.getSheetByName(sheetname);
var lastrow = sheet.getLastRow();
var rows = [];
var range = sheet.getRange(2,startcol,lastrow, endcol);
var values = range.getValues();
for(var row in values) {
rows.push([]);
for(var col in values[row]){
rows[row].push(values[row][col]);
}
}
//data retrieved, JSON formatting begins below (on the basis of presence of a filtering key)
if(search != null) { //if there is something to filter
var rowstoreturn = rows.filter(a => a[filtercol] == search);
return ContentService.createTextOutput(JSON.stringify({"data":rowstoreturn,"error":false})).setMimeType(ContentService.MimeType.JSON);
}
return ContentService.createTextOutput(JSON.stringify({"data":rows,"error":false})).setMimeType(ContentService.MimeType.JSON);
}
function setup() {
var doc = SpreadsheetApp.getActiveSpreadsheet();
PropertiesService.getScriptProperties().setProperty("key", doc.getId());
}
(在我上面的脚本中,如果我想获取过滤后的数据,我会发送参数q
,否则不会。所以如果我发送了它,我会得到一个JSON,它包含过滤后的数据。)
上面代码的成功 运行 给了我这个结果 -
{
"data": [
[
"LM-6000",
"Yes",
"Mr.",
"John",
"Doe",
1998,
"B.Com",
1234567890,
"sample@gmail.com",
"NYC"
]
],
"error": false
}
现在,如您所见,这些只是单元格值 - 我想要做的是获取相应的列名和值。像这样 -
{
"data": [
[
{
"Membership No.": "LM-6000",
"Logged In": "Yes",
"Salutation": "Mr.",
"FName": "John",
"LName": "Doe",
"GradYr": 1998,
"Course": "B.Com",
"Mobile No.": 1234567890,
"Email ID": "sample@gmail.com",
"City": "NYC"
}
]
],
"error": false
}
我应该如何修改我的代码以获得预期的结果?感谢任何帮助:) 谢谢!
据我所知,您想将数组转换为 object,其中 object 的键是 headers 列,object 的值] 是数组元素。可以用一个循环来完成:
var headers = ['a','b','c'];
var row = ['cell1','cell2','cell3'];
var obj = {};
row.forEach((cell,i) => obj[headers[i]] = cell);
console.log(obj);
预期输出:
{
"a": "cell1",
"b": "cell2",
"c": "cell3"
}
因此,函数 doGet()
的最后几行应如下所示:
...
if (search != null) {
var rows = rows.filter(a => a[filtercol] == search);
}
// get the first row of the table as a header
var header = sheet.getRange(1,startcol,1,endcol).getValues().flat();
// convert array of rows into the array of objects
rows = rows.map(row => {
var obj = {};
row.forEach((cell,i) => obj[headers[i]] = cell);
return obj;
})
// return the array of objects
return ContentService
.createTextOutput(JSON.stringify({"data":[rows],"error":false}))
.setMimeType(ContentService.MimeType.JSON);
}