Excel Office Script 处理Jotform返回二维数组批量写入Excel问题求助
问题根因
- 现有逻辑将所有提交的全部答案统一存入全局的
subRows数组,没有和单个提交行做绑定,转置后所有答案会合并为单行多列的结构,自然全部写入第一行 - 拆分
rows和subRows两个数组分别写入的逻辑没必要,反而增加了行列匹配的复杂度
最优解决方案
直接构造符合Excel写入规则的完整二维数组,一次调用setValues完成写入,不需要额外的转置操作,性能最高。你可以根据实际展示需求选择以下两种场景的代码:
场景1:每个提交占一行,后接所有答案(符合你原有rows写入正常的预期)
每行结构:提交ID | 提交时间 | 答案1 | 答案2 | ... | 答案N
// 直接构造最终要写入的完整二维数组 let finalRows: (string | boolean | number)[][] = []; for (const [key, value] of Object.entries(result)) { // 初始化当前行:前两列为提交ID、提交时间 let currentRow = [value["id"], value["created_at"]]; // 遍历当前提交的所有答案,依次追加到当前行末尾 for (const [subKey, subValue] of Object.entries(value["answers"])) { if (subValue.hasOwnProperty("answer")) { currentRow.push(checkAnswer(subValue["answer"])); } } finalRows.push(currentRow); } // 优化答案处理函数,兼容字符串/数组两种入参情况 function checkAnswer(answer: string | string[]) { if (Array.isArray(answer)) { return answer.length > 1 ? answer.join("||") : answer[0]; } return answer; } // 一次写入所有数据,从A5开始 const targetRange = workSheet.getRange('A5').getResizedRange(finalRows.length - 1, finalRows[0].length - 1); targetRange.setValues(finalRows);
场景2:每条答案单独占一行(符合你描述的“每条答案对应Excel的一行”预期)
每行结构:提交ID | 提交时间 | 单条答案内容
let finalRows: (string | boolean | number)[][] = []; for (const [key, value] of Object.entries(result)) { const submitId = value["id"]; const submitTime = value["created_at"]; // 每个答案单独构造一行 for (const [subKey, subValue] of Object.entries(value["answers"])) { if (subValue.hasOwnProperty("answer")) { const answer = checkAnswer(subValue["answer"]); finalRows.push([submitId, submitTime, answer]); } } } function checkAnswer(answer: string | string[]) { if (Array.isArray(answer)) { return answer.length > 1 ? answer.join("||") : answer[0]; } return answer; } // 一次写入所有数据 const targetRange = workSheet.getRange('A5').getResizedRange(finalRows.length - 1, finalRows[0].length - 1); targetRange.setValues(finalRows);
内容的提问来源于stack exchange,提问作者user13746257
相关产品推荐
相关产品推荐

