2017-08-11 54 views
1

我已经存储了一个范围地址数组,并且我也知道当前选中的单元格。我需要遍历存储地址定义的所有范围,并检查选中的单元格是否在其中一个单元格中(如果有交叉点)。在同步世界中,这很容易,但我无法弄清楚在office.js的异步世界中如何做到这一点。如何在Excel中使用Excel中的异步进行迭代搜索

我发现这个职位Best way to write loops with promises (ctx.sync) in JavaScript API for Office,其中Michal显示了一个很好的模式来链接异步调用,但是,我有一些问题。

正好有代码在这里我要复制粘贴:

function loadAll() { 
var ranges = ["A:A", "B:B", "C:C", "D:D", "E:E"]; 
var sheet = "Sheet1"; 

// Create a starter promise object 
var promise = new OfficeExtension.Promise(function(resolve, reject) { resolve (null); }); 

for (var i = 0; i < ranges.length; i++) { 
    // Create a closure over i, since it's used inside a function that won't be immediately executed. 
    (function(i) { 
     // Chain the promise by appending to it: 
     promise = promise.then(function() { 
      return loadRange(ranges[i], sheet); 
     }) 
    })(i);  
}} 

function loadRange (range, sheet) { 
return Excel.run(function (ctx) { 
    var r = ctx.workbook.worksheets.getItem(sheet).getRange(range); 
    r.load('address'); 
    return ctx.sync().then(function() { 
     console.log(r.address); 
    }); 
}); 

}

问题:

1)为什么有一个自动执行的内部函数在换我循环?应该是不够的:

for (var i = 0; i < ranges.length; i++) { 
    // Chain the promise by appending to it: 
    promise = promise.then(function() { 
     return loadRange(ranges[i], sheet); 
    }) 
}} 

2)我需要修改它,以停止链,如果找到交集。我怎样才能做到这一点? 3)你会推荐我一些其他方法如何迭代excel对象(例如范围)来搜索某些东西(列中的第一个空单元格等)吗?

感谢

菲利普

回答

0

如果使用打字稿及async/await语法中,自动执行功能和一堆其他古怪的消失,以及代码变得更容易理智战胜了。它也会使得退出for for循环变得微不足道。

我在我的书“Building Office Add-ins using Office.js”中详细描述了TypeScript的使用 - 包括为什么我认为TypeScript是Office加载项的最佳匹配,以及如何设置使用TypeScript。除了附录(我明确说明如何使用纯ES5 JavaScript)之外,本书的所有示例均以TypeScript语法编写。还有JavaScript的整体底漆和打字稿:

Chapter 4 Table of Contents

有关如何更好地找到交集的问题是:如果你不喜欢做地址运算(我不想...) ,您可以使用range.getIntersection方法。或者更确切地说,如果你正在为多个范围进行此操作,那么range.getIntersectionOrNullObject方法就是不投掷的变体。你可以阅读更多关于这本书的OrNullObject方法以及:

<code>OrNullObject</code> topics

希望这有助于!

〜Michael