Office 脚本中 while 循环的奇怪行为

shy*_*yuu 0 excel typescript office-scripts

我使用以下代码来更新单元格 A1 但它不起作用:

function main(workbook: ExcelScript.Workbook) { 

    let worksheet = workbook.getWorksheet("Sheet1");
    var i: number = 0; 

    while (true) {
        worksheet.getRange("A1").setValue(i);
        i = i + 1;
    }
}
Run Code Online (Sandbox Code Playgroud)

代码运行时什么也没发生。

但是,如果我添加不相关的行

console.log("abc")
Run Code Online (Sandbox Code Playgroud)

在循环的末尾,如下所示:

function main(workbook: ExcelScript.Workbook) { 

    let worksheet = workbook.getWorksheet("Sheet1");
    var i: number = 0; 

    while (true) {
        worksheet.getRange("A1").setValue(i);
        i = i + 1;
        console.log("abc");
    }
}
Run Code Online (Sandbox Code Playgroud)

一切都会顺利进行。

那么,这里到底发生了什么?

Jef*_*ica 5

为了提高性能,Office 脚本仅在您与脚本“同步”后才发布脚本的结果。console.log()是强制这样做的方法之一,但还有其他方法。


Excel 中的 Office 脚本 > 疑难解答 > 提高脚本性能(重点是我的):

删除不必要的console.log语句

控制台日志记录是调试脚本的重要工具。但是,它确实强制脚本与工作簿同步,以确保记录的信息是最新的。在共享脚本之前,请考虑删除不必要的日志记录语句(例如用于测试的日志记录语句)。这通常不会导致明显的性能问题,除非该console.log() 语句位于循环中。

同样,来自文章避免在循环中使用 context.sync 方法

通常,最好context.sync在应用程序方法的结束“}”字符run(例如Excel.runWord.run等)之前放置一个结尾。这是因为当且仅当存在尚未同步的排队命令时,该run方法才会进行隐藏调用,作为它执行的最后一件事。context.sync该调用是隐藏的这一事实可能会令人困惑,因此我们通常建议您添加显式context.sync. 然而,考虑到本文是关于最小化 的调用context.sync,添加完全不必要的 Final 实际上会更令人困惑context.sync。因此,在本文中,当运行结束时没有未同步的命令时,我们将其省略。

仅当工作簿同步时,您的 Office 文档才会明显更新。这会在context.sync运行时发生,这会在脚本末尾隐式发生;当您发出诸如 之类的同步命令console.log时也会发生这种情况。如果您要使循环有限而不是无限,那么当达到循环限制时,您的脚本将自动同步,并且您的工作簿将适当地更新一次。

console.log如果您想看到部分进度,您还可以使用或在脚本中间强制更新context.sync,但您应该意识到这些调用的成本很高,您可能需要小心地尽量减少使用它们,如链接的文章。