2016-05-20 8 views
1

私はExcel online add-inの下にイベントハンドラを書いています。ボタンactivateによって起動され、ユーザーが別のセルまたは範囲をクリックすると、そのアドレスはテキストエリアmyTextAreaに書き込まれます。すべてが機能します。イベントハンドラをシームレスにするには?

ただし、新しいセルが選択されると、緑色の読み込みシンボルがフォーカスの近くに表示されます。 WORKING...がExcelの下部に表示されます。ほぼ0.5 secondになります。

このような簡単な操作には時間がかかることに驚いています。このイベントハンドラをより速くすることが可能かどうかは誰にも知られていますか?そうでなければ、これをシームレスにするためにイベント処理以外の手段がありますか?

(function() { 
    "use strict"; 

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

    function addSelectionChangedEventHandler() { 
     Office.context.document.addHandlerAsync(Office.EventType.DocumentSelectionChanged, MyHandler); 
    } 

    function MyHandler(eventArgs) { 
     doStuffWithNewSelection(); 
    } 

    function doStuffWithNewSelection() { 
     Excel.run(function(ctx) { 
      var selectedRange = ctx.workbook.getSelectedRange(); 
      selectedRange.load(["address"]); 
      return ctx.sync().then(function() { 
       write(selectedRange.address) 
      }) 
     }).then(function() { 
      console.log("done"); 
     }).catch(function(error) { 
      ... 
     }); 
    }  

    function write(message) { 
     document.getElementById("myTextarea").value = message; 
    } 
})(); 

答えて

0

あなたが見ているのはネットワーク遅延です。一度登録された選択変更イベントは、サーバー上で発生し、イベントハンドラを起動するOffice.jsがコードをトリガします。イベントハンドラは、選択範囲オブジェクトとそのアドレスを取得するためのローカルリクエストを作成し、ctx.sync()の一部としてサーバーに送信し、.thenを起動する前にサーバーからの応答を待ちます。

このフローを最適化するために何かできることはありません.Excel Onlineでトランザクションあたりのコストが非常に高くなります。イベントハンドラは、そのコストに1ステップ増やすだけです。一方、良いニュースは、Excel.run/ctxベースのモデルでは、複数のリクエストを1つにまとめて、必要なラウンドトリップ数を大幅に減らすことができるということです。つまり、10の異なる範囲の値を取得することは、速度が1つだけを取得することとほぼ同じです。個々の通話が個別に行われた場合は10倍も高価になります。

希望すると便利です。

〜Office拡張性チームの開発者Michael Zlatkovsky、MSFT

関連する問題