查找表与select相交

我正在寻找Excel VBA Intersect方法的Javascript等价物。 我需要find活动单元格表。 基本上我所做的一切都是基于用户当前select的表格。 IIRC,目前还没有办法直接做到这一点。 所以我试图做的基本上是这样的:

  • 获取选定的范围(仍然不完美,因为我真的只想要的ActiveCell ,而不是select )。
  • 获取工作表。
  • 循环浏览工作表上的所有表格。
  • 检查每个表格,看看选定的范围是否在表格范围内。

我已经猴子了一下,这是我现在有什么不工作…

Excel.run(function(ctx) { var Selection = ctx.workbook.getSelectedRange(); var Tables = ctx.workbook.tables; var TableNames = ctx.workbook.tables.load("name"); for (var i = 0; i < TableNames.items.length; i++) { var Table = ctx.workbook.tables.getItem(TableNames.items[i].name); Table.getRange().load('address'); var Intersect = Selection.getBoundingRect(Table.getRange().address); if (Intersect != null) {return ctx.sync().then(function() { TableNames.items[i].name; })}; } return ctx.sync(); }).catch(function(error) { console.log(error); if (error instanceof OfficeExtension.Error) { console.log("Debug info: " + JSON.stringify(error.debugInfo)); } }); 

如果是原生的,这将是API的一大进步。 ;)

谢谢,扎克

有几种方法可以检查当前select是否与表格相交。 这段代码演示了其中两个。

下面的两个例子都是用TypeScript 2.1的预览asynchronous/等待语法(或者更准确地说,语法已经存在,但编译到ES5是新的,仍然处于预览状态)编写的。 通过使用“await”,第二种方法变得简单得多,但是这两种方法都可以通过正则承诺链来实现。

  1. 预览之一效率更高,但它使用了“预览”(即仅在Beta CDN上可用,并且可以更改/重命名)的API。 它同时进行所有交叉检查。
  2. 如果您有数百个表,或者如果您在Excel Online上运行,则Prod版本的效率会降低。 它需要更多的往返服务器,因为它逐一检查每个表格交点,并依靠抛出的错误来通知它没有find交点。

预览方法:

 $('#check-intersection-preview').click(function() { // Note: this function uses a "Preview" API ("range.getIntersectionOrNull"), // which is only available on the Beta CDN right now, and is subject to change. // Do not rely on this for production. Instead, use the alternate // (albeit less neat) version. Excel.run(async function(context) { var selection = context.workbook.getSelectedRange(); var tables = context.workbook.tables.load("name"); await context.sync(); var intersections: { [email: string]: Excel.Range } = { }; tables.items.forEach((table) => { intersections[table.name] = table.getRange(). getIntersectionOrNull(selection).load("address"); }); await context.sync(); var found = false; for (var tableName in intersections) { var rangeOrNull = intersections[tableName]; if (!rangeOrNull.isNull) { found = true; console.log(`Intersection found with table "${tableName}". ` + `Intersection range: "${rangeOrNull.address}".`); } } if (!found) { console.log("Selection does not intersect any table"); } }).catch(errorHandler); }); 

产品符合的方法:

 $('#check-intersection-prod').click(function() { Excel.run(async function(context) { var selection = context.workbook.getSelectedRange(); var tables = context.workbook.tables.load("name"); await context.sync(); var found = false; for (var i = 0; i < tables.items.length; i++) { try { var table = tables.items[i]; var intersectionRange = table.getRange() .getIntersection(selection).load("address"); await context.sync(); // If reached past the sync, it means that "getIntersection" // did not throw an error, and so the intersection must be valid. found = true; console.log(`Intersection found with table "${table.name}". ` + `Intersection range: "${intersectionRange.address}".`); } catch (e) { var isExpectedError = e instanceof OfficeExtension.Error && (<OfficeExtension.Error>e).code === Excel.ErrorCodes.itemNotFound; if (!isExpectedError) { throw e; } } } if (!found) { console.log("Selection does not intersect any table"); } }).catch(errorHandler); }); 

常见的errorHandler帮手:

 function errorHandler(error) { console.log(error); if (error instanceof OfficeExtension.Error) { console.log("Debug info: " + JSON.stringify(error.debugInfo)); } }