Office.js 获取与内容控件相邻的范围
Office.js get range adjacent to a content control
我有以下场景字:
- 带有一些内容控件的文本文档(也是文本)
- 内容控件始终与普通文本相邻(文本和内容控件之间没有 space)
- 内容控件在创建时与相邻文本具有相同的样式(通过编辑它们的
font.color
、font.name
、font.size
等,这些内容是从其中的选择中读取的正在插入内容控件)
- 当内容控件更新(它们的内容被更新)时,它们的样式被重置,我需要再次应用文档样式(不是问题,工作正常)
问题是,更新内容控件时,当前文档选择可以在任何地方,但我需要确保它们重新应用与相邻文本相同的样式。
有没有办法在 Office.js 中获取与内容控件相邻的范围?这样我就可以读取它的样式并将其应用于内容控件。
我的假设是您希望文本紧接在内容控件之前。不幸的是,对象模型没有提供等同于 getNextTextRange
的 "backwards" (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);
})
}
当最后一个词和内容控件之间有 space 时的代码:
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);
})
}
我有以下场景字:
- 带有一些内容控件的文本文档(也是文本)
- 内容控件始终与普通文本相邻(文本和内容控件之间没有 space)
- 内容控件在创建时与相邻文本具有相同的样式(通过编辑它们的
font.color
、font.name
、font.size
等,这些内容是从其中的选择中读取的正在插入内容控件) - 当内容控件更新(它们的内容被更新)时,它们的样式被重置,我需要再次应用文档样式(不是问题,工作正常)
问题是,更新内容控件时,当前文档选择可以在任何地方,但我需要确保它们重新应用与相邻文本相同的样式。
有没有办法在 Office.js 中获取与内容控件相邻的范围?这样我就可以读取它的样式并将其应用于内容控件。
我的假设是您希望文本紧接在内容控件之前。不幸的是,对象模型没有提供等同于 getNextTextRange
的 "backwards" (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);
})
}
当最后一个词和内容控件之间有 space 时的代码:
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);
})
}