从按钮运行 Excel Office 脚本和直接从代码编辑器运行之间的不同行为

问题描述 投票:0回答:1

我编写了一些 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说代码运行成功。

我尝试在桌面应用程序和网页版本上执行此操作,但似乎它们之间没有什么不同。

最终,我希望最终用户单击按钮并更新表格,以便我需要按钮正常工作。

excel office-js
1个回答
0
投票

您在通过按钮运行 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;
}
© www.soinside.com 2019 - 2024. All rights reserved.