簡體   English   中英

Excel Office 腳本:遍歷二維數組並使用 setValues 寫入數據

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM