Office 脚本错误 - 该属性不可用

web*_*020 4 excel office-scripts

我在 Excel 网页版中使用新的 Office 脚本创建了一个脚本。该脚本只是设置当前工作表中某个范围的填充颜色,获取使用的范围,然后尝试将该范围的地址写入控制台。

async function main(context: Excel.RequestContext) {
  let workbook = context.workbook;
  let worksheets = workbook.worksheets;
  let selectedSheet = worksheets.getActiveWorksheet();
  selectedSheet.getRange("B3:E6").format.fill.color = "E2EFDA";

  // write used range to console
  let usedRange = selectedSheet.getUsedRange();
  usedRange.load("address");
  context.sync();
  console.log("used range = " + usedRange.address);
}
Run Code Online (Sandbox Code Playgroud)

运行此脚本会生成以下错误消息:

The property 'address' is not available. Before reading the property's value, call the load method on the containing object and call "context.sync()" on the associated request context.

似乎我已经按照错误消息指导的建议进行操作 - 即调用方法load来加载address属性,然后context.sync()在加载后调用。我在这里缺少什么?

小智 6

您需要await在之前添加context.sync();(这样就变成了await context.sync();)。

\n

context.sync()是一个异步操作,这意味着脚本将在sync完成之前继续运行。由于脚本的下一行需要工作簿中的信息,因此sync需要在继续之前完成该信息。更改行以await context.sync();确保工作簿和脚本之间的同步已完成并成功,然后再继续。

\n

有关此内容的更多信息,请参阅《Excel 网页版中 Office 脚本的脚本编写基础知识》一文。

\n
\n

值得注意的是,即使在包含其中的代码中也可能发生这种情况await context.sync()。例如,如果您将此代码放入 Excel 加载项并触发它,则会导致问题中描述的错误:

\n
async function capCells(range: Excel.Range) {\n    range.load("values");\n    await range.context.sync();\n    range.values = range.values.map((row) =>\n        row.map((cell) => String(cell).toLocaleUpperCase())\n    );\n    await range.context.sync();\n}\n\n// ...\n\nExcel.run(async (conn) => {\n    const sheet = conn.workbook.worksheets.getActiveWorksheet();\n    const range = sheet.getRangeByIndexes(1, 1, 1, 1);\n    capCells(range);\n//  ^------------------------- The bug is here\n    const item = sheet.names.getItemOrNullObject("name-that-does-not-exist");\n    item.context.sync();\n    if (item.isNullObject) {\n//      ^^^^^^^^^^^^^^^^^----- but shows up here, even though there\'s a `sync` call\n        console.log(`It\'s null`);\n    } else {\n        console.log(`It\'s not null`);\n    }\n});\n
Run Code Online (Sandbox Code Playgroud)\n

该代码中的错误是我们错过了awaitbefore capCells(range);,因此我们只是启动该异步函数而不等待它完成;它运行并启动 async但然后立即返回其承诺,我们的代码继续并启动另一个重叠sync(在Excel.run回调中)。Excel 不喜欢你这样做;如果您根本没有这样做,它会给您带来相同的错误sync

\n

因此,如果您收到此错误,但您发现代码中确实一个sync与它相关的调用,请查看您最近更改的其他代码\xc2\xa0\xe2\x80\x94,您可能会发现缺少await.

\n