无法跨 Office 加载项的功能区 ExecuteFunction 命令存储 JS 值

Can't store JS values across Ribbon ExecuteFunction Commands for Office add-ins

我正在通过清单和函数文件将 Javascript 函数连接到 Excel 功能区图标。

这是我的函数文件:

(function () {
    Office.initialize = function (reason) {
       //If you need to initialize something you can do so here.
    };

})();

var i = 42;

//Notice function needs to be in global namespace
function undo() {
    console.log(i);
    i++;
}

现在,当我单击功能区图标时,它会将 put 42 打印到 Javascript 控制台。但是,当我再次尝试 运行 时,什么也没有发生。这是一个错误吗?

Excel 每次单击命令时都会创建一个新的 Web 进程。因此,i 将在每次点击时初始化为 42。并且每次控制台都会继续记录42。

您在后续点击中看不到任何内容的原因可能是您已将调试器设置为监视特定进程。如果将 console.log(i); 更改为类似 Office.context.document.setSelectedDataAsync(i); 的内容,则无需调试器即可快速看到此结果。

为了实现您想要的持久变量,您应该使用 Settings 对象将它们存储在文档中,如下所示:

(function () {
    Office.initialize = function (reason) {
        var i = 42;
        if(Office.context.document.settings.get("storedI"){
            i = Office.context.document.settings.get("storedI");
        }
        else{
            Office.context.document.settings.set("storedI", i);
            Office.context.document.settings.saveAsync(function (asyncResult) {});
        }
    };
})();    

function undo() {
    console.log(i);
    i++;
    Office.context.document.settings.set("storedI", i);
    Office.context.document.settings.saveAsync(function (asyncResult) {});
}    

-Michael Saunders,办公室 PM