Javascript Office Word JS-表格选择的内容控件

Javascript Office Word JS-表格选择的内容控件,javascript,office365,office-js,word-addins,Javascript,Office365,Office Js,Word Addins,我正在使用OfficeJSAPI开发一个Word加载项,试图围绕文档中的表绑定添加一个内容控件 我遇到的问题是,在选择表周围的绑定后,使用goToByIdAsync(),内容控件仅围绕表的最后一行创建,而不是围绕所选内容创建。返回值ctx.document.getSelection()我可以看到所选范围只是所选表中的最后一行。我需要使用Binding对象来了解表的选定单元格范围。我做错什么了吗 var bindingId = '123'; var doc = Office.con

我正在使用OfficeJSAPI开发一个Word加载项,试图围绕文档中的表绑定添加一个内容控件

我遇到的问题是,在选择表周围的绑定后,使用
goToByIdAsync()
,内容控件仅围绕表的最后一行创建,而不是围绕所选内容创建。返回值
ctx.document.getSelection()
我可以看到所选范围只是所选表中的最后一行。我需要使用Binding对象来了解表的选定单元格范围。我做错什么了吗

var bindingId  = '123';
var doc        = Office.context.document;

    // Create table in document.
    doc.setSelectedDataAsync(tableValue, { coercionType: Office.CoercionType.Table }, function (asyncResult) {

            // Add Binding to table
            doc.bindings.addFromSelectionAsync(Office.BindingType.Table, { id: bindingId }, function (asyncResult) {

                    // Select the table object                        
                    doc.goToByIdAsync(bindingId, Office.GoToType.Binding, { selectionMode: 'selected' }, function (asyncResult) {

                         // Create Content Control
                         createCC();
                    });

            });
    });


    function createCC(){
         Word.run(function (ctx) {
             var range = ctx.document.getSelection();
             var html  = range.getHtml();

                 return ctx.sync().then(function () {
                     console.log('Selected Range', html.value); // Only displays last row in the table.

                     var myContentControl = range.insertContentControl();
                         myContentControl.tag = bindingId;
                         myContentControl.title = 'My Content Control';

                         return ctx.sync().then(function () {
                                    //Content control for table created
                                });
                           }).catch(function (err) {
                               errorHandler(err);
                           });
                    });
    }

这是一个很好的问题!谢谢你的邀请。我建议你改变一下实现你想要的场景的方法。首先,goToById不应用于获取任何对象的范围,这只是出于导航目的。如果您可以插入一个表,用一个命名的内容控件包装它(为它指定一个标题),创建一个绑定(使用addFromNamedItem,而不使用addFromSelection,因为您没有一个实体选择:),那么它将更具确定性,然后只需订阅bindingSelectionChanged事件,并对表或所选单元格执行任何需要执行的操作

下面的代码显示了这一点。希望它能帮你找到正确的方向。我对上面描述的每个步骤都添加了一堆注释

谢谢,快乐编码

函数insertTableCreateABindingAndSubscribeToEvents(){
Word.run(函数(上下文){
//好的,首先我们插入一个表…2行,3列
var myTableData=[[“香蕉”、“芒果”、“樱桃”]、[“10”、“20”、“30”];
var myTable=context.document.body.insertTable(2,3,“end”,myTableData);//在文档正文的末尾插入。
加载(myTable);
返回context.sync()
.then(函数(){
//然后我们用一个内容控件包装isnerted表
var myCC=myTable.insertContentControl();
myCC.title=“myTableTitle”//重要提示:分配一个标题,这样我就可以使用它来绑定namedItem!
返回context.sync()
.then(函数(){
//现在我们创建绑定并订阅事件。。。
//因为我们知道内容控件标题,所以可以使用addFromNamedItem!
Office.context.document.bindings.addFromNamedItemAsync(“myTableTitle”,“table”,{},函数(结果){
//boom现在让我们订阅活动。。。
如果(result.status==“成功”){
//现在让我们订阅selectionChanged事件\
result.value.addHandlerAsync(Office.EventType.BindingSelectionChanged,handler);
}
否则{
控制台日志(“错误”);
}
} )
})
})
})
.catch(函数(e){
控制台日志(e.message);
})
}
函数处理程序(args){
//查看您可以获得的所有值,请参见下面我们如何使用它来显示所选单元格值。。。
//log(“选择已更改!”+args.startRow+“”+args.startColumn+“”+args.rowCount+“”+args.columnCount);
var行;
if(args.startRow==未定义){
//菜单选择在标题中!
行=0;
}
否则{
//选择不在标题中。。。
行=args.startRow+1
}
//您可以在此处尝试的另一件事是获取表格,并打印选定的单元格值。。
运行(函数(上下文){
//此指令在名为“myTableTite”的内容控件中选择了表的单元格
var mySelectedCellBody=context.document.contentControls.getByTitle(“myTableTitle”).getFirst().tables.getFirst().getCell(行,args.startColumn).body;
加载(mySelectedCellBody);
返回context.sync()
.然后(函数(){
//让我们写入单元格的值(假设选择了单个单元格。)
log(mySelectedCellBody.text);
})
})
.catch(函数(e){
console.log(“处理程序:”+e.message);
})

}
非常感谢您的回复!有道理,这是可行的。但是,是否仍然可以使用CC的不同属性而不是标题(即标记)?在我的应用程序中,标题可能不是唯一的。不幸的是不是。它必须是标题。如果有许多ccs共享相同的标题,则不能创建bindingByName,因此请确保分配不同的标题。