Я могу воспроизвести вашу проблему в 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>
Надеюсь, это поможет,
~ Майкл