You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Office Script如何读取嵌套对象 解决setValues维度不符及接口问题

问题核心原因
  • 你构造的rows二维数组不符合Excel setValues方法的要求: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 05:24:04