如何从任务窗格向新建邮件传递数据?
解决方案
直接解决方法说明
目前Office JavaScript API没有提供直接机制,能让任务窗格的数据直接传递到新邮件的OnNewMessageCompose事件上下文——因为任务窗格和新邮件编辑器属于隔离的运行环境,无法直接共享内存数据。
最佳替代方案
通过唯一标识符关联临时存储数据与新邮件自定义属性的方式解决,具体步骤如下:
1. 生成唯一关联ID
在调用displayNewMessageFormAsync()前,生成一个全局唯一的UUID(避免多次快速调用时数据混淆)。示例代码:
function generateUUID() { return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8); return v.toString(16); }); }
2. 临时存储任务窗格数据
将UUID作为键,任务窗格的数据作为值,存储到sessionStorage(仅当前会话有效,适合临时数据)或Office.context.roamingSettings(跨设备同步)中。示例:
const taskPaneData = { /* 你的任务窗格数据对象 */ }; const dataId = generateUUID(); // 使用sessionStorage存储 sessionStorage.setItem(`TaskPaneData_${dataId}`, JSON.stringify(taskPaneData)); // 或使用Office自定义设置(需调用saveAsync持久化) Office.context.roamingSettings.set(`TaskPaneData_${dataId}`, taskPaneData); Office.context.roamingSettings.saveAsync();
3. 创建新邮件时添加自定义属性
调用displayNewMessageFormAsync()时,通过options.itemProperties参数给新邮件添加自定义属性,将UUID存入其中:
Office.context.mailbox.displayNewMessageFormAsync( { itemProperties: { // 添加自定义属性,键名可自定义,比如TaskPaneDataId TaskPaneDataId: dataId } }, function(asyncResult) { if (asyncResult.status === Office.AsyncResultStatus.Failed) { // 处理创建失败的情况,同时清理临时存储的数据 sessionStorage.removeItem(`TaskPaneData_${dataId}`); Office.context.roamingSettings.remove(`TaskPaneData_${dataId}`); Office.context.roamingSettings.saveAsync(); } } );
4. 在OnNewMessageCompose事件中获取数据
在新邮件的OnNewMessageCompose事件回调里,先读取邮件的自定义属性拿到UUID,再从临时存储中取出对应数据:
Office.actions.associate('OnNewMessageCompose', function(event) { Office.context.mailbox.item.loadCustomPropertiesAsync(function(asyncResult) { const customProps = asyncResult.value; const dataId = customProps.get('TaskPaneDataId'); if (dataId) { // 从sessionStorage读取数据 const storedDataStr = sessionStorage.getItem(`TaskPaneData_${dataId}`); const taskPaneData = JSON.parse(storedDataStr); // 或从Office自定义设置读取 // const taskPaneData = Office.context.roamingSettings.get(`TaskPaneData_${dataId}`); // 这里处理你的数据逻辑 console.log('获取到任务窗格数据:', taskPaneData); // 处理完成后建议清理临时存储,避免冗余 sessionStorage.removeItem(`TaskPaneData_${dataId}`); Office.context.roamingSettings.remove(`TaskPaneData_${dataId}`); Office.context.roamingSettings.saveAsync(); } event.completed(); }); });
方案优势
- 确保每封新邮件对应唯一的任务窗格数据,不会因多次快速调用混淆
- 临时数据可选择会话级存储(sessionStorage),自动随浏览器会话结束清除,无残留
- 利用邮件自定义属性传递关联ID,符合Office JS的规范,兼容性好
内容的提问来源于stack exchange,提问作者John Evans Solachuk
相关产品推荐
相关产品推荐

