Пару месяцев назад я попробовал нечто подобное.Короче говоря, нет хорошего способа сделать это. Вы можете попробовать то, что я укажу ниже, но я бы посоветовал против этого. Пример не продуман и, скорее всего, будет содержать ряд ошибок.Кроме того, я считаю, что это невероятно неэффективный способ сделать что-то настолько простое.
Ограничения в API, препятствующие простому решению:
- Нет курсора, только выборки.Это означает, что вам нужно сделать предположение, что курсор всегда находится в начале выделения.
- Выборы не могут быть изменены напрямую через API Office.js.Таким образом, невозможно расширить выделение, чтобы включить предыдущий символ.
- Объект Range может расширяться в в обоих направлениях , но для него требуется другой диапазон в качестве входных данных.Это означает, что более ранний диапазон должен быть создан / найден (т. Е. Объект диапазона перед текущим выделением).
- Вы можете перемещаться за пределы выделения только через свойство parentBody, которое даст вам все тело элемента.документ.Это необходимо обработать, чтобы выделить диапазон перед курсором, который мог бы помочь нам заменить символ.
- Из того, что я могу сказать, невозможно создать диапазон для одного символа.Таким образом, больший диапазон должен быть взят перед курсором и полностью заменен.
Пример
// WARNING: Incredibly inefficient and poor code. Do not use directly!
// WARNING: Edge cases are not tackled in this example.
function replaceCharacterBeforeCursor() {
Word.run(function (context) {
var selection = context.document.getSelection();
// Assumption: Cursor always starts at the beginning of a selection.
var cursor = selection.getRange('Start');
// Create a new range that covers everything before the cursor (or the beginning of the selection).
var startDocument = selection.parentBody.getRange("Start");
var rangeBeforeSelection = startDocument.expandTo(startDocument);
// Capture parent paragraph.
var parentParagraph = rangeBeforeSelection.paragraphs.getLast();
context.load(parentParagraph);
context
.sync()
.then(function () {
// Create range that captures everything from the beginning of the parent
// paragraph until the cursor.
var paragraphStart = parentParagraph.getRange('Start');
var wordRangeBeforeCursor = paragraphStart.expandTo(cursor);
context.load(wordRangeBeforeCursor);
context
.sync()
.then(function () {
// Replace last character.
var oldText = wordRangeBeforeCursor.text;
var wordLength = oldText.length;
var lastCharacter = oldText.substring(wordLength - 1);
if (lastCharacter !== " ") {
var newText = oldText.substring(0, wordLength - 1) + "test";
wordRangeBeforeCursor.insertText(newText, 'Replace');
context.sync();
}
});
});
});
}
Другой способ сделать это - через текстдиапазоны.Это было бы существенно более неэффективно.В любом случае, я надеюсь, что это поможет вам найти решение, которое соответствует вашим потребностям.