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();)。
context.sync()是一个异步操作,这意味着脚本将在sync完成之前继续运行。由于脚本的下一行需要工作簿中的信息,因此sync需要在继续之前完成该信息。更改行以await context.sync();确保工作簿和脚本之间的同步已完成并成功,然后再继续。
有关此内容的更多信息,请参阅《Excel 网页版中 Office 脚本的脚本编写基础知识》一文。
\n值得注意的是,即使在包含其中的代码中也可能发生这种情况await context.sync()。例如,如果您将此代码放入 Excel 加载项并触发它,则会导致问题中描述的错误:
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});\nRun Code Online (Sandbox Code Playgroud)\n该代码中的错误是我们错过了awaitbefore capCells(range);,因此我们只是启动该异步函数而不等待它完成;它运行并启动 async但然后立即返回其承诺,我们的代码继续并启动另一个重叠sync(在Excel.run回调中)。Excel 不喜欢你这样做;如果您根本没有这样做,它会给您带来相同的错误sync。
因此,如果您收到此错误,但您发现代码中确实有一个sync与它相关的调用,请查看您最近更改的其他代码\xc2\xa0\xe2\x80\x94,您可能会发现缺少await.
| 归档时间: |
|
| 查看次数: |
881 次 |
| 最近记录: |