Javascript Office.js获取与内容控件相邻的范围

Javascript Office.js获取与内容控件相邻的范围,javascript,ms-word,office-js,word-contentcontrol,Javascript,Ms Word,Office Js,Word Contentcontrol,我有下面这个词: 带有一些内容控件的文本文档(也是文本) 内容控件始终与普通文本相邻(文本和内容控件之间没有空格) 创建内容控件时,其样式与相邻文本相同(通过编辑从插入内容控件的选择中读取的font.color、font.name、font.size等) 更新内容控件(更新其内容)时,将重置其样式,我需要再次应用文档样式(无问题,工作正常) 问题是,当内容控件更新时,当前文档选择可以在任何地方,但我需要确保它们重新应用与相邻文本相同的样式 在Office.js中是否有方法获取与内容控件相邻的

我有下面这个词:

  • 带有一些内容控件的文本文档(也是文本)
  • 内容控件始终与普通文本相邻(文本和内容控件之间没有空格)
  • 创建内容控件时,其样式与相邻文本相同(通过编辑从插入内容控件的选择中读取的
    font.color
    font.name
    font.size
    等)
  • 更新内容控件(更新其内容)时,将重置其样式,我需要再次应用文档样式(无问题,工作正常)
问题是,当内容控件更新时,当前文档选择可以在任何地方,但我需要确保它们重新应用与相邻文本相同的样式


在Office.js中是否有方法获取与内容控件相邻的范围?这样我就可以读取它的样式并将其应用于内容控件。

我的假设是,您希望文本紧跟在内容控件之前。不幸的是,对象模型没有为“向后”提供与
getnextterrange
等价的属性(
getPreviousTextRange

这是可以做到的,但有点绕圈子。以下是我的脚本实验室示例代码:

async function
    getAdjacentRange() {
    await Word.run(async (context) => {

        var ccs = context.document.contentControls;
        ccs.load("items");
        await context.sync();
        console.log("Nr cc: " + ccs.items.length);
        let cc = ccs.items[0];

        //The starting point of the content control so that 
        //the range can be extended backwards          
        let ccRange = cc.getRange("Start");
        let ccParas = ccRange.paragraphs; cc.load("text,range,paragraphs");
        let ccPara = ccParas.getFirst();
        ccParas.load("items")

    //The content control must be in a paragraph: get that paragraph's
    //starting point so that the range can be extended in that direction
        let paraRange = ccPara.getRange("Start");
        let rng = paraRange.expandTo(ccRange);
   //Get the words in the range of the start of the paragraph to the 
   //start of the content control in order to get the last one before the content control
        let em = [" "];
        let words = rng.getTextRanges(em, true);
        words.load("items");
        await context.sync();
        let nrWords = words.items.length;

      //minus 2 to get second to last word since last word is directly adjacent to content control (no space)
        let lastWord = words.items[nrWords - 2];

        //Now get the content from the end of the second to last word to
        //the start of the content control, which will be the last word
        let word2BeforeCC = lastWord.getRange("End");
        let wordBeforeCC = word2BeforeCC.expandTo(ccRange);
        wordBeforeCC.load("text");
        await context.sync();
        console.log(cc.text + "/ Word before the content control: " + wordBeforeCC.text + " / nr Words: " + nrWords);
})
    }
最后一个单词和内容控件之间有空格时的代码:

async function
    getAdjacentRange() {
    await Word.run(async (context) => {
        var ccs = context.document.contentControls;
        ccs.load("items");
        await context.sync();

        let cc = ccs.getFirstOrNullObject();

        //The starting point of the content control so that 
        //the range can be extended backwards
        let ccRange = cc.getRange("Start");

        //The content control must be in a paragraph, so get that paragraph's
        //starting point so that the range can be extended in that direction
        let ccParas = ccRange.paragraphs; cc.load("text,range,paragraphs");
        let ccPara = ccParas.getFirst();
        ccParas.load("items")
        let paraRange = ccPara.getRange("Start");
        let rng = paraRange.expandTo(ccRange);

        //Now it's possible to get the last word in the extended range
        let em = [" "];
        console.log(em.length.toString());
        let words = rng.getTextRanges(em, true);
        words.load("items");
        await context.sync();
        let nrWords = words.items.length;
        //returns a Range object, from which you can get the style info
        let lastWord = words.items[nrWords - 1];

        await context.sync();
        console.log(cc.text + "/" + "nr Words: " + nrWords + "last word: " + lastWord.text);
})
    }

试试这个。如果有效,我将给出一个答案:使用ContentControl.getRange()获取控件的范围。然后使用Range.getNextTextRange(或Range.getNextTextRangeOrNullObject)获取控件后面的范围。然后读取范围的样式并将其重新应用于控件。是的,我希望文本位于CC之前。我正在试用代码,我有一个问题:
lastWord
打印最后一个单词+形容词的第一个单词。复写的副本。它们之间没有空格,我应该明确地写出来。因此,我可以得到
font
,但是
font.color
是空的,因为范围中有两种不同的颜色。在我的示例中,字体本身在段落和CC中都是相同的,因此如果我打印
font.name
,我会得到
Calibri
。有没有一种方法可以在不连接到抄送内容的情况下,只获取抄送前的最后一个单词?是的,@dnmh,尽管这更复杂(而且需要一些思考)。我对我的答案进行了编辑,也加入了这种方法。请编辑您的问题以包含其他信息,以便我的回答对感兴趣的其他人有意义:-)