Как работать с выбранными абзацами из надстройки JavaScript в слове рабочего стола?

Я пытаюсь установить стили всех выбранных абзацев из надстройки JavaScript. Код отлично работает в Word Online, но я получаю сообщение об ошибке, когда использую его в Word Desktop. Код выглядит следующим образом (да, мой тестовый стиль называется «Банан», и он большой и желтый):

function updateParStyle(event) {
    Word.run(function (context) {
        var range = context.document.getSelection();
        range.load("paragraphs/items");
        return context.sync().then(function () {
            var items = range.paragraphs.items;
            // console.log(items.length + " items");
            for (var i = 0; i < items.length; i++) {
                items[i].style = "Banana";
            }
            return context.sync();
        });
    }).catch(function (e) {
        console.error(e);
        return window.open("https://urldecode.org/?text=" + JSON.stringify(e));
    });
    event.completed();
}

В настольном Word я получаю следующую ошибку:

{
    "name":"OfficeExtension.Error",
    "code":"ItemNotFound",
    "message":"ItemNotFound",
    "traceMessages":[],
    "debugInfo":{
        "errorLocation":"ParagraphCollection.getItem"
    },
    "stack":"ItemNotFound: ItemNotFound\n   at Anonymous function (https://appsforoffice.microsoft.com/lib/1/hosted/word-win32-16.01.debug.js:8103:6)\n   at lib$es6$promise$$internal$$tryCatch (https://appsforoffice.microsoft.com/lib/1/hosted/word-win32-16.01.debug.js:8974:8)\n   at lib$es6$promise$$internal$$invokeCallback (https://appsforoffice.microsoft.com/lib/1/hosted/word-win32-16.01.debug.js:8984:8)\n   at lib$es6$promise$$internal$$publish (https://appsforoffice.microsoft.com/lib/1/hosted/word-win32-16.01.debug.js:8960:9)\n   at lib$es6$promise$asap$$flush (https://appsforoffice.microsoft.com/lib/1/hosted/word-win32-16.01.debug.js:8779:8)"
}

Отладка выявила, что ошибка возникает в context.sync после установки стилей абзаца. Как видно из сообщения об ошибке, я использую unminified office.js для отладки, но ошибка также возникает с office.js по умолчанию, только с менее полезной трассировкой стека. Если я установлю range.style = "Banana" вместо работы с абзацами, это будет работать как в Word Online, так и в Word Desktop. Стиль «Банан» - это связанный стиль (поэтому он должен работать как для абзацев, так и для символов).

Я получаю ту же ошибку при замене items[i].style = "Banana" на items[i].delete() или items[i].insertText("Hello world", "After"), поэтому проблема не связана с самим стилем.

Возможный обходной путь, который я нашел, заключается в том, что я могу установить стиль абзаца в выбранном диапазоне, и он будет работать так, как ожидалось (установить стиль всех выбранных абзацев, даже тех, которые частично выделены), но я полагаю, что я ' В какой-то момент мне придется поработать с ParagraphCollection, поэтому я все равно хотел бы знать, что я делаю не так.

Я тестировал Word версии 16.0.7341.2035 и 16.0.7167.2060.


person Thiez    schedule 28.09.2016    source источник


Ответы (1)


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

Word.run(function(context) {
     var pars = context.document.getSelection().paragraphs;
       pars.load();
        return context.sync().then(function () {
            for (var i = 0; i < pars.items.length; i++) {
                pars.items[i].style = "Banana";
            }
           
    return context.sync();
        })
}).catch(function(error) {
    console.log(error);
    if (error instanceof OfficeExtension.Error) {
        console.log("Debug info: " + JSON.stringify(error.debugInfo));
    }
});

этот код, безусловно, работает на всех платформах. спасибо Хуану.

person Juan Balmori    schedule 28.09.2016
comment
Обязательно попробую вашу версию. Не могли бы вы объяснить разницу? Версия Word для настольных ПК сообщала правильное количество выбранных абзацев в свойстве paragraphs.items, поэтому у меня сложилось впечатление, что он был инициализирован правильно. - person Thiez; 29.09.2016
comment
Короче говоря, это своего рода ошибка, которую нам нужно исправить. Длинная история объясняет, почему существует Word.run. Раньше было время на ранних этапах нашего API, когда вам нужно было сохранить переменную между пакетами, вам нужно было сделать это явным образом, добавив свои переменные в то, что мы называем коллекцией ссылок, и вам также нужно было убедиться, что для освобождения ресурсов после их использования, как бы в стиле calloc / malloc. Итак, прелесть Word.run в том, что разработчику не нужно беспокоиться об этой сложности и просто использовать переменные в пакетах, мы делаем - person Juan Balmori; 29.09.2016
comment
тяжелая работа по хранению ссылок для разработчика. Проблема с вашим кодом заключается в том, что мы не сохраняем ссылки на коллекцию, которую вы запрашиваете в операторе загрузки в Windows (а в сети будет обновление, которое также завершится ошибкой). Но в результате вашего вопроса (спасибо!) Мы думаем также о добавлении ссылок на элементы, запрошенные в загрузке. Так что сейчас, пожалуйста, немного измените свой стиль программирования, как я предлагал, и все будет в порядке. Через несколько месяцев ваш исходный код также будет успешным везде. Спасибо - person Juan Balmori; 29.09.2016