Los datos de la tabla que obtengo de la hoja de cálculo serían como

Name      Position  Office  Age   ...  << headers
Thor      Developer A       33    ...  << body
Quinn     Support   C       44    ...     .
Jennifer  Junior    Wide    22    ...     .
...       ...       ...     ...   ...     .

Cómo convertirlos en un objeto y devolverlos como este resultado

{
  Name     : ["Thor"      ,"Quinn"   ,"Jennifer" ,...]
  Position : ["Developer" ,"Support" ,"Junior"   ,...]
  Office   : ["A"         ,"C"       ,"Wide"     ,...]
  Age      : ["33"        ,"44"      ,"22"       ,...]
  ...      : [...         ,...       ,...        ,...]
}

¿Es esto posible hacer?

en el lado del código puedo obtener las claves correctamente pero con datos nulos

function tableToObject() {
  var values = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1").getDataRange().getValues()

  var headers = values[0]
  var body = values.slice(1)

  var keys = {}

  headers.forEach(function(c){
    keys[c] = body.map(r => r[c]) // stuck with this part
  })
  Logger.log(keys)
}

Hoja de muestra https://docs.heogle.com/spps //docs.google/ d / 1n8WBKOGfV7q9cIKnTxFmy4xSjSZTCx-3tsMrrXj28xU / edit? usp = sharing

Gracias de antemano

0
zummontt 4 jun. 2020 a las 06:52

3 respuestas

La mejor respuesta

A veces es útil comentar el código para dividir una función en pasos lógicos.

Obtiene el resultado deseado usando el siguiente código:

function tableToObject() {
// Get the table values
  var values = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1").getDataRange().getValues(); 
// Extract headers
  var headers = values[0];
// Extract the body
  var body = values.slice(1);
// Initialize keys obj
  var keys = {};
// You need an index for looping through the body rows
  var i = 0;
// For each header
  headers.forEach(function(c){
  // Create an empty list for the values
    keys[c] = [];
  // For every row in the body assign the values to their keys 
    body.map(r => keys[c].push(r[i]));
    i++;
  })
  Logger.log(keys);
}

1
Aerials 4 jun. 2020 a las 14:12

Rápidamente se me ocurrió esto. No es una codificación súper avanzada, pero espero que te dé algunas ideas.

//a sample input
const spreadsheet = [
  ["Name", "Age", "Gender", "Eyes"],
  ["Jerry", "23", "M", "Blue"],
  ["George", "34", "M", "Green"],
  ["Elaine", "27", "F", "Brown"],
  ["Kramer", "27", "M", "Hazel"]
]

let output = {};    //your main output
let header = true;  //this is a flag
let columns;        //these are your column headers
let i;
for (i = 0; i < spreadsheet.length; i++) {
  let row = spreadsheet[i];
  let k; //this is column count

  //on the first iteration create the keys of the object using header values
  if (header) {
    let keys = row;
    for (k = 0; k < keys.length; k++) {
      output[keys[k]] = [];
    }
    header = false;
    columns = Object.keys(output);
    //console.log(Object.keys(output));
  } else {
    //here we add values to each array of the corresponding object key
  	let v; 
  	for (v = 0; v < columns.length; v++){
    	output[columns[v]].push(row[v]);
      //console.log(columns[v]);
    } 	
  }
}
console.log(output);
1
EspressoBeans 4 jun. 2020 a las 04:53

Recomendaría usar algunos métodos de objeto para manipular los datos. Aquí está toda la ayuda que necesita: https://developer.mozilla.org/en- US / docs / Web / JavaScript / Reference / Global_Objects / Object

https://www.digitalocean.com/community/tutorials/how-to-use-object-methods-in-javascript

Hazte amigo de todos los métodos disponibles y recuérdalos para futuras soluciones óptimas.

0
DiSaSteR 4 jun. 2020 a las 05:00