Actualmente uso Excel Office Script para obtener una respuesta de la API de Jotform.
En mi respuesta Json, en el primer nivel de mi matriz, obtengo información como "ID de envío" y "marca de tiempo del envío", luego tengo una clave "Respuestas" con todas las respuestas de ese envío (podrían ser 150 respuestas) . Así que es una matriz 2D.
Tengo problemas para poder usar setValues después de todas las iteraciones y escribir todas las respuestas en Excel de una sola vez.
Aquí está mi iteración donde las filas serán "ID de envío + Marca de tiempo", luego, al lado, subFilas que tendrán todas las respuestas para ese envío, cada respuesta será una fila de Excel cada una
let rows: (string | boolean | number)[][] = []; let subRows: (string | boolean | number)[][] = []; for (const [key, value] of Object.entries(result)) { rows.push([value["id"], value["created_at"]]); for (const [subKey, subValue] of Object.entries(value["answers"])) { if (subValue.hasOwnProperty("answer")) { subRows.push([checkAnswer(subValue["answer"])]); } } } // This function is important because sometimes I have several answers in one answer, so I join it when necessary. function checkAnswer(answer: string[]) { if (answer.length > 1) { return (typeof answer == "string" ? answer : answer.join("||")); } return answer; } // Here are the methods I use to write the result on my Excel file. The first one is great, it is one Excel row/ one result. const targetRange = workSheet.getRange('A5').getResizedRange(rows.length - 1, rows[0].length - 1); targetRange.setValues(rows); // I TRANSPOSE so that the subROWS get in line, not vertically. subRows = subRows[0].map((_, colIndex) => subRows.map(row => row[colIndex])); const subTargetRange = workSheet.getRangeByIndexes(4, 2, subRows.length, subRows[0].length).setValues(subRows);Mi problema es que todas las subfilas (todas las respuestas) se escriben en una línea, no hay una respuesta/una fila.
Podría usar setValues dentro de la iteración, pero siempre trato de no hacerlo, ya que ralentiza el trabajo.
Lo mejor es poder hacer una gran matriz y hacer todo en un setValues.
Alguna idea ?
Muchísimas gracias,
cedric
Definitivamente puede crear una matriz y escribirla de una vez usando SetValues. Donde se vuelve complicado es que SetValues espera que la matriz 2-d en una estructura determinada. Por lo tanto, no puede simplemente proporcionar una matriz 2d y esperar que funcione con SetValues. Si usa GetValues en el rango y lo registra en la consola, le informará la estructura en la que lo espera. Vea algunos ejemplos a continuación. Los valores en cadena son solo algunos datos aleatorios que puse en una hoja de trabajo:
function main(workbook: ExcelScript.Workbook) { let sheet: ExcelScript.Worksheet = workbook.getWorksheet("Sheet1"); let rang1: ExcelScript.Range = sheet.getRange("A1:A5"); console.log(rang1.getValues()); //(5) [Array(1), Array(1), Array(1), Array(1), Array(1)] console.log(JSON.stringify(rang1.getValues())); //[["A"],[0],[1],[2],[3]] let rang2: ExcelScript.Range = sheet.getRange("A1:B5"); console.log(rang2.getValues()); //(5) [Array(2), Array(2), Array(2), Array(2), Array(2)] console.log(JSON.stringify(rang2.getValues())); //[["A","B"],[0,1],[1,2],[2,3],[3,4]] let rang3: ExcelScript.Range = sheet.getRange("D1:H1"); console.log(rang3.getValues()); //(1) [Array(5)] console.log(JSON.stringify(rang3.getValues())); //[["A","B","C","D","E"]] let rang4: ExcelScript.Range = sheet.getRange("D1:H2"); console.log(rang4.getValues()); //(2) [Array(5), Array(5)] console.log(JSON.stringify(rang4.getValues())); //[["A","B","C","D","E"],["B","C","D","E","F"]] }Si la matriz no tiene la estructura necesaria, una cosa que puede intentar hacer es escribir los valores de la matriz en una matriz 1d. A partir de ahí, necesitaría crear una matriz 2d en la misma estructura que SetValues esperaba para el rango.