Excel Office Script:迭代一个2D数组,并使用setValues写入数据



我目前使用Excel Office Script从Jotform API获取响应。

在我的Json响应中,在我的Array的第一层,我得到了一些像"提交id"这样的信息。和submit "的时间戳,然后我有一个关键"答案"包含该提交的所有答案(可能有150个答案)。这是一个二维数组

我有麻烦,能够使用setValues后,所有的迭代和写入Excel中的所有答案在一个镜头。

这是我的迭代,其中行将是"提交ID +时间戳",然后在它旁边的子行将包含该提交的所有答案,每个答案是一个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立即将其写出来。它变得棘手的是,setvalue预计某种结构的二维数组。所以你不能只是提供任何二维数组并期望它能与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)]
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"]]
}

如果数组没有必要的结构,您可以尝试做的一件事是将数组值写入一维数组。从那里,您需要创建一个2d数组,其结构与SetValues所期望的相同。