2016-05-18 5 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) { 
      ... 
      } 
     }); 
    }   
})(); 

Я ожидаю, что кнопка активирует слушателя. Затем каждый раз, когда пользователь выбирает другую ячейку или диапазон, сообщение систематически добавляется к панели задач. Однако приведенный выше код вызывает ошибку Error: TypeError: selectedRange.addHandlerAsync is not a function на линии selectedRange.addHandlerAsync(....

На самом деле, я даже не уверен, что этот код должен быть структурирован так ... Кто-нибудь знает, как изменить код для выполнения моей задачи?

ответ

1

Причина ошибки в том, что вы пытаетесь вызвать функцию addHandlerAsync в объекте Range. Но обработчики могут быть добавлены только к объектам 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) { 
      ... 
      } 
     }); 
    }   
})(); 
Смежные вопросы