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
相关产品推荐
相关产品推荐

