Office js 在Word.run流之外使用段落

Office js 在Word.run流之外使用段落,office-js,Office Js,我试图首先找到一个段落,然后当用户单击按钮时,对该段落进行一些操作 我试着使用迈克尔·兹拉特科夫斯基(MichaelZlatkovsky)的《构建办公室插件》(Building Office Addins)一书中的一个样本 var global_paragraph = undefined; async function analyzeDocument() { Word.run(async function(context) { const paragraphs = context.doc

我试图首先找到一个段落,然后当用户单击按钮时,对该段落进行一些操作

我试着使用迈克尔·兹拉特科夫斯基(MichaelZlatkovsky)的《构建办公室插件》(Building Office Addins)一书中的一个样本

var global_paragraph = undefined;
async function analyzeDocument() {
Word.run(async function(context) {
    const paragraphs = context.document.body.paragraphs;
    context.load(paragraphs, 'text');
    return context.sync().then(() => {
        for (let i = 0; i < paragraphs.items.length; i++) {
        if (/*some condition that works only once*/) {
          global_paragraph = paragraphs.items[i];
          global_paragraph.track();
        }
    };});
}).catch(handleError);
};
async function handleButtonClick() {
    OfficeExtension.config.extendedErrorLogging = true;
    Word.run(global_paragraph, async function(context) {
        global_paragraph.load("text");
        return context.sync().then(() => {
            /* do something */
        });
    }).catch(handleError);
};
var global\u段落=未定义;
异步函数analyzeDocument(){
运行(异步函数(上下文){
const段落=context.document.body.parages;
加载(段落,“文本”);
返回context.sync()。然后(()=>{
for(设i=0;i{
/*做点什么*/
});
}).接住(把手错误);
};
这导致了一个普遍的例外

{"code":"GeneralException","message":"GeneralException","errorLocation":"Document._GetObjectByReferenceId","statement":"var v=context.root._getObjectByReferenceId(\"p!00000DB2\");","surroundingStatements":["// >>>>>","var v=context.root._getObjectByReferenceId(\"p!00000DB2\");","// <<<<<","v.load([\"text\"]);"],"fullStatements":["var v=context.root._getObjectByReferenceId(\"p!00000DB2\");","v.load([\"text\"]);"]}

{“code”:“GeneralException”、“message”:“GeneralException”、“errorLocation”:“Document.\u GetObjectByReferenceId”、“statement”:“var v=context.root.\u GetObjectByReferenceId(\“p!00000DB2\”),“surroundingStatements:”[“/>>>>”,“var v=context.root.\u GetObjectByReferenceId(\“p!00000DB2\”);”,“/我能够在脚本实验室中重现您的问题

我相信问题不在于你的代码,而在于API这个词。好消息是有一个简单的解决方法,尽管我鼓励你无论如何都要提交一个bug,以确保产品团队能够对此进行调查

解决方案取代了

global_paragraph = paragraphs.items[i];
改为:

global_paragraph = paragraphs.items[i].getRange();
通过调用
getRange()
,它将创建一个具有正确标识的新对象,从而能够在以后跟踪它

我在Script Lab中使用的代码片段(实际上与您使用的相同)如下所示:

$("#button1").click(() => tryCatch(button1));
$("#button2").click(() => tryCatch(button2));

var global_paragraph: Word.Range;

async function button1() {
  await Word.run(async function(context) {
    const paragraphs = context.document.body.paragraphs;
    context.load(paragraphs, "text");
    return context.sync().then(() => {
      for (let i = 0; i < paragraphs.items.length; i++) {
        if (paragraphs.items[i].text.startsWith("Dear")) {
          global_paragraph = paragraphs.items[i].getRange();
          global_paragraph.track();
        }
      }
    });
  });
}

async function button2() {
  OfficeExtension.config.extendedErrorLogging = true;
  Word.run(global_paragraph, async function(context) {
    global_paragraph.load("text");
    return context.sync().then(() => {
      console.log(global_paragraph.text);
    });
  });
}

/** Default helper for invoking an action and handling errors. */
async function tryCatch(callback) {
  try {
    await callback();
  } catch (error) {
    // Note: In a production add-in, you'd want to notify the user through your add-in's UI.
    console.error(error);
  }
}

$(“#按钮1”)。单击(()=>tryCatch(按钮1));
$(“#按钮2”)。单击(()=>tryCatch(按钮2));
var全局_段:单词范围;
异步函数button1(){
等待Word.run(异步函数(上下文){
const段落=context.document.body.parages;
加载(段落,“文本”);
返回context.sync()。然后(()=>{
for(设i=0;i{
console.log(全局_段落文本);
});
});
}
/**用于调用操作和处理错误的默认帮助程序*/
异步函数tryCatch(回调){
试一试{
等待回调();
}捕获(错误){
//注意:在生产外接程序中,您希望通过外接程序的UI通知用户。
控制台错误(error);
}
}
(当然,还有对HTML的相应更改,以添加两个按钮):


按钮1
按钮2
希望这有帮助


~Michael

您的解决方案成功了,先生!添加了一个bug,请求报告此线程的修复情况。请参阅:。
<button id="button1" class="ms-Button">
    <span class="ms-Button-label">Button1</span>
</button>

<button id="button2" class="ms-Button">
    <span class="ms-Button-label">Button2</span>
</button>