Office js 跟踪在Word Online中抛出错误的对象

Office js 跟踪在Word Online中抛出错误的对象,office-js,Office Js,我目前正在开发一个外接程序,它利用文本到语音来说出文档中的每个句子。我使用被跟踪的对象来跟踪句子,因为它们需要一个接一个地说出 当试图通过加载和访问“font.color”属性来更改句子突出显示的字体颜色时,会出现问题。这将在桌面上工作,但会联机引发以下错误: 调试信息:{code:GeneralException,消息:无法读取null的属性'gO',errorLocation:Range.\u onAccess} 以下是重现问题的最低代码: ... var sentences; ... W

我目前正在开发一个外接程序,它利用文本到语音来说出文档中的每个句子。我使用被跟踪的对象来跟踪句子,因为它们需要一个接一个地说出

当试图通过加载和访问“font.color”属性来更改句子突出显示的字体颜色时,会出现问题。这将在桌面上工作,但会联机引发以下错误:

调试信息:{code:GeneralException,消息:无法读取null的属性'gO',errorLocation:Range.\u 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();

当代码在桌面上工作,但在Office Online上失败时,特别是当错误是关于空对象时,问题通常是承诺链断裂。在桌面上,外接程序和单词host之间的往返是本地的;所以asnyc方法完成得非常快。在这种情况下,即使有一个断开的承诺链,它们也可能以所需的顺序完成。但是使用OfficeOnline,这些方法需要更长的时间才能运行,如果链断了,那么一些后续方法可能会在早期方法完成之前完成

很难遵循承诺链,因为您在之前是否放置换行符的问题上不一致。然后,有时您调用context.sync,但有时您只是在一个then中引用context.sync。但我认为你的问题是因为承诺链断裂

还有,你的函数语句{…代码在Word.run结束后运行。我想你不是有意的,是吗?你不想让这个代码在Word.run里面吗

编辑:一位Microsoft工程师尝试了以下版本,并表示当按顺序调用这两个部分时,它可以在Word Online中工作。这表明代码的第二部分必须位于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();
        });
    });

我认为您可以在不跟踪对象的情况下解决您的场景,这真的不需要,这只是使用承诺遍历一系列范围。请查看此替代方案:我添加了一个计时器,您可以使用它来调整要突出显示每个句子的时间

功能性强光句{ Word.runfunction上下文{ var myPars=context.document.body.parations; context.loadmyPars; 返回context.sync .Then函数{ var myWords=myPars.items[0]。拆分[,!,?],true/*用于修剪分隔符*/,true/*用于修剪空格*/; context.loadmyWords,{expand:'font'}; 返回context.sync .Then函数{ 返回forEachmyWords,函数项,i{ 如果i>=1{ myWords.items[i-1].font.highlightColor=FFFFFF; } myWords.items[i].font.highlightColor=FFFF00; 返回createTimerPromise1000.thencontext.sync; } } } } .catchOfficeHelpers.Utilities.log; 函数createTimerPromisems{ 返回新的OfficeExtension.Promisefunction解析{ setTimeoutresolve,毫秒; } } 函数forEachcollection,handler{ var promise=newofficeextension.Promisefunction resolve{resolve;}; collection.items.forEachfunction项,索引{ promise=promise.net函数{ 返回handleritem,索引; } }; 回报承诺; }
}这是有意的,它在Word.Run之外,就像在用例中一样,我希望在说出下一个句子并访问它的字体属性之前完成“Word.Run”的执行,因此我使用跟踪对象,以便可以在它之外使用“句子”。上面的代码只显示正在使用的单个句子,但实际上我使用的是speech.onen ca“返回以迭代每个句子。@Daniel使用Microsoft工程师提供的代码查看我的编辑。”。