我有一个具有自定义函数和任务窗格的Excel加载项。我的客户使用我的自定义函数创建了一个包含多个工作表的工作簿,在当前工作簿中大约有3500多个函数调用。当用户打开此工作簿时,我需要重新计算工作表,以便只重新计算我的函数。为了完成此任务,我执行了以下步骤。
1.在工作簿中的工作表上循环。
1.使用worksheet.findAllOrNullObject()函数在每个工作表中搜索公式。
1.如果搜索结果不是NullObject,则调用ranges.calculate(),它将触发函数调用。
var sheets = context.workbook.worksheets;
sheets.load("items/name");
await context.sync();
for (var i = 0; i < sheets.items.length; i++) {
var sheet = sheets.items[i];
const foundRanges = sheet.findAllOrNullObject(FORMULA_DATA[formula], {
completeMatch: false,
matchCase: false
});
await context.sync();
if (!foundRanges.isNullObject)
foundRanges.calculate();
await context.sync();
}
}
我面临的问题是,当我调用重新计算函数时,引用这些函数的所有单元格都显示忙碌!,这意味着我的函数尚未解决promise,但实际上没有函数被调用。我在调试期间在每个函数的开头添加了断点,但代码没有在那里停止(我改变了一个单元格,然后断点被命中)。我启用了运行时日志记录,它有每个调用开始的条目,但没有结束调用条目。
此外,其中一个单元格引用被传递给所有函数,如果我更改了它的值,则所有函数调用都将正确进行,它将显示所需的结果,日志文件包含所有调用的开始和结束条目。
1条答案
按热度按时间5gfr0r5j1#
经过彻底调查,我得出结论,该客户端使用的是其他加载项具有相同的函数名称,并保存在工作簿中。当我重新计算工作表范围区域时,它试图调用之前卸载的旧插件中的函数。因此,所有单元格都显示忙碌!,并且由于Excel中没有代码,这些承诺从未得到解决。从工作簿中删除所有任务窗格并重新打开后,此问题不再出现。
保存任务窗格信息
要删除任务窗格信息,请使用文件=〉信息=〉检查问题=〉检查文档=〉检查。
显示结果后,任务窗格加载项=〉全部删除。