2016-05-18 12 views
0

ユーザーがブック内で選択する範囲またはセルにイベントハンドラを追加したいとします。ユーザーがまたはセルまたは範囲を選択すると、いくつかのアクションを体系的に行う必要があります。選択した範囲にイベントハンドラを追加する

私はthis referenceを見ていますが、コードをアドイン全体に統合する場所はわかりません。

例えば、私のHome.htmlで、私はここ

<div id="content-main"> 
     <div class = "padding" id="message"></div> 
     <div class="padding"> 
      <button class="ms-Button" id="button">Click me!</button> 
     </div> 
    </div> 

を持っているがHome.jsです:

(function() { 
    "use strict"; 

    Office.initialize = function(reason) { 
     $(document).ready(function() { 
      app.initialize(); 
      $('#button').click(activateEventHandler); 
     }); 
    }; 

    function onBindingSelectionChanged(eventArgs) { 
     write(eventArgs.binding.id + " has been selected."); 
    } 
    function write(message) { 
     document.getElementById('message').innerText += message; 
    } 

    function activateEventHandler() { 
     Excel.run(function(ctx) { 
      var selectedRange = ctx.workbook.getSelectedRange(); 
      selectedRange.addHandlerAsync(Office.EventType.BindingSelectionChanged, onBindingSelectionChanged); 
      return ctx.sync() 
     }).then(function() { 
      console.log("done"); 
     }).catch(function(error) { 
      ... 
      } 
     }); 
    }   
})(); 

私はボタンがリスナーをアクティブに期待します。次に、ユーザーが別のセルまたは範囲を選択するたびに、メッセージがタスクペインに体系的に追加されます。ただし、上記のコードではError: TypeError: selectedRange.addHandlerAsync is not a functionという行がselectedRange.addHandlerAsync(...というエラーになります。

実際、私はこのコードをそのように構成するべきかどうかはわかりません...誰かが自分の仕事を達成するためにコードを修正する方法を知っていますか?

答えて

1

エラーの原因は、Rangeオブジェクトに対してaddHandlerAsync関数を呼び出そうとしているためです。ハンドラは、BindingオブジェクトまたはDocumentオブジェクトにのみ追加できます。どちらを選択するかは、達成したいものによって決まります。あなたの場合、の特定のの範囲で選択を聞くつもりはないと思いますが、実際にはのどこかの選択肢を聞くことがドキュメント内ではです。実際にはDocumentSelectionChanged eventを使用します。

(function() { 
    "use strict"; 

    Office.initialize = function(reason) { 
     $(document).ready(function() { 
      app.initialize(); 
      $('#button').click(activateEventHandler); 
     }); 
    }; 

    function onMySelectionChanged(eventArgs) { 
     write(eventArgs.binding.id + " has been selected."); 
     doStuffWithNewSelection(); 

    } 
    function write(message) { 
     document.getElementById('message').innerText += message; 
    } 

    function activateEventHandler(){ 
     Office.context.document.addHandlerAsync(Office.EventType.DocumentSelectionChanged, onMySelectionChanged); 
    } 

    function doStuffWithNewSelection() { 
     Excel.run(function(ctx) { 
      var selectedRange = ctx.workbook.getSelectedRange(); 
      // do other stuff with the selection as you wish, like read and display 
     }).then(function() { 
      console.log("done"); 
     }).catch(function(error) { 
      ... 
      } 
     }); 
    }   
})(); 
関連する問題