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

Office Script从按钮运行与编辑器直接运行的行为差异问题

解决Office Script按钮运行时数据填充不全/为空的问题

问题根源

你的脚本核心问题是异步操作未被正确等待:main函数是同步执行的,调用GetPeopleList().then(...)后,脚本会直接执行到结束,此时fetch请求和后续的表格行添加操作可能还未完成。编辑器运行时存在特殊等待逻辑,能确保异步操作执行完毕;但按钮触发运行时,脚本会在同步代码执行完后立即终止,导致部分/全部数据没来得及写入表格。

另外代码里还有一个拼写错误:请求头的Conetent-Type应该改为Content-Type,这可能导致服务器返回异常,进一步加剧数据缺失问题。

修正后的代码

async function main(workbook: ExcelScript.Workbook) {
  // 清空PeopleList表格
  const peopleTable = workbook.getTable('PeopleList');
  const peopleListRowCount = peopleTable.getRowCount();
  if (peopleListRowCount > 0) {
    peopleTable.deleteRowsAt(0, peopleListRowCount);
  }

  // 等待数据获取完成后再填充表格
  const data = await GetPeopleList();
  data.forEach(item => {
    const tmp_row: string[] = [item['Person'], item['PersonID']];
    peopleTable.addRow(-1, tmp_row);
  });
}

async function GetPeopleList() {
  const link = 'url';
  const key = 'key';

  // 修正请求头拼写错误
  const response = await fetch(link, { 
    method: 'get', 
    headers: new Headers({ 
      'Content-Type': 'application/json', 
      'Authorization': key 
    }) 
  });
  
  // 可根据实际返回数据类型调整类型声明,这里假设是包含Person和PersonID的对象数组
  const data = await response.json();
  return data;
}

关键修改说明

  • 将main函数改为async函数,使用await等待GetPeopleList()的异步结果,确保数据获取完成后再执行表格填充逻辑,避免脚本提前终止。
  • 提取表格对象到变量peopleTable,避免重复调用workbook.getTable('PeopleList'),提升执行效率。
  • 修正Content-Type的拼写错误,确保请求头格式正确,避免服务器拒绝请求或返回错误数据。

内容的提问来源于stack exchange,提问作者user27945138

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 02:37:06