OfficeJS добавляет и обновляет обработчик событий привязки

Я пытаюсь создать привязку, чтобы в конечном итоге проверить, изменилась ли эта ячейка, сделать какой-то вызов AJAX. Документация дает несколько примеров, которые я пытаюсь превратить в самый простой:

  Office.initialize = function(){
  $(document).ready(function() {
    Excel.run(function(context){
        // This should create a new binding and store it in the bindingsObject
        // add(range: Range or string, bindingType: string, id: string)
        context.workbook.bindings.add("Sheet1!A1:A2", "Range", "A_binding");

        // create a new event handler for this bindings
        Office.select("bindings#A_binding").addHandlerAsync(Office.EventType.BindingDataChanged, onBindingDataChanged);


        $("#output").append("<br /><br /> Finished Pre-Sync");
        return context.sync().then(function(){
            $("#output").append("<br /><br />Post Sync")
        });
    }).catch(function(error){
        $("#debugger").append("error: " + JSON.stringify(error.debugInfo));
    })
  });
  }

  function onBindingDataChanged(eventArgs){
      Excel.run(function(context) {
          $("output").append("updated");
      })
  }

Однако когда я меняю данные в ячейках, ничего не происходит, ни ошибок, ни «обновлений». Это неправильный способ создания привязок?


person Tony    schedule 04.01.2018    source источник
comment
Инструмент Script Lab, который вы можете получить бесплатно на store.office.com, имеет фрагмент кода Excel под названием Обработка события изменения данных. В качестве первого шага проверьте, работает ли этот фрагмент на вашем компьютере.   -  person Rick Kirkham    schedule 04.01.2018


Ответы (1)


Следующий код создает привязку для диапазона Sheet1!A1:A2, а затем добавляет обработчик событий onDataChanged для этой привязки.

function registerDataChangedHandler_JS() {
    Excel.run(function (context) {
        var myBinding = context.workbook.bindings.add("Sheet1!A1:A2", "range", "A_binding");

        myBinding.onDataChanged.add(onBindingDataChanged_JS);

        return context.sync()
            .then(function () {
                console.log("Created binding and added onDataChanged event for the binding.");
            });
    }).catch(errorHandlerFunction);
}

function onBindingDataChanged_JS(eventArgs) {
    Excel.run(function (context) {
        console.log("Cells were updated!");

        return context.sync();
    });
}

Примечание. Вы можете быстро и легко попробовать этот фрагмент самостоятельно, используя Script Lab (https://aka.ms/getscriptlab). Просто установите надстройку Script Lab (бесплатно), затем выберите «Импорт» в меню навигации и используйте следующий URL-адрес Gist: https://gist.github.com/kbrandl/a39042da654da0f2b1e1358631d9ca6a. Этот Gist содержит образцы кода как на JavaScript (имена методов заканчиваются на _JS), так и на TypeScript (имена методов заканчиваются на _TS).

Чтобы создать привязку и добавить обработчик событий при загрузке надстройки:

Office.initialize = function (reason) {
    $(document).ready(function () {
        registerDataChangedHandler_JS();
    });
};

(Вы можете узнать больше о событии инициализации здесь: https://docs.microsoft.com/en-us/office/dev/add-ins/develop/understanding-the-javascript-api-for-office#initializing-your-add-in.)

Наконец, ссылка на документацию в вашем сообщении связана с исходным файлом документации на GitHub. Для удобства пользователей я бы посоветовал вам использовать сам сайт документации: https://docs.microsoft.com/en-us/office/dev/add-ins. Чтобы перейти к справочной документации по API с этого сайта документации, используйте ссылки в разделе Справочник:

введите описание изображения здесь

(Вот прямая ссылка на справочную статью Binding API: https://dev.office.com/reference/add-ins/shared/binding.)

person Kim Brandl    schedule 04.01.2018
comment
Спасибо, я могу просто добавить: Office.initialize = function (){ $(document).ready(function(){ registerDataChangedHandler_JS(); }); }; Я не уверен, когда это зарегистрируется после загрузки? - person Tony; 04.01.2018
comment
Да, это должно сработать. Я обновил свой ответ, включив в него эту информацию, а также ссылку на документацию о событии initialize. - person Kim Brandl; 04.01.2018