2017-08-11 4 views
1

を検索する方法範囲のアドレスの配列を格納しており、現在選択されているセルも認識しています。私は、格納されたアドレスによって定義されたすべての範囲を反復処理し、選択されたセルがその中にあるかどうかを確認する必要があります(交差がある場合)。同期的な世界では簡単ですが、私は非同期のオフィスの世界でそれを行う方法を理解することができません。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-における自己実行インナー機能があるのはなぜちょうど私がそれをコピー&ペーストしたいここにコードを持っている

サイクル?

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"ループを終了するのは簡単です。

TypeScriptの使用方法については、私の書籍「Building Office Add-ins using Office.js」で詳細に説明しています。なぜなら、TypeScriptはOfficeアドインに最も適していると思われる理由と、TypeScriptを使用するためのセットアップ方法です。ブックサンプルの全体は、プレーンES5 JavaScriptを使用する方法を具体的に示す付録を除いて、TypeScript構文で記述されています。 JavaScriptと活字体の全体的なプライマーもあります:より良い交差点を見つける方法の問題については

Chapter 4 Table of Contents

:あなたはアドレス演算を行うことを好まない場合は(私が...したいとは思わないでしょう) range.getIntersectionメソッドを使用できます。より正確には、複数の範囲でこれを行う場合は、range.getIntersectionOrNullObjectメソッドです。これは非投げ型です。あなたにも本の中でOrNullObject方法についての詳細を読むことができます:

<code>OrNullObject</code> topics

ホープ、このことができます!

〜マイケル

関連する問題