【问题标题】:InvalidArgument error when calling Binding.getRange()调用 Binding.getRange() 时出现 InvalidArgument 错误
【发布时间】:2018-05-11 03:32:39
【问题描述】:

当我在 Binding 对象上调用 getRange() 方法时,我收到以下错误:

code: "InvalidArgument",
errorLocation: "Binding.getRange",
message: "The argument is invalid or missing or has an incorrect format."

这看起来很荒谬,因为根据上面链接的 API,该方法没有任何参数。

即使是带有 getRange() 的文档示例代码的新项目也会对我造成此错误(当然是在我添加绑定之后):

Excel.run(function (ctx) { 
    var binding = ctx.workbook.bindings.getItemAt(0);
    var range = binding.getRange();
    range.load('cellCount');
    return ctx.sync().then(function() {
        console.log(range.cellCount);
    });
}).catch(function(error) {
        console.log("Error: " + error);
        if (error instanceof OfficeExtension.Error) {
            console.log("Debug info: " + JSON.stringify(error.debugInfo));
        }
});

这里有一些看似无关的问题吗?

我在 Windows 10 上运行 Office Pro Plus 2016,版本 1709(内部版本 8528.2139),支持 ExcelApi 1.6。


更新

我在尝试添加与 bindings.add().addFromNamedItem() 的绑定时也看到此错误,如下所示:

ctx.workbook.bindings.addFromNamedItem("Name", Office.CoercionType.Text, "Name");

屈服:

code: "InvalidArgument",
errorLocation: "BindingCollection.addFromNamedItem",
message: "The argument is invalid or missing or has an incorrect format."

但是,我使用共享 API 方法 addFromNamedItemAsync() 的旧代码成功地添加了绑定而没有问题。

我将继续尝试以确定 ExcelApi 中所有与绑定相关的方法或任何非绑定相关或共享 API 方法是否都会发生这种情况。

【问题讨论】:

  • 你有没有我无法复制这个(字面意思是复制并粘贴你的代码)。您是否使用 CDN 中的生产库?
  • @MarcLaFleur 与来自 nuget、CDN 和来自 CDN 的 beta 的最新 office.js 的结果相同。我也从其他方法中收到此错误(请参阅上面的更新)。对于没有发布完整的示例项目,我深表歉意,但我似乎无法找到可以上传未被我的组织阻止的源代码的地方。
  • 你试过在ScriptLab中复制这个吗?有时这有助于缩小范围。
  • @MarcLaFleur 我能够保存gist of this。新的 sn-p,添加了来自文档示例的绑定和几行。产生错误。它发生在你身上吗?

标签: javascript excel office-js


【解决方案1】:

您以错误的方式添加绑定。 首先,地址应包含工作表名称,因为绑定集合位于工作簿上。因此,它不知道您指的是哪个范围。其次,您应该创建 Range 类型的绑定。最后,使用 getItemAt 是有限制的,因为位置可以根据删除操作而改变。带 key 的 getItem 是获取绑定对象的更好方法。

...
ctx.workbook.bindings.add("Sheet1!D3", "Range", "Binding2");
await ctx.sync();
var binding = ctx.workbook.bindings.getItem("Binding2");
var range = binding.getRange();
range.load('cellCount');
return ctx.sync().then(function () {
     console.log(range.cellCount);
});
...

【讨论】:

  • 感谢您的提示。我以前尝试过这些东西,只是没有在我提供的人为示例中。为什么为单个单元格“范围”? “文本”到底是干什么用的?
  • 如果您需要存储不绑定到范围的设置值,您可以使用文本绑定。它是作为具有该选项的旧 API 的桥梁而提供的。但是,对于那种情况,我会使用文档属性...
  • 我所做的只是将使用原始共享 API 编写的旧代码(将获取/设置单个单元格的值)转换为更新的 Excel API。所有旧代码都使用 Text 绑定工作,但在新方式中,我将永远不会使用 Text 并且总是使用 Range 来设置单个单元格的值?
  • 虽然我仍然不明白为什么 Text 绑定不再起作用并且必须替换为 Range 绑定,但切换到 Range 给了我一个可行的解决方案来解决我眼前的问题。接受这个答案。
  • 我并不是说文本绑定不起作用。就个人而言,我还没有找到使用它的理由。在代码中,我没有看到文本绑定是如何添加的。如果显示,我可以检查文本绑定创建或读取 API 是否存在问题。谢谢...
猜你喜欢
  • 1970-01-01
  • 2012-03-07
  • 2016-06-24
  • 2018-04-20
  • 2017-03-06
  • 2013-02-08
  • 1970-01-01
  • 2012-03-23
  • 2016-05-25
相关资源
最近更新 更多