Office js 加载和同步的正确顺序是什么,以便有条件地从表中删除行的偏移范围?

Office js 加载和同步的正确顺序是什么,以便有条件地从表中删除行的偏移范围?,office-js,Office Js,试图通过外接程序对表进行维护。如果表的行数超过N行,我想从末尾删除除N以外的所有行 我终于让它在脚本实验室工作了,如下要点所示: 但我觉得我不明白为什么它会起作用 我必须调用sync,但不管我是在删除调用之前还是之后调用它 我认为将delete封装在context.sync()中是有意义的,然后(()=>obj.delete),但这不起作用 我没有看到对context.sync()进行简单调用的示例,它们通常调用wait context.sync(),但当我尝试这样做时,IntelliSense

试图通过外接程序对表进行维护。如果表的行数超过N行,我想从末尾删除除N以外的所有行

我终于让它在脚本实验室工作了,如下要点所示:

但我觉得我不明白为什么它会起作用

  • 我必须调用sync,但不管我是在删除调用之前还是之后调用它
  • 我认为将delete封装在
    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,则应始终使用
      wait
      上下文.sync()
      (例如,
      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()块中操作另一个表。如果我将第二个代码块移动到它自己的运行块,那么它就可以工作了。在同一个运行块中,哪种类型的代码存在一些限制?