2017-07-20 8 views
0

現在、ドキュメント内の各センテンスを話すために、テキストからスピーチを使用するアドインを開発中です。私は追跡されたオブジェクトを使用して、文章を次々に話す必要があるときに追跡します。Word Onlineでの追跡オブジェクトのスローエラー

'font.color'プロパティを読み込んでアクセスすることで、文章のフォント色を変更しようとするときに問題が発生します(話している間はハイライト表示されます)。これは、デスクトップ上で動作しますが、次のエラーがスローされますオンライン:

デバッグ情報:{「コード」:「GeneralException」、「メッセージ」:「プロパティはnullの 『GO』を読み取ることができません」、「errorLocation」 :「Range._onAccess」}以下

は、問題を再現する最小限のコードです:

... 
var sentences; 
... 

Word.run(function (context) { 
    var selectedSentence = context.document.getSelection().getTextRanges([".", "!", "?"]); 

    context.load(selectedSentence) 

    return context.sync().then(function() { 

     sentences = selectedSentence.items[0].getRange() 
     .expandTo(context.document.body.paragraphs.getLast().getRange("end")) 
     .getTextRanges([".", "!", "?"]); 

     context.load(sentences); 
     context.trackedObjects.add(sentences); 

     return context.sync(sentences); 
    }) 
}).then(function (sentences) { 

    sentences.context.load(sentences, 'font'); 
    return sentences.context.sync().then(function() { 
     sentences.items[0].font.color = "#2E86C1"; 
    }) 
    .then(sentences.context.sync) 

}).catch(errorHandler); 

あなたは、単に直接アクセスしようとすると、エラーも生成されます。

sentences.items[0].font.color = "#2E86C1"; 
sentences.context.sync(); 

答えて

1

コードはデスクトップでは動作しますが、Office Onlineでエラーが発生した場合、特にエラーがNULLオブジェクトに関するものである場合は、通常、問題は約束チェーンが壊れています。デスクトップでは、アドインとWordホスト間の往復はローカルです。どんなメソッドも非常に迅速に完了します。その場合、壊れた約束があったとしても、それらはすべて所望の順序で終了することがあります。しかし、Office Onlineを使用すると、メソッドの実行に時間がかかり、チェーンが壊れた場合、以前のメソッドが完了する前にいくつかの後のメソッドが終了することがあります。

".then"の前に改行を入れるか、context.sync()を呼び出すことがあるかどうかに矛盾があるため、約束をたどるのは難しいですが、 )。しかし、私は壊れた約束があなたの問題の原因だと思う。

また、then(function (sentences) { ...コードはWord.runの終了後に実行されます。私はあなたがこれを意図しているとは思わない、そう?このコードをWord.runの中に入れないでください。

EDIT:Microsoftエンジニアは、次のバージョンを試してみて、両方の部分が順番に呼び出されたときにWord Onlineで動作すると言います。これは、最初の部分と同じWord.runである必要はありませんが、コードの2番目の部分がWord.runの内部になければならないことを示しています。

パート1:

Word.run(function (context) { 
     var selectedSentence = context.document.getSelection().getTextRanges([".", "!", "?"]); 
     context.load(selectedSentence); 

     return context.sync().then(function() { 
      sentences = selectedSentence.items[0].getRange() 
      .expandTo(context.document.body.paragraphs.getLast().getRange("end")) 
      .getTextRanges([".", "!", "?"]); 

      context.load(sentences); 
      context.trackedObjects.add(sentences); 

      return context.sync(sentences); 
     }) 
    }); 

パート2:

Word.run(sentences, function(ctx){ 
     sentences.load('font'); 
     return ctx.sync().then(function(){ 
      sentences.items[0].font.color = "#2E86C1"; 
      return ctx.sync(); 
     }); 
    }); 
+0

それは意図的なものだ(私はあなたがそれぞれの文を強調したいどのくらいの時間を調整するために使用することができ、タイマーを追加してい)使用例では、次のセンテンスが話される前に 'Word.Run'の実行が完了していることを期待しています(したがって、そのフォントプロパティにアクセスする)ので、なぜ追跡対象オブジェクトを使用するのですか。上記のコードは、使用されている1つのセンテンスのみを示していますが、実際には、各センテンスを繰り返し処理するためにspeech.onendコールバックを使用しています。 – Daniel

+0

@Daniel Microsoftエンジニアのコードを使用して私のEDITを見てください。 –

0

私はあなたがその本当に必要としない、オブジェクトを追跡することなく、自分のシナリオを解決することができると思うと、これは使用範囲のコレクションを横断についてだけです約束する。この代替をチェックアウト:として、それはWord.Run外にある

function highlightSentences() { 
 
    Word.run(function (context) { 
 
     var myPars = context.document.body.paragraphs; 
 
     context.load(myPars); 
 
     return context.sync() 
 
      .then(function() { 
 
       var myWords = myPars.items[0].split([".","!","?"], true /*used to trim delimiters*/, true /* used to trim spaces */); 
 
       context.load(myWords, { expand: 'font' }); 
 
       return context.sync() 
 
        .then(function() { 
 
         return forEach(myWords, function (item, i) { 
 
          if (i >= 1) { 
 
           myWords.items[i - 1].font.highlightColor = "#FFFFFF"; 
 
          } 
 
          myWords.items[i].font.highlightColor = "#FFFF00"; 
 
          return createTimerPromise(1000).then(context.sync); 
 
         }) 
 
        }) 
 
      }) 
 
    }) 
 
     .catch(OfficeHelpers.Utilities.log); 
 

 
    function createTimerPromise(ms) { 
 
     return new OfficeExtension.Promise(function (resolve) { 
 
      setTimeout(resolve, ms); 
 
     }) 
 
    } 
 

 
    function forEach(collection, handler) { 
 
     var promise = new OfficeExtension.Promise(function (resolve) { resolve(); }); 
 
     collection.items.forEach(function (item, index) { 
 
      promise = promise.then(function() { 
 
       return handler(item, index); 
 
      }) 
 
     }); 
 
     return promise; 
 
    } 
 
}

関連する問題