Office js 加载和同步的正确顺序是什么,以便有条件地从表中删除行的偏移范围?
试图通过外接程序对表进行维护。如果表的行数超过N行,我想从末尾删除除N以外的所有行 我终于让它在脚本实验室工作了,如下要点所示: 但我觉得我不明白为什么它会起作用Office js 加载和同步的正确顺序是什么,以便有条件地从表中删除行的偏移范围?,office-js,Office Js,试图通过外接程序对表进行维护。如果表的行数超过N行,我想从末尾删除除N以外的所有行 我终于让它在脚本实验室工作了,如下要点所示: 但我觉得我不明白为什么它会起作用 我必须调用sync,但不管我是在删除调用之前还是之后调用它 我认为将delete封装在context.sync()中是有意义的,然后(()=>obj.delete),但这不起作用 我没有看到对context.sync()进行简单调用的示例,它们通常调用wait context.sync(),但当我尝试这样做时,IntelliSense
context.sync()中是有意义的,然后(()=>obj.delete)代码>,但这不起作用
context.sync()
进行简单调用的示例,它们通常调用wait context.sync()
,但当我尝试这样做时,IntelliSense说它不在异步函数中。如果我将async关键字添加到嵌套闭包中,那么脚本将抛出一个运行时错误,表示该错误不起作用,我需要手动管理绑定是否有人可以查看此代码并帮助澄清这些问题?如果您还没有这样做,我建议您查看,其中包含有关
Excel.run(…)
、context.sync()
和load()
的信息
其他评论/信息:
- 如本文所述,必须调用
,才能读取对象的属性。如果您只是简单地设置属性值或从属性访问其他方法,则不需要调用load()
。如果确实需要调用load()
(因为您打算读取对象的属性),则随后需要调用load()
,以便在读取对象属性之前执行sync()
指令load()
- 如本文所述,在调用
执行这些指令之前,可以在context.sync()
上对多条指令进行排队。在代码段的context
函数中,不需要在前面添加注释的deleteRows()
,因为您只需将context.sync()
指令首先添加到队列中,然后在lastThreeRows.delete()
Excel的末尾立即执行所有指令。运行
。(最佳做法是在
结束时显式调用Excel.run
,但从技术上讲,您不必这样做,因为任何排队的指令都会在context.sync()
结束时自动执行。)Excel.run
- 如果使用的是TypeScript,则应始终使用
上下文.sync()(例如,wait
),并且包含wait context.sync();
的函数的函数定义必须以关键字wait context.sync()
(例如,async
)开头。在函数体中,如果函数定义为async function foo(){…}
,则只能使用关键字async
wait
deleteRows()
函数中的代码,以反映上述概念
async function deleteRows() {
try {
await Excel.run(async (context) => {
const expensesTable = context.workbook.tables.getItem("ExpensesTable")
const bodyRows = expensesTable.getDataBodyRange().load("rowCount");
await context.sync();
if (bodyRows.rowCount == 7) {
const lastThreeRows = bodyRows.getOffsetRange(4, 0).getResizedRange(-4, 0);
lastThreeRows.delete(null);
await context.sync();
}
});
}
catch (error) {
OfficeHelpers.UI.notify(error);
OfficeHelpers.Utilities.log(error);
}
}
啊。。我肯定错过了什么。尝试在我的真实工作表上使用完全相同的步骤会导致错误:
未处理的承诺拒绝:属性“rowCount”不可用。在读取属性值之前,对包含的对象调用load方法,并对关联的请求上下文调用“context.sync()”;区域:代码>好吧,我想我在我的真实脚本中找到了失败的原因。删除之后,我试图在同一wait Excel.run()块中操作另一个表。如果我将第二个代码块移动到它自己的运行块,那么它就可以工作了。在同一个运行块中,哪种类型的代码存在一些限制?