6

検索を実行し、結果に関する情報をリストとしてユーザーに表示する単語用のタスクペイン アドインを作成しました。ユーザーがリスト内の項目をクリックすると、単語の範囲を選択して、ユーザーに項目の場所を表示したいと考えています。アドインにより、ユーザーは範囲に対して追加のタスクを実行できます。たとえば、フォントの色を変更できます。

以下の関数を使用して、検索を実行し、表示する範囲を取得できます。

function runSearch(textToFind) {
  var items = [];
  return Word.run(function(context) {
    var options = Word.SearchOptions.newObject(context);
    options.matchWildCards = false;

    var rangesFind = context.document.body.search(textToFind, options);
    context.load(rangesFind, 'text, font, style');
    return context.sync().then(function() {
      for (var i = 0; i < rangesFind.items.length; i++) {
        items.push(rangesFind.items[i]);
        context.trackedObjects.add(rangesFind.items[i]);
      }
      return context.sync();
    });
  })
  .then(function() {
    return items;
  });
}; 

ただし、ユーザーのクリック時に範囲を選択するのが困難です。範囲コンテキストを使用してみました:

function selectRange(range){
  range.select();
  return range.context.sync();
}

または、新しい Word.run コンテキストで範囲を使用します。

function selectRange(range){
  return Word.run(function(context) {
    context.load(range);
    return context.sync().then(function(){
      range.select();
      return context.sync();
    });
  });
}

検索結果ごとにコンテンツ コントロールを作成し、関数内のすべてのコンテンツ コントロールを新しいコンテキストで再読み込みして、一致するコントロールを見つけるという潜在的な方法に出くわしましたselectRangeが、範囲が既にある場合は非常に非効率的です。

異なる Word.run コンテキストで範囲を再利用するための最良の方法は何ですか?

4

3 に答える 3

0

TrackedObjects の修正に加えて、runSearch メソッドを更新して、searchResult を直接使用するのではなく、searchResult の範囲を取得する必要がありました。

function runSearch(textToFind) {
  var items = [];
  return Word.run(function(context) {
    var options = Word.SearchOptions.newObject(context);
    options.matchWildCards = false;

    var rangesFind = context.document.body.search(textToFind, options);
    context.load(rangesFind);
    return context.sync().then(function() {
      for (var i = 0; i < rangesFind.items.length; i++) {
        var range = rangesFind.items[i].getRange();
        context.load(range, 'text');
        items.push(range);
        context.trackedObjects.add(items[items.length-1]);
      }
      return context.sync();
    });
  })
  .then(function() {
    return items;
  });
}; 
于 2016-05-19T10:17:56.630 に答える