Office Script如何读取嵌套对象 解决setValues维度不符及接口问题
问题核心原因
- 你构造的
rows二维数组不符合ExcelsetValues方法的要求:setValues要求传入的数组必须是严格矩形结构,所有行的列数完全一致。你当前代码中第一行push了包含id/created_at/answers三个元素的数组,后续push的都是只有单个元素的数组,行列维度不匹配直接触发报错。 - 接口定义错误:
JSONData中的answers是键值对结构(键是问题编号,值是问题详情对象),不是单个SUBDATA类型,需要调整为字典类型定义。 - 直接把
answers对象写入单元格:Excel单元格无法直接存储JS对象,会导致写入内容异常。
修复方案
参照你给出的jQuery示例的展示逻辑,我们统一将Excel每行设为4列,结构为[提交ID, 提交时间, 问题名称, 答案],属于同一提交的答案行前两列留空,保证所有行列数一致,修复后代码如下:
async function main(workbook: ExcelScript.Workbook): Promise<void> { const workSheet = workbook.getActiveWorksheet(); // 替换为你的实际API请求地址 const myApiQuery = "你的JotForm API请求地址"; let fetchResult = await fetch(myApiQuery) // 修正接口定义,匹配实际返回的JSON结构 interface SUBDATA { name?: string; answer?: string; } interface JSONData { id?: number | string; created_at?: string; answers?: Record<string, SUBDATA>; } interface ApiResponse { content: JSONData[]; } let json: ApiResponse = await fetchResult.json(); const result: JSONData[] = json.content; const rows: (string | number | boolean)[][] = []; // 遍历所有提交记录 for (const submission of result) { // 插入提交头行:前两列填ID和提交时间,后两列留空 rows.push([submission.id ?? "", submission.created_at ?? "", "", ""]); // 遍历当前提交的所有问题答案 for (const [_, answerItem] of Object.entries(submission.answers ?? {})) { const answer = answerItem.answer ?? ""; const questionName = answerItem.name ?? ""; // 插入答案行:前两列留空,后两列填问题名和对应答案 rows.push(["", "", questionName, answer]); } } // 计算写入范围:行数为rows数组长度,列数固定为4 const targetRange = workSheet.getRange('A2').getResizedRange(rows.length - 1, 3); targetRange.setValues(rows); }
如果需要调整为每个提交占一行、所有答案依次放在后面列的布局,只需调整行构造逻辑,保证所有行的列数一致即可正常调用setValues。
内容的提问来源于stack exchange,提问作者user13746257
相关产品推荐
相关产品推荐

