如何在生成的 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);

}