【问题标题】:Excel Add-In: Table OnChange event sometimes does not trigger after cell value changeExcel 加载项:表格 OnChange 事件有时不会在单元格值更改后触发
【发布时间】:2021-04-23 10:13:13
【问题描述】:

我正在开发一个 Excel 插件,它允许使用表 onChanged 将更改的表单元格值与外部环境同步。并注意到非常烦人的结果,如果用户高速更改值,一些值会被跳过。我写了一个简单的 sn-p 用于在表格单元格更改后更改颜色,如果您键入的速度如此之快,有些单元格不会改变颜色。可以修复吗?

这是一个例子:

对于单元格 #15 和 #18 根本不会触发事件。

和代码sn-p:

public cellChange = async  (event: Excel.TableChangedEventArgs): Promise<any> =>
{
    try
    {
        await Excel.run({delayForCellEdit: true}, async context =>
        {
            try
            {
                context.runtime.enableEvents = false;

                if (event.changeType === Excel.DataChangeType.rangeEdited)
                {
                    let worksheet = context.workbook.worksheets.getActiveWorksheet();
                    let address = event.address;
                    let str = "Cell address: " + address + " START";
                    var start = new Date().getTime();
                    
                    let rng = worksheet.getRange(address);
                    rng.format.fill.color = "#D0DC94";
                    await context.sync();

                    var end = new Date().getTime();
                    var time = end - start;
                    str = str + `-END:${time}ms`;

                    console.log(str);
                }
            }
            catch (error)
            {
                let e: Error = error;
                let mssg = e.message;
            }
            finally
            {
                context.runtime.enableEvents = true;
            }
            return context.sync();
        });
    }
    catch (error)
    {
        let e: Error = error;
        let mssg = e.message;

        if (error instanceof OfficeExtension.Error)
        {
            console.log("Debug info: " + JSON.stringify(error.debugInfo));
        }
    }
}

【问题讨论】:

  • 我注意到您调用了context.runtime.enableEvents = false,因为我们在异步模式下运行,如果用户在您调用context.runtime.enableEvents = true之前进行了一些更改,该事件可能会被禁用

标签: javascript excel typescript office-js


【解决方案1】:

这是因为 context.runtime.enableEvents = falsecontext.runtime.enableEvents = true 之间发生了变化

  1. context.runtime.enableEvents = false 在函数开头调用
  2. 然后调用await context.sync(),这可能会提供用户在此期间更改的机会
  3. context.runtime.enableEvents = true 被调用。继续收听活动。

从您的代码中,我认为您希望避免从您自己的代码中触发 onChange 事件。所以建议使用triggerSource 来识别事件是否由您自己的代码触发。

https://docs.microsoft.com/en-us/javascript/api/excel/excel.worksheetchangedeventargs?view=excel-js-preview#triggerSource

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-19
    • 1970-01-01
    • 2013-08-22
    • 1970-01-01
    • 2017-07-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多