0

我目前使用 Excel Office 脚本从 Jotform API 获得响应。

在我的 Json 响应中,在我的数组的第一级,我得到了一些信息,例如“提交 ID”和“提交的时间戳”,然后我有一个包含该提交的所有答案的关键“答案”(可能是 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 中完成所有操作。

任何想法 ?

非常感谢,

塞德里克

4

1 回答 1

3

您绝对可以使用 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 预期的范围相同的结构中创建一个二维数组。

于 2021-10-14T15:17:00.040 回答