在Word Javascript API / Office.js中在光标之前创建一个跨越字符的范围

时间:2018-12-14 05:11:45

标签: javascript ms-office office-js

我正在尝试创建一个Office Javascript加载项,它将检查光标之前的字符并根据其内容替换该字符。因此,我需要在光标之前创建一个字符范围。我可以使用VBA宏轻松地做到这一点,但是不幸的是,我找不到新的javascript API来做到这一点的方法。这可能吗?

如果可能的话,如果我可以看一下光标前后的5个字符以了解添加的上下文,那也将很有帮助。

谢谢。

1 个答案:

答案 0 :(得分:0)

几个月前,我尝试了类似的方法。简而言之,没有好的方法。 您可以尝试我在下面指定的内容,但是我建议您反对。该示例没有经过仔细考虑,很可能会包含许多错误。另外,我发现这是做这么简单的事情的效率极低的方法。

API中的

限制因素阻止了简单的解决方案:

  • 没有光标,只有选择。这意味着您需要假设光标始终位于选择的开头。
  • 无法通过Office.js API直接修改选择。因此,不可能将选择范围扩展到包括前一个字符。
  • “范围”对象的确可以扩展为both directions,但它需要另一个范围作为输入。这意味着需要创建/找到较早的范围(即,当前选择之前的范围对象)。
  • 您只能通过“ 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();
                        }
                    });
            });
    });
}

另一种方法是通过文本范围。这将大大降低效率。无论哪种方式,我希望这都能帮助您找到适合您需求的解决方案。