Office js 如何将OOXML插入本机和联机Word中的锁定内容控件?

Office js 如何将OOXML插入本机和联机Word中的锁定内容控件?,office-js,word-addins,Office Js,Word Addins,我正在开发一个Word插件,将OOXML插入到锁定的内容控件中(即设置了cannotDelete和cannotEdit标志),并且遇到了本机Word和联机Word之间的结果问题。在本机Word中,会使用cannotEdit标志,因此ContentControl.insertOoxml将失败,除非我首先禁用该标志,无论我是否使用start或replace作为第二个参数 但是,在Word Online中,使用start作为第二个参数会忽略这两个标志(无论其值如何),并使用插入的OOXML替换任何当前

我正在开发一个Word插件,将OOXML插入到锁定的内容控件中(即设置了
cannotDelete
cannotEdit
标志),并且遇到了本机Word和联机Word之间的结果问题。在本机Word中,会使用
cannotEdit
标志,因此
ContentControl.insertOoxml
将失败,除非我首先禁用该标志,无论我是否使用
start
replace
作为第二个参数

但是,在Word Online中,使用
start
作为第二个参数会忽略这两个标志(无论其值如何),并使用插入的OOXML替换任何当前内容,而不是将其前置。使用
replace
时,最终结果与预期一致,但
cannotDelete
标志控制调用是否成功,而不是
cannotEdit

最终的结果是,我无法在内容控件中预先添加OOXML,因为Word Online会覆盖任何当前内容,并且在执行实际替换时,我必须禁用这两个标志,因为本地Word会使用
cannotEdit
,Word Online会使用
cannotDelete

下面是一个简单的脚本来演示该问题:

Office.initialize = function (reason) {
    return Word.run(function (context) {

        var contentControls = context.document.contentControls;
        context.load(contentControls, 'id');

        return context.sync().then(function () {

            var control = contentControls.items[0];

            //control.cannotDelete = false;
            //control.cannotEdit = false;

            // Use 'start' or 'replace' as a second parameter to notice varying behavior in Word Online
            control.insertOoxml("<pkg:package xmlns:pkg='http://schemas.microsoft.com/office/2006/xmlPackage'><pkg:part pkg:name='/_rels/.rels' pkg:contentType='application/vnd.openxmlformats-package.relationships+xml' pkg:padding='512'><pkg:xmlData><Relationships xmlns='http://schemas.openxmlformats.org/package/2006/relationships'><Relationship Id='rId1' Type='http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument' Target='word/document.xml'/></Relationships></pkg:xmlData></pkg:part><pkg:part pkg:name='/word/document.xml' pkg:contentType='application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml'><pkg:xmlData><w:document xmlns:w='http://schemas.openxmlformats.org/wordprocessingml/2006/main' ><w:body><w:p><w:pPr><w:spacing w:before='360' w:after='0' w:line='480' w:lineRule='auto'/><w:rPr><w:color w:val='70AD47' w:themeColor='accent6'/><w:sz w:val='28'/></w:rPr></w:pPr><w:r><w:rPr><w:color w:val='70AD47' w:themeColor='accent6'/><w:sz w:val='28'/></w:rPr><w:t>This text has formatting directly applied to achieve its font size, color, line spacing, and paragraph spacing.</w:t></w:r></w:p></w:body></w:document></pkg:xmlData></pkg:part></pkg:package>", "start");

            //control.cannotDelete = true;
            //control.cannotEdit = true;

            return context.sync();
        });
    })
    .catch(function (error) {
        console.log('Error: ' + JSON.stringify(error));
        if (error instanceof OfficeExtension.Error) {
            console.log('Debug info: ' + JSON.stringify(error.debugInfo));
        }
    });
};
Office.initialize=函数(原因){
返回Word.run(函数(上下文){
var contentControls=context.document.contentControls;
load(contentControls,'id');
返回context.sync().then(函数(){
var control=contentControls.items[0];
//control.cannotDelete=false;
//control.cannotEdit=false;
//使用“start”或“replace”作为第二个参数来注意Word Online中的各种行为
control.insertOoxml(“此文本的格式直接应用于实现其字体大小、颜色、行距和段落间距。”,“开始”);
//control.cannotDelete=true;
//control.cannotEdit=true;
返回context.sync();
});
})
.catch(函数(错误){
log('Error:'+JSON.stringify(Error));
if(OfficeExtension.error的错误实例){
log('Debug info:'+JSON.stringify(error.debugInfo));
}
});
};
我还创建了一个用于测试的控件,尽管它只不过是一个带有一些内容的锁定的富文本内容控件

按原样,脚本在本机Word中会失败,因为
cannotEdit
标志不会首先被禁用,但会在Word Online中成功,测试文本将被替换(即使使用了
start
)。使用
replace
而不是
start
并取消对设置
control.cannotEdit
的行的注释,将导致它在本机Word中成功,但在Word Online中失败。为了使它在使用
replace
时在两种环境中都能成功,还必须取消注释
控件.cannotDelete

这是预期的行为吗?建议在联机和本机环境中使用
ContentControl.insertOoxml
的方法是什么