将事件处理程序添加到选定范围

时间:2016-05-18 02:56:55

标签: javascript-events office-js

我想为用户在工作簿中选择的范围或单元格添加事件处理程序:如果用户选择另一个单元格或范围,则需要系统地执行某些操作。

我正在查看this reference,但我不知道将代码集成到整个加载项的位置。

例如,在我的Home.html中,我有

    <div id="content-main">
        <div class = "padding" id="message"></div>
        <div class="padding">
            <button class="ms-Button" id="button">Click me!</button>
        </div>
    </div>

以下是Home.js

(function() {
    "use strict";

    Office.initialize = function(reason) {
        $(document).ready(function() {
            app.initialize();
            $('#button').click(activateEventHandler);
        });
    };

    function onBindingSelectionChanged(eventArgs) {
        write(eventArgs.binding.id + " has been selected.");
    }
    function write(message) {
        document.getElementById('message').innerText += message;
    }

    function activateEventHandler() {
        Excel.run(function(ctx) {
            var selectedRange = ctx.workbook.getSelectedRange();
            selectedRange.addHandlerAsync(Office.EventType.BindingSelectionChanged, onBindingSelectionChanged); 
            return ctx.sync()
        }).then(function() {
            console.log("done");
        }).catch(function(error) {
            ...
            }
        });
    }        
})();

我希望按钮可以激活监听器。然后,每次用户选择另一个单元格或范围时,系统地将消息附加到任务窗格。但是,上述代码会在Error: TypeError: selectedRange.addHandlerAsync is not a function行引发错误selectedRange.addHandlerAsync(...

实际上,我甚至不确定这段代码的结构是否应该......有人知道如何修改代码来实现我的任务吗?

1 个答案:

答案 0 :(得分:1)

错误的原因是您尝试在Range对象上调用函数addHandlerAsync。但处理程序只能添加到Binding对象或Document对象。您选择哪一个取决于您想要完成的目标。在您的情况下,我认为您并未尝试在特定范围内收听选择,而是实际上要在文档中收听任何地方的选择。所以你实际上会使用DocumentSelectionChanged event

(function() {
    "use strict";

    Office.initialize = function(reason) {
        $(document).ready(function() {
            app.initialize();
            $('#button').click(activateEventHandler);
        });
    };

    function onMySelectionChanged(eventArgs) {
        write(eventArgs.binding.id + " has been selected.");
        doStuffWithNewSelection();

    }
    function write(message) {
        document.getElementById('message').innerText += message;
    }

    function activateEventHandler(){
        Office.context.document.addHandlerAsync(Office.EventType.DocumentSelectionChanged, onMySelectionChanged);
    }

    function doStuffWithNewSelection() {
        Excel.run(function(ctx) {
            var selectedRange = ctx.workbook.getSelectedRange();
            // do other stuff with the selection as you wish, like read and display
        }).then(function() {
            console.log("done");
        }).catch(function(error) {
            ...
            }
        });
    }        
})();