对面平台无法识别 Office.js 绑定(Office Online 与 Office Desktop)

Posted

技术标签:

【中文标题】对面平台无法识别 Office.js 绑定(Office Online 与 Office Desktop)【英文标题】:Office.js Bindings Not Recognized in Opposite Platform (Office Online vs Office Desktop) 【发布时间】:2018-09-06 07:32:01 【问题描述】:

我们正在为 Excel 和 Word 开发 javascript office 插件。我们的用户将使用 Office Desktop 和 Office Online。

当用户在插件中创建新记录时,我们会在当前具有焦点的范围上创建一个绑定。正在创建绑定并且看起来很好,但如果用户在 Office Desktop 中创建绑定,然后在 Office Online 中打开文档,则无法识别绑定。反之亦然,如果绑定是在 Office Online 中创建的,则它们以后不会被 Desktop 识别。

有没有更好的方法来做到这一点?

请参阅下面的代码以了解我们在 Excel 中的示例:

addNote() 
  try 
    Excel.run((ctx) => 
      const selectedRange = ctx.workbook.getSelectedRange();
      selectedRange.load('address');

      return ctx.sync().then(() => 
        const currentAddress = selectedRange.address;
        this.setState( currentAddress );

        const bindingName = `SymphonyBinding_$newGuid()`;
        const myBindings = Office.context.document.bindings;
        this.setState( bindingName );
        myBindings.addFromNamedItemAsync(currentAddress, 'matrix',  id: bindingName ,
          (result) => 
            if (result.status === 'succeeded') 
              this.setState( bindingName: result.value.id );
              meow.raise( name: 'create-new-note', context:  tags: [result.value.id]  );
             else 
              this.setState( bindingName: 'could not bind' );
            
          );
      );
    );
   catch (error) 
    handleError('Office Add-In', error, error.message);
  

这是识别绑定的代码:

showNoteRequested( context ) 
  const  note  = context;
  note.tags.forEach((tag) => 
    if (tag.name.indexOf('SymphonyBinding_') !== -1) 
      this.setState( bindingName: tag.name , this.selectRange);
    
  );


selectRange() 
  const  bindingName  = this.state;
  try 
    Excel.run((ctx) => 
      const foundBinding = ctx.workbook.bindings.getItem(bindingName);
      const myRange = foundBinding.getRange();
      myRange.select();
      myRange.load('address');
      return ctx.sync().then(() => 
        const currentAddress = myRange.address;
        this.setState( currentAddress );
      );
    );
   catch (error) 
    handleError('Office Add-In', error, error.message);
  

【问题讨论】:

您能展示一下尝试识别绑定的代码吗? 如何在每个环境中加载加载项(旁加载?集中部署?) 我们测试了两种方法 - 侧载清单文件和适用于 Office SharePoint 目录的应用程序。 你试过word富客户端/在线吗?我已经修复了 word online 的类似问题,所以我认为你不应该在 word 上看到这个问题。 尝试使用Centralized Deployment。设置/绑定通过加载项的 ID 存储在文档中,并且旁加载的加载项会在安装时获得一个随机 ID。集中部署确保它们都使用相同的 ID: 【参考方案1】:

以下绑定创建代码是否等同于您在 addNode 中的代码?当文件在 Excel Online build 16.0.9229.5030 中加载时,它似乎对我工作正常。

function run() 
    return Excel.run(function (ctx) 
        const selectedRange = ctx.workbook.getSelectedRange();
        selectedRange.load('address');

        return ctx.sync().then(() => 
            const currentAddress = selectedRange.address;
            const bindingName = 'SymphonyBinding_493332C3-F66B-41BF-B37E-8E28D045E2F0';
            const myBindings = Office.context.document.bindings;
            console.log("binding name" + bindingName);
            myBindings.addFromNamedItemAsync(currentAddress, 'matrix',  id: bindingName ,
                (result) => 
                    console.log("binding created");
                );
        );
    );

【讨论】:

以上是关于对面平台无法识别 Office.js 绑定(Office Online 与 Office Desktop)的主要内容,如果未能解决你的问题,请参考以下文章

绑定到端口 80 的未识别进程

绑定到端口 80 的未识别进程

将用户控件绑定到布尔属性的对面

jQuery的.click,.bind,.unbind,.on,.off,.delegate,.undelegate

Office.js displayDialogAsync 在 IE 上的 word online 中无法正常工作

浅谈jquery之on()绑定事件和off()解除绑定事件