Office.js开发Outlook加载项时cc.getAsync、to.getAsync调用无效问题
问题根因
cc.getAsync、to.getAsync调用后无可见效果,核心是两个问题:
- 两个接口返回的
asyncResult.value不是字符串类型,而是由收件人信息对象组成的数组,每个对象包含displayName(显示名)、emailAddress(邮箱地址)属性,直接将数组/对象插入HTML时,要么渲染为不可读的[object Object],要么因为格式问题没有可见内容。 - 代码没有添加失败分支的错误处理,权限不足、调用时机错误等问题导致的接口调用失败被完全忽略,看不到任何报错提示。
修复代码
获取抄送字段
const item = Office.context.mailbox.item; item.cc.getAsync(function (asyncResult) { if (asyncResult.status === Office.AsyncResultStatus.Failed) { const errMsg = `获取抄送失败:${asyncResult.error.message}`; console.error(errMsg); document.getElementById("message").innerHTML = `<h2 class="message">${errMsg}</h2>`; document.getElementById("message").style.visibility = "visible"; return; } // 解析收件人数组,拼接为可读字符串 const ccText = asyncResult.value .map(contact => `${contact.displayName} <${contact.emailAddress}>`) .join("; "); document.getElementById("message").innerHTML = `<h2 class="message">抄送:${ccText}</h2>`; document.getElementById("message").style.visibility = "visible"; });
获取收件人字段
const item = Office.context.mailbox.item; item.to.getAsync(function (asyncResult) { if (asyncResult.status === Office.AsyncResultStatus.Failed) { const errMsg = `获取收件人失败:${asyncResult.error.message}`; console.error(errMsg); document.getElementById("message").innerHTML = `<h2 class="message">${errMsg}</h2>`; document.getElementById("message").style.visibility = "visible"; return; } const toText = asyncResult.value .map(contact => `${contact.displayName} <${contact.emailAddress}>`) .join("; "); document.getElementById("message").innerHTML = `<h2 class="message">收件人:${toText}</h2>`; document.getElementById("message").style.visibility = "visible"; });
可正常运行的正文获取逻辑参考
你之前写的正文获取逻辑可以正常运行,本质是因为body.getAsync在指定Office.CoercionType.Html后返回的value就是可直接渲染的HTML字符串,不需要额外解析。
item.body.getAsync(Office.CoercionType.Html, function callback(result) { if (result.status === Office.AsyncResultStatus.Succeeded) { document.getElementById("message").innerHTML = `<h2 class="message">${result.value}</h2>`; document.getElementById("message").style.visibility = "visible"; } });
排查 Checklist
如果替换代码后仍无法正常获取,依次检查以下配置:
- 加载项清单文件中配置的权限等级至少为
ReadItem,如果需要在撰写场景下修改收件人信息,需要升级到ReadWriteItem权限。 - 所有Office JS API的调用必须放在
Office.onReady或Office.initialize的回调中执行,不要在页面脚本加载后立刻调用,否则会因为宿主未完成初始化导致接口无响应。 - 测试用的Outlook客户端版本支持1.1及以上的邮箱要求集,
to、cc字段的读取接口从1.1版本开始就已支持,排除过老客户端的兼容性问题。
内容的提问来源于stack exchange,提问作者tatsuki
相关产品推荐
相关产品推荐

