[英]Excel Office Script : iterate through a 2D array and use setValues to write the data
我目前使用 Excel Office 腳本從 Jotform API 獲取響應。
在我的 Json 響應中,在我的數組的第一級,我得到了一些信息,如“提交 ID”和“提交的時間戳”,然后我有一個關鍵的“答案”,其中包含該提交的所有答案(可能是 150 個答案) . 所以它是一個二維數組。
我無法在所有迭代后使用 setValues 並一次性將所有答案寫在 Excel 中。
這是我的迭代,其中行將是“提交 ID + 時間戳”,然后在它旁邊,subRows 將包含該提交的所有答案,每個答案都是一個 Excel 行
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);
我的問題是所有子行(所有答案)都寫在一行中,沒有一個答案/一行。
我可以在迭代中使用 setValues,但我總是盡量不要太用,因為它會減慢工作速度。
最好能夠制作一個大數組並在一個 setValues 中完成所有操作。
任何的想法 ?
非常感謝,
塞德里克
您絕對可以創建一個數組並使用 SetValues 立即將其寫出。 棘手的地方是 SetValues 期望特定結構中的二維數組。 所以你不能只提供任何二維數組並期望它與 SetValues 一起使用。 如果您在范圍上使用 GetValues 並將其記錄到控制台,它將讓您知道它所期望的結構。請參閱以下幾個示例:
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)]
let rang2: ExcelScript.Range = sheet.getRange("A1:B5");
console.log(rang2.getValues()); //(5) [Array(2), Array(2), Array(2), Array(2), Array(2)]
let rang3: ExcelScript.Range = sheet.getRange("D1:H1");
console.log(rang3.getValues()); //(1) [Array(5)]
let rang4: ExcelScript.Range = sheet.getRange("D1:H2");
console.log(rang4.getValues()); //(2) [Array(5), Array(5)]
}
如果數組沒有采用必要的結構,您可以嘗試做的一件事是將數組值寫入一維數組。 從那里,您需要在與 SetValues 預期的范圍相同的結構中創建一個二維數組。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.