2016-05-18 53 views
0

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

我正在查看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) { 
      ... 
      } 
     }); 
    }   
})(); 

我期望的按钮激活监听。然后,每次用户选择另一个单元格或范围时,系统地将消息附加到任务窗格。但是,上述代码在线路selectedRange.addHandlerAsync(...处产生了错误Error: TypeError: selectedRange.addHandlerAsync is not a function

其实,我甚至不知道这个代码应该像这样构造...有谁知道如何修改代码来实现我的任务?

回答

1

错误的原因是您正尝试在Range对象上调用函数addHandlerAsync。但处理程序只能添加到绑定对象或文档对象。你选择哪一个取决于你想要完成的事情。在你的情况下,我认为你不是想试听特定范围内的选择,但实际上要听文件中任何地方的选择。所以你会使用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) { 
      ... 
      } 
     }); 
    }   
})(); 
相关问题