Office Word JS 在网页版 Office 上无法运行,但在桌面版 Word 上无法运行

问题描述 投票:0回答:1

以下功能在以下桌面版本的 Word(Microsoft® Word for Microsoft 365 MSO(版本 2309 Build 16.0.16827.20130)64 位)上运行良好。然而,在使用 Office 网络测试(尝试过 Google Chrome + Edge - 均更新到最新版本)时,它崩溃了。

该函数通过分割“.”来创建文档正文的句子。具有保护某些不应创建句子的地方的功能。

它在

console.log('break15.5')
之后和
console.log('break16')

之前就崩溃了

因此,问题出在两个 console.log 语句之间的

await context.sync()

我收到的错误代码是常见的 rich.api 错误,它对调试没有多大帮助。这是扩展错误代码(表明expandto函数有问题):

OfficeExtension.Error.debugInfo 了解更多信息。 ","errorLocation":"Range.expandTo","statement":"var ExpandTo42 = v43.expandTo(...);","surroundingStatements":["...","var v42 = context.root. _getObjectByReferenceId("{d347b1c8-cf0d-4ed2-a5ad-013d60035bba}{167}");","var ExpandTo41 = v42.expandTo(...);","// 实例化 {expandTo41}","expandTo41.load (["text"]);","var v43 = context.root._getObjectByReferenceId("{d347b1c8-cf0d-4ed2-a5ad-013d60035bba}{168}");","// >>>>>", "var ExpandTo42 = v43.expandTo(...);","// <<<<<","// Instantiate {expandTo42}","expandTo42.load(["text"]);","var v44 = context.root._getObjectByReferenceId("{d347b1c8-cf0d-4ed2-a5ad-013d60035bba}{169}");","var expandTo43 = v44.expandTo(...);","// Instantiate {expandTo43}","..."],"fullStatements":["var v = context.root._getObjectByReferenceId("{d347b1c8-cf0d-4ed2-a5ad-013d60035bba}{125}");","var v1 = context.root._getObjectByReferenceId("{d347b1c8-cf0d-4ed2-a5ad-013d60035bba}{126}");","var expandTo = v.expandTo(v1);","

如上所述,代码在桌面上运行良好,但在网络版 Office 上运行不佳。

请帮忙。

功能如下:(调试时请原谅console.log语句)

var global_sentences3_text = []
var global_sentences3_ranges = []
var global_sentences_real = null
var global_contract_body = null
async function realsentenizer() {
  await Word.run(async (context) => {
    const body = context.document.body.getRange();
    body.load("text");
    await context.sync();

    console.log('break1')
    //for sending entire body of text to api for analysis
    global_contract_body = body.text

    console.log('break2')

    ///PROTECTING DOTS///
    //making sure we are not splitting on period in these cases: "clause 5.6" or "registration no. 555", they need to be done sequentially so they do not catch the same words and thus at the end insert them again twice.
    var saved_text = []
    var ranges_to_protect = body.search("[0-9].[0-9]", {matchWildcards: true, matchCase: false})
    console.log('break3')
    ranges_to_protect.load('text')
    console.log('break4')
    await context.sync()
    console.log('break5')
    for (let i = 0; i < ranges_to_protect.items.length ; i++) {
      saved_text.push(ranges_to_protect.items[i].text)
      ranges_to_protect.items[i].insertText('[PROTECTEDDOT]','Replace')
    }
    console.log('break6')
    await context.sync()
    
    var saved_text2 = []
    var ranges_to_protect2 = body.search("[Nn][Oo].", {matchWildcards: true, matchCase: false})
    ranges_to_protect2.load('text')
    await context.sync()
    for (let i = 0; i < ranges_to_protect2.items.length ; i++) {
      saved_text2.push(ranges_to_protect2.items[i].text)
      ranges_to_protect2.items[i].insertText('[PROTECTEDDOT]','Replace')
    }
    await context.sync()
    console.log('break7')
    
    var saved_text3 = []
    var ranges_to_protect3 = body.search("[0-9].", {matchWildcards: true, matchCase: false})
    ranges_to_protect3.load('text')
    await context.sync()
    for (let i = 0; i < ranges_to_protect3.items.length ; i++) {
      saved_text3.push(ranges_to_protect3.items[i].text)
      ranges_to_protect3.items[i].insertText('[PROTECTEDDOT]','Replace')
    }
    await context.sync()
    console.log('break8')

    var saved_text4 = []
    var ranges_to_protect4 = body.search("[Cc][Ff].", {matchWildcards: true, matchCase: false})
    ranges_to_protect4.load('text')
    await context.sync()
    for (let i = 0; i < ranges_to_protect4.items.length ; i++) {
      saved_text4.push(ranges_to_protect4.items[i].text)
      ranges_to_protect4.items[i].insertText('[PROTECTEDDOT]','Replace')
    }
    await context.sync()
    console.log('break9')

    var saved_text6 = []
    var ranges_to_protect6 = body.search("[A-Za-z].[A-Za-z]", {matchWildcards: true, matchCase: false})
    ranges_to_protect6.load('text')
    await context.sync()
    for (let i = 0; i < ranges_to_protect6.items.length ; i++) {
      saved_text6.push(ranges_to_protect6.items[i].text)
      ranges_to_protect6.items[i].insertText('[PROTECTEDDOT]','Replace')
    }
    await context.sync()
    console.log('break10')

    ///PROTECTING DOTS///

    //replacing sentences with "whereas" + ";" or ":" with . so it doesnt create big introduction sentence that merges with the first clause. Using pseudo_sentences because it needs its own split on "." on body.getTextRanges()
    const pseudo_sentences = body.getTextRanges(["."], false)
    pseudo_sentences.load('text')
    await context.sync()

    console.log('break11')
    
    var ranges_to_protect5 = []
    var searched_ranges = null
    for (let i = 0; i < pseudo_sentences.items.length ; i++) {
      if (pseudo_sentences.items[i].text.toLowerCase().includes('whereas') && pseudo_sentences.items[i].text.includes(';')){
        searched_ranges = pseudo_sentences.items[i].search(";", {matchWildcards: true, matchCase: false})
        searched_ranges.load('text')
        await context.sync()
        for (let i = 0; i < searched_ranges.items.length ; i++) {
          ranges_to_protect5.push(searched_ranges.items[i])
          searched_ranges.items[i].insertText('.','Replace')
        }
      }
    }
    await context.sync();
    console.log('break12')

    //splitting bodytext on "."
    const sentences = body.getTextRanges(["."], false);
    sentences.load('text')
    global_sentences_real = sentences
    await context.sync()

    console.log('break13')

    //reinserting protected texts - important that it is here before looping through the pairs.
    for (let i = 0; i < ranges_to_protect.items.length ; i++) {
      ranges_to_protect.items[i].insertText(saved_text[i],'Replace')
    }
    for (let i = 0; i < ranges_to_protect2.items.length ; i++) {
      ranges_to_protect2.items[i].insertText(saved_text2[i],'Replace')
    }
    for (let i = 0; i < ranges_to_protect3.items.length ; i++) {
      ranges_to_protect3.items[i].insertText(saved_text3[i],'Replace')
    }
    for (let i = 0; i < ranges_to_protect4.items.length ; i++) {
      ranges_to_protect4.items[i].insertText(saved_text4[i],'Replace')
    }
    for (let i = 0; i < ranges_to_protect5.length ; i++) {
      ranges_to_protect5[i].insertText(";",'Replace')
    }
    for (let i = 0; i < ranges_to_protect6.items.length ; i++) {
      ranges_to_protect6.items[i].insertText(saved_text6[i],'Replace')
    }
    await context.sync() 

    console.log('break14')

    const new_ranges =[]
    let saved_range = sentences.items[0]
    let extended_range = {};

    console.log('break15')

    console.log(sentences.items.length)
    // Loop through the ranges, checking adjacent pairs
    for (let i = 1; i < sentences.items.length ; i++) {
      console.log(`ITERATION: ${i}`)
      console.log('for_start')
      if (sentences.items[i].text.includes(".") == false){
        console.log('if_1')
        extended_range = saved_range.expandTo(sentences.items[i])
        console.log('if_2')
        extended_range.load('text')
        console.log('if_3')
        saved_range = extended_range
        console.log('if_4')
      } else {
        extended_range = saved_range.expandTo(sentences.items[i])
        console.log('else_1')
        extended_range.load('text')
        console.log('else_2')
        new_ranges.push(extended_range)
        console.log('else_3')
        saved_range = sentences.items[i+1]
        console.log('else_4')
      }
      console.log('for_end')      
    }   
    console.log('LOOP END FULL')  
    new_ranges.push(saved_range)
    
    console.log('break15.5')
    await context.sync();
    
    console.log('break16')

    ///testing new catch headers logic ///

    //catching headers that are all uppercase
    var new_ranges2 = []
    for (let i = 0; i < new_ranges.length ; i++) {
      if (new_ranges[i].text.toUpperCase() == new_ranges[i].text){
        const new_range = new_ranges[i].expandTo(new_ranges[i+1])
        new_range.load('text')
        new_ranges2.push(new_range)
        i += 1
      } else {
        new_ranges[i].load('text')
        new_ranges2.push(new_ranges[i])
      }
    }
    await context.sync()

    console.log('break17')

    ///testing new catch headers logic ///

    for (let sentence of new_ranges2) {
      sentence.load('text')
      global_sentences3_text.push(sentence.text)
      sentence.track()
      global_sentences3_ranges.push(sentence)
    }
    await context.sync()
    
    for (let sentence of global_sentences3_text) {
      console.log(sentence)
    }

    console.log('break18')

    global_sentences_real.track()
    
  await context.sync()
  console.log('Succesfully sentenized')
  });
}
ms-word office-js office-addins word-addins word-web-addins
1个回答
0
投票

在前一个方法尚未完成之前,尽量不要再次调用

context.sync
方法。请参阅继续之前等待一个函数完成的正确方法?了解更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.