Estoy tratando de dividir un conjunto de datos con una ID y una cadena JSON en una tabla estructurada.
La parte difícil es que necesito que sea dinámico, la cadena JSON varía con frecuencia y quiero que los encabezados estén determinados por los valores únicos en la columna de entrada en ese momento. Necesito la secuencia de comandos para poder crear encabezados si la cadena cambia sin necesidad de recodificar la secuencia de comandos.
Tenemos alrededor de 150 cadenas JSON diferentes en las que esperamos usar este script, sin recodificarlo para cada una. Cada cadena tiene muchos puntos de datos.
Tengo un script funcionando, pero los divide uno por uno, necesito construir algo que funcione a granel de una sola vez, recorriendo todas las salidas en B y creando una columna para cada campo único en todas las cadenas, luego llenándolas.
El script funciona si pego la información adicional directamente; sin embargo, tengo problemas para leer la hoja
var inputsheet = SpreadsheetApp.getActive().getSheetByName("Input"); var outputsheet = SpreadsheetApp.getActive().getSheetByName("Current Output"); var additionalinfo = inputsheet.getRange(1,1).getValue() Logger.log(additionalinfo) var rows = [], data; for (i = 0; i < additionalinfo.length; i++) { for (j in additionalinfo[i]) { dataq = additionalinfo[i][j]; Logger.log(dataq); rows.push([j, dataq]); } dataRange = outputsheet.getRange(1, 1, rows.length, 2); dataRange.setValues(rows); } }Aquí hay un enlace a los datos de muestra. Tenga en cuenta que en las muestras 1 y 2 hay diferentes encabezados, necesitamos el script para identificar esto y crear encabezados para ambos.
https://docs.google.com/spreadsheets/d/1BMiVuAgDbibLw6yUG3IZ9iw4MZTaVVegkw_k3ItQ4mU/edit#gid=0
Pruebe este script que produce encabezados dinámicos basados en el json que se ha leído. Recopila todos los datos json, obtiene sus claves y elimina los duplicados.
function JSON_SPLITTER() { var spreadsheet = SpreadsheetApp.getActive(); var inputsheet = spreadsheet .getSheetByName("Input"); var outputsheet = spreadsheet .getSheetByName("Current Output"); var additionalinfo = inputsheet.getDataRange().getValues(); var keys = []; // prepare the additionalInfo data to be parsed for later var data = additionalinfo.slice(1).map(row => { // collect all keys in an array if (JSON.parse(row[1]).additionalInfo) { keys.push(Object.keys(JSON.parse(row[1]).additionalInfo)); return JSON.parse(row[1]).additionalInfo; } else { keys.push(Object.keys(JSON.parse(row[1]))); return JSON.parse(row[1]); } }); // unique values of keys, modified to form header var headers = [...new Set(keys.flat())] // Add A1 as the header for the ids headers.unshift(additionalinfo[0][0]); // set A1 and keys as headers var output = [headers] // build output array additionalinfo.slice(1).forEach((row, index) => { var outputRow = []; headers.forEach(column => { if(column == 'Contract Oid') outputRow.push(row[0]); else outputRow.push(data[index][column]); }); output.push(outputRow) }); outputsheet.getRange(1, 1, output.length, output[0].length).setValues(output); }additionalInfo .