我编写了一些 Office 脚本来从服务器获取数据并将该数据填充到 Excel 中的表格中。
function main(workbook: ExcelScript.Workbook) {
// Getting People List
// Clear the table PeopleList
let peopleListRowCount: number = workbook.getTable('PeopleList').getRowCount();
if (peopleListRowCount > 0) {
workbook.getTable('PeopleList').deleteRowsAt(0, peopleListRowCount);
}
GetPeopleList().then(data =>{
data.forEach(item => {
let tmp_row: string[] = [item['Person'], item['PersonID']];
workbook.getTable('PeopleList').addRow(-1, tmp_row);
})
})
}
async function GetPeopleList() {
const link = 'url'
const key = 'key'
const response = await fetch(link, { method: 'get', headers: new Headers({ 'Conetent-Type': 'application/json', 'Authorization': key }) });
const data :string[] = await response.json();
return data
}
运行代码时,会提取数据列表并将其填充到表中。虽然当我在代码编辑器中运行和通过按钮运行时,最终结果是不同的。
当我在代码编辑器中运行代码时,它工作正常。数据已填充到表格中。
但是,当我按“添加到工作簿”创建一个按钮并按该按钮运行代码时。结果不同。有时表中没有所有数据,有时表甚至是空的。虽然Excel说代码运行成功。
我尝试在桌面应用程序和网页版本上执行此操作,但似乎它们之间没有什么不同。
最终,我希望最终用户单击按钮并更新表格,以便我需要按钮正常工作。
您在通过按钮运行 Office 脚本时似乎遇到了异步代码执行问题。虽然脚本在代码编辑器中运行良好,但在使用按钮时会出现问题,可能是由于 Excel 处理按钮触发的异步操作的方式所致。
当前代码中存在一个潜在问题:GetPeopleList 函数返回一个承诺(因为它是异步的),但脚本的主要部分(将数据填充到表中)可能不会等待按钮触发时解决承诺。这可以解释为什么有时表格会变成空或不完整。
您可以尝试重构代码,以确保仅在数据完全获取并准备就绪后才进行表填充。可以在main函数中使用await关键字来确保异步获取数据完成后再进行处理。这是修改后的脚本:
async function main(workbook: ExcelScript.Workbook) {
// Getting People List
// Clear the table PeopleList
let peopleListRowCount: number = workbook.getTable('PeopleList').getRowCount();
if (peopleListRowCount > 0) {
workbook.getTable('PeopleList').deleteRowsAt(0, peopleListRowCount);
}
// Await the GetPeopleList function to ensure data is fetched before processing
let data = await GetPeopleList();
// Iterate through the data and add rows to the table
data.forEach(item => {
let tmp_row: string[] = [item['Person'], item['PersonID']];
workbook.getTable('PeopleList').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
})
});
const data: string[] = await response.json();
return data;
}