Использование Paragraph вне потока Word.run - PullRequest
2 голосов
/ 13 июня 2019

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

Я попытался использовать образец из книги, которая кажется защитной: «Создание офисных надстроек» Михаила Златковского.

var global_paragraph = undefined;
async function analyzeDocument() {
Word.run(async function(context) {
    const paragraphs = context.document.body.paragraphs;
    context.load(paragraphs, 'text');
    return context.sync().then(() => {
        for (let i = 0; i < paragraphs.items.length; i++) {
        if (/*some condition that works only once*/) {
          global_paragraph = paragraphs.items[i];
          global_paragraph.track();
        }
    };});
}).catch(handleError);
};
async function handleButtonClick() {
    OfficeExtension.config.extendedErrorLogging = true;
    Word.run(global_paragraph, async function(context) {
        global_paragraph.load("text");
        return context.sync().then(() => {
            /* do something */
        });
    }).catch(handleError);
};

Это привело к общему исключению.

{"code":"GeneralException","message":"GeneralException","errorLocation":"Document._GetObjectByReferenceId","statement":"var v=context.root._getObjectByReferenceId(\"p!00000DB2\");","surroundingStatements":["// >>>>>","var v=context.root._getObjectByReferenceId(\"p!00000DB2\");","// <<<<<","v.load([\"text\"]);"],"fullStatements":["var v=context.root._getObjectByReferenceId(\"p!00000DB2\");","v.load([\"text\"]);"]}

1 Ответ

1 голос
/ 13 июня 2019

Я могу воспроизвести вашу проблему в Script Lab.

Я считаю, что проблема не в вашем коде, а скорее в API Word.Хорошей новостью является то, что существует простой обходной путь, хотя я бы посоветовал вам в любом случае подать сообщение об ошибке на https://github.com/officedev/office-js/issues, чтобы убедиться, что команда продукта может его рассмотреть.

Обходной путьвместо

global_paragraph = paragraphs.items[i];

вместо этого:

global_paragraph = paragraphs.items[i].getRange();

Вызывая getRange(), он создает новый объект с надлежащей идентификацией и, таким образом, может отслеживать его позже.

Фрагмент, который я использовал в Script Lab (по сути, тот же, что и у вас), выглядит следующим образом:

$("#button1").click(() => tryCatch(button1));
$("#button2").click(() => tryCatch(button2));

var global_paragraph: Word.Range;

async function button1() {
  await Word.run(async function(context) {
    const paragraphs = context.document.body.paragraphs;
    context.load(paragraphs, "text");
    return context.sync().then(() => {
      for (let i = 0; i < paragraphs.items.length; i++) {
        if (paragraphs.items[i].text.startsWith("Dear")) {
          global_paragraph = paragraphs.items[i].getRange();
          global_paragraph.track();
        }
      }
    });
  });
}

async function button2() {
  OfficeExtension.config.extendedErrorLogging = true;
  Word.run(global_paragraph, async function(context) {
    global_paragraph.load("text");
    return context.sync().then(() => {
      console.log(global_paragraph.text);
    });
  });
}

/** Default helper for invoking an action and handling errors. */
async function tryCatch(callback) {
  try {
    await callback();
  } catch (error) {
    // Note: In a production add-in, you'd want to notify the user through your add-in's UI.
    console.error(error);
  }
}

(и, конечно, соответствующее изменение в HTML для добавлениядве кнопки):

<button id="button1" class="ms-Button">
    <span class="ms-Button-label">Button1</span>
</button>

<button id="button2" class="ms-Button">
    <span class="ms-Button-label">Button2</span>
</button>

Надеюсь, это поможет,

~ Майкл

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...