天道酬勤,学无止境

How to get working Dialog API of OfficeJS API with Outlook 2016 desktop client

问题

我开发了一个使用 OfficeJS API 并希望在应用程序中实现 OAuth 的 Outlook 插件,API Documnetation 还说 Outlook 2016(桌面)支持要求集 1.1、1.2、1.3 和 1.4 但在我的情况下它保持沉默甚至不会引发错误. 在为 word 加载项运行工作对话框 api 示例时,我收到JavaScript 运行时错误: Unable to get property 'displayDialogAsync' of undefined or null reference

我正在使用 Microsoft Office Professional Plus 2016。

我编写的用于启动对话框的代码如下:

dialogTest() {
        const url = "https://login.microsoftonline.com/common/oauth2/v2.0/authorize?response_type=....";
        Office.context.ui.displayDialogAsync(url, { width: 15, height: 27, requireHTTPS: true }, function (asyncResult) {
            if (asyncResult.status !== Office.AsyncResultStatus.Succeeded) {
                // TODO: Handle error.
                return;
            }

            // Get the dialog and register event handlers.
            var dialog = asyncResult.value;
            dialog.addEventHandler(Microsoft.Office.WebExtension.EventType.DialogMessageReceived, function (asyncResult) {
                if (asyncResult.type !== Microsoft.Office.WebExtension.EventType.DialogMessageReceived) {
                    // TODO: Handle unknown message.
                    return;
                }

                // Parse the message.
                var data = JSON.parse(asyncResult.message);
                console.log('Hello #Office365Dev', data.name);

                // TODO: Do something with the data.

                // We got our data, time to close the dialog.
                dialog.close();
            });
        });
    }
回答1

看起来Office.contextui成员未定义或Office.js未正确加载。 尝试先查看这些:

  • Office.js javascript 是否正确加载?
  • 在你做某事之前,Office.initialize 回调是否设置好并执行?
  • 您的 Outlook 桌面 2016 版本是什么?

编辑: 2016 年 6 月与微软工程师讨论(这不是官方声明)。 dialogAPI支持的版本是 Office for Windows Desktop 2016(版本 16.0.6741.0000 或更高版本)。 这可能会改变。

  • 这段代码的结果是什么var result = Office.context.requirements.isSetSupported('DialogAPI', '1.4');

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • How to get working Dialog API of OfficeJS API with Outlook 2016 desktop client
    I developed a outlook add-in which using OfficeJS API and want to implement OAuth within app, also API Documnetation says Outlook 2016(Desktop) supports requirements set 1.1, 1.2, 1.3 & 1.4 but in my case it remains silent not even throws an error. While running working dialog api sample for word add-in i am getting JavaScript run-time error: Unable to get property 'displayDialogAsync' of undefined or null reference. I am using Microsoft Office Professional Plus 2016. Code I wrote to launch a dialog is below: dialogTest() { const url = "https://login.microsoftonline.com/common/oauth2/v2.0
  • OfficeJs: Outlook Addin: Dialog API's messageParent not working with OWA
    Background: I have an outlook addin which basically opens up a login dialog which opens up addin page hosted on my website from here user is redirected to auth0 from where he's redirected to login.live.com and post auth I get back either a code or an error back to another page again on my website. Now, everything works fine in the outlook thick client. When I close the dialog manually I get the right error code in parent. Problem: When using the OWA and hosting the addin code on my website, the control does not come back to the part from the dialog. I have already added all urls the user can
  • 2016 ProPlus MSI 版本 (MSO 16.0.4549.1000) 上的 Outlook 插件为 displayDialogAsync 提供“权限被拒绝”错误(Outlook Add-In on 2016 ProPlus MSI Version (MSO 16.0.4549.1000) gives "Permission Denied" error for displayDialogAsync)
    问题 I'm developing a new Outlook Add-In that uses displayDialogAsync to do authentication. We have several different client verions. It works fine on Outlook for Mac 2016 and Office 365 ProPlus Click-To-Run Version 1808 on Windows. But on Office 2016 ProPlus MSI Version (MSO 16.0.4549.1000) for windows, it gives the error "Permission Denied". Dialog API requirements sets page at https://docs.microsoft.com/en-us/office/dev/add-ins/reference/requirement-sets/dialog-api-requirement-sets says for Office 2016 or later on Windows (one-time purchase) with Build 16.0.4390.1000 or later, it should work
  • 在 Outlook Web 加载项中突然停止为发件人/来自对象提供电子邮件地址(In a outlook web add-in suddenly stops giving email address for sender/from object)
    问题 在我的 Outlook Web 插件中,它突然停止提供发件人对象的电子邮件地址,我的代码如下所示: isSentItem() { return Office.context.mailbox.userProfile.emailAddress === Office.context.mailbox.item.sender.emailAddress; } 我检查了控制台显示名称是正确的,但电子邮件地址没有填充: 我正在使用 cdn 托管的 o​​fficejs api: <script src="https://appsforoffice.microsoft.com/lib/1/hosted/office.js" type="text/javascript"></script> 当前版本的 officejs api 显示 /* Office JavaScript API library */ /* Version: 16.0.7805.1000 */ Outlook 客户端版本 - Outlook 2016 MSO (16.0.4498.1000) 32-bit 注意:我正在 SentItem 文件夹中的消息项上面运行一段代码。 对于收件箱中的消息工作正常。 回答1 例如,如果您在已发送邮件文件夹中运行此程序,则这是一个已知问题,正在解决中! 但是,对于发送给您的邮件
  • In a outlook web add-in suddenly stops giving email address for sender/from object
    In my outlook web addin it suddenly stops giving email address of from & sender object, My code looks like: isSentItem() { return Office.context.mailbox.userProfile.emailAddress === Office.context.mailbox.item.sender.emailAddress; } I checked in console display name is coming correct but email address not populating: I am using cdn hosted officejs api: <script src="https://appsforoffice.microsoft.com/lib/1/hosted/office.js" type="text/javascript"></script> Current version of officejs api shows /* Office JavaScript API library */ /* Version: 16.0.7805.1000 */ Outlook client version - Outlook
  • OfficeJS Outlook 加载项未安装(OfficeJS Outlook Add-in Does Not Install)
    问题 更新#1: TL;DR:我想针对: Outlook 2016 或更高版本 Web 上的 Outlook Mac 版 Outlook 2016 适用于 iOS 的 Outlook 适用于 Android 的 Outlook 我需要邮箱 1.5 才能支持调用 Outlook REST API 并支持可固定的任务窗格。 由于仅适用于 Windows 的 Outlook 2016 支持可固定任务窗格,并且邮箱 1.5 目前仅在 Web 上的 Outlook 中受支持,因此我需要在清单的<VersionOverrides>部分中设置邮箱 1.5。 根据验证报告: Your add-in manifest includes Tablet Settings and Phone Settings, however Mailbox 1.4 is used in the core of your manifest. This mailbox is not supported in the Outlook Web App. 这听起来与 Office 加载项主机和平台可用性所说的相冲突。 因此,我在清单的基本级别中设置了 Mailbox 1.3。 这是我的清单: <?xml version="1.0" encoding="UTF-8"?> <OfficeApp xmlns="http:/
  • 如何判断何时在 Outlook 加载项中使用 EWS 与 Rest API(How to tell when to use EWS vs rest API in Outlook Add-in)
    问题 是否可以在 XML 文件中或通过 OfficeJs 判断加载项是否可以使用 REST API 或是否需要使用较旧的 EWS API? 我们有一个 Outlook 加载项,需要通过独立的交换服务器支持 OWA/O365 和 Outlook 2016。 我们想知道是否可以通过清单 XML 文件或通过 OfficeJs 来检测用户帐户的配置,以便我们可以使用正确的 API 正确访问他们的内容。 我能看到的唯一替代方法是为此提供两个单独的加载项,但我认为 MS 有解决此问题的方法。 回答1 没有用于检测服务器版本的特定 API。 您可以通过检查Office.context.mailbox.restUrl的值来确定给定邮箱是否支持 REST。 如果这是本地安装,则不会返回值。 更新: 如果restUrl正在返回结果(即https://exch1.mailhost.com/api ),那么 REST 应该可用并且可以开始使用 Outlook REST API。
  • How to tell when to use EWS vs rest API in Outlook Add-in
    Is it possible to tell either in the XML file or through OfficeJs if the add-in can use the REST API or if it needs to use the older EWS API? We have an Outlook add-in that needs to support OWA/O365 and Outlook 2016 with a stand alone exchange server. We are wondering if it is possible through the manifest XML file or through OfficeJs to detect the configuration of users account so we can properly access their content with the correct API. The only alternative I can see is to provide two separate add-ins for this, but I assume MS has a solution to this issue.
  • How to save a file in Outlook from Add-in [taskpane or otherwise]?
    I have built an Office/Outlook add-in that interacts with my user's email messages. I have the need/requirement to build/create and save a file to the desktop for my add-in user. I have tried various methods with typical JavaScript solutions for the web. These solutions work only when the add-in is being used through OWA. These solutions also test successfully in Safari, FF, Chrome, etc ... but will not work in Outlook for Mac/Windows. I have been searching [unsuccessfully,] the OfficeJS API documentation for a possible API method to save a file instead of writing my own in JavaScript. Does
  • 如何从加载项 [任务窗格或其他] 在 Outlook 中保存文件?(How to save a file in Outlook from Add-in [taskpane or otherwise]?)
    问题 我已经构建了一个与用户的电子邮件交互的 Office/Outlook 加载项。 我需要/要求为我的加载项用户构建/创建文件并将其保存到桌面。 我已经尝试了各种方法和典型的网络 JavaScript 解决方案。 这些解决方案仅在通过 OWA 使用加载项时才有效。 这些解决方案还在 Safari、FF、Chrome 等中成功测试……但在 Outlook for Mac/Windows 中不起作用。 我一直在 [未成功] OfficeJS API 文档中搜索可能的 API 方法来保存文件,而不是用 JavaScript 编写我自己的方法。 这样的事情存在吗? Outlook 加载项能否从“Outlook for Mac/Windows”中为用户创建文件并将其保存到桌面? 编辑:虽然这里的文档(https://docs.microsoft.com/en-us/office/dev/add-ins/concepts/browsers-used-by-office-web-add-ins)建议(例如) Outlook for Mac 正在运行嵌入式 safari……它似乎是一个更加锁定的 Safari 沙盒版本。 这让我想到了一个假设,再多的自定义 JavaScript 也不会让我实现我的功能。 注意:WRT 实现我自己的 JS 来下载文件(仍然不成功,也许这里的某个地方存在有效的
  • OfficeJS Outlook Add-in Does Not Install
    UPDATE #1: TL;DR: I want to target: Outlook 2016 or later Outlook on the Web Outlook 2016 for Mac Outlook for iOS Outlook for Android I require Mailbox 1.5 in order to support calling the Outlook REST APIs and to support pinnable taskpanes. Since pinnable taskpanes are only supported in Outlook 2016 for Windows, and because Mailbox 1.5 is currently only supported in Outlook on the Web, I will need to set Mailbox 1.5 in the <VersionOverrides> sections of the manifest. Based on the validation report: Your add-in manifest includes Tablet Settings and Phone Settings, however Mailbox 1.4 is used in
  • How can we force a mailbox item to be persisted to EWS?
    Note: This particular issue has significant impact on our customers, which translates to high business impact with direct consequences on revenue. TL;DR. How can our Office add-in for Outlook, when a user interacts with our add-in while composing an email draft, minimize the amount of time it takes before the EWS GetItem API will return an OK response for the itemId we receive from Office.context.mailbox.item.saveAsync()? If it turns out that our add-in has no control over when the item will be persisted to EWS, then what could an end-user do to speed this up? We are looking for either (a) a
  • Outlook Add-In on 2016 ProPlus MSI Version (MSO 16.0.4549.1000) gives "Permission Denied" error for displayDialogAsync
    I'm developing a new Outlook Add-In that uses displayDialogAsync to do authentication. We have several different client verions. It works fine on Outlook for Mac 2016 and Office 365 ProPlus Click-To-Run Version 1808 on Windows. But on Office 2016 ProPlus MSI Version (MSO 16.0.4549.1000) for windows, it gives the error "Permission Denied". Dialog API requirements sets page at https://docs.microsoft.com/en-us/office/dev/add-ins/reference/requirement-sets/dialog-api-requirement-sets says for Office 2016 or later on Windows (one-time purchase) with Build 16.0.4390.1000 or later, it should work
  • Office.context.ui.displayDialogAsync 引发 5001 内部错误(Office.context.ui.displayDialogAsync throws 5001 Internal Error)
    问题 我正在使用 Visual Studio 项目模板创建一个新的 Outlook 邮件加载项,我在其中获得了一个示例,其中显示了当前所选电子邮件的属性。 我添加了一个带有单击事件处理程序的按钮,以使用以下代码打开一个对话框: $('#clickMeButton').click(function () { Office.context.ui.displayDialogAsync('https://localhost/OutlookAddinTest/MessageDialog.html', { height: 40, width: 40, requireHTTPS: true }, function (result) { _dlg = result.value; _dlg.addEventHandler(Microsoft.Office.WebExtension.EventType.DialogMessageReceived, dialogMessageReceived); }); }); 我正在使用 Chrome 中的 Outlook Web 客户端对此进行调试: 我不知道它是否与此错误有关,但是在我单击 clickMeButton 之前,我可以在网站加载后看到以下错误: osfruntime.js:13 Error while parsing the 'sandbox'
  • 我们如何强制将邮箱项目持久化到 EWS?(How can we force a mailbox item to be persisted to EWS?)
    问题 注意:这个特殊问题对我们的客户有重大影响,这会转化为对收入产生直接影响的高业务影响。 TL;博士。 当用户在撰写电子邮件草稿时与我们的加载项交互时,我们的 Outlook Office 加载项如何最大限度地减少EWS GetItem API为我们从Office.context.mailbox.item.saveAsync()收到的itemId返回 OK 响应之前所需的时间Office.context.mailbox.item.saveAsync() ? 如果事实证明我们的加载项无法控制项目何时将持久保存到 EWS,那么最终用户可以做些什么来加快速度? 我们正在寻找 (a) 技术解决方案或 (b) 消息来指导我们的客户如何缓解/修复/解决此问题。 最终用户影响 我们的一些客户无法使用我们的 Outlook Office 加载项发送电子邮件,或者必须等待很长时间(> 2 分钟)才能发送电子邮件。 我们的目标 我们希望所有客户都能够使用我们的加载项发送电子邮件,而无需等待不合理的时间。 附加上下文 根据我们的日志和客户报告,此问题仅存在于Outlook 2016 for Windows桌面应用程序中。 我们没有证据表明该问题存在于任何其他版本的 Outlook 中,包括 Outlook 2013 或 Outlook for Mac,但该问题也可能存在于这些客户端中。 我们的插件概述
  • Outlook API 1.3 version not showing on Outlook Desktop Professional Plus 2016
    On this page https://github.com/OfficeDev/office-js-docs/blob/master/reference/outlook/tutorial-api-requirement-sets.md it is specified that both Outlook 2016 (MSI) for Windows and Outlook 2013 for Windows support Outlook API up to Version 1.4, but when we try to increase the minimal version in the manifest from 1.1 to 1.3, the addin works fine on web but does not show on both desktop versions. Currently I am working on Outlook Professional Plus 2016 with build number 16.0.4312.100, 64bit on Windows 10. I am trying a simple addin generated by yeoman office-generator, with only change is the
  • Outlook API 1.3 版本未在 Outlook Desktop Professional Plus 2016 上显示(Outlook API 1.3 version not showing on Outlook Desktop Professional Plus 2016)
    问题 在此页面 https://github.com/OfficeDev/office-js-docs/blob/master/reference/outlook/tutorial-api-requirement-sets.md 指定 Outlook 2016 (MSI) for Windows 和 Outlook 2013 for Windows 支持 Outlook API 最高版本 1.4,但是当我们尝试将清单中的最小版本从 1.1 增加到 1.3 时,该插件在 Web 上运行良好,但在两个桌面版本上都无法显示。 目前我正在开发 Outlook Professional Plus 2016,内部版本号为 16.0.4312.100,Windows 10 上的 64 位。 我正在尝试由 yeoman office-generator 生成的简单插件,唯一的变化是从 1.1 到 1.3 的最小版本 谢谢。 更新 提供的内部版本号是错误的,内部版本号是 16.0.4312.1000。 这是我获得内部版本号的屏幕截图 https://imgur.com/a/P5iQh
  • Outlook Javascript API - window.open 不适用于 Outlook 2016 桌面/Windows(Outlook Javascript API - window.open not working from Outlook 2016 Desktop/Windows)
    问题 我有一个用新的 JavaScript API 编写的 Office 插件,在它里面,我有一个 JS 函数,它经过一些逻辑后使用window.open(url, '_blank')在新窗口中打开一个 web 应用程序 当从 Outlook Web 中的加载项窗格中调用它时, localhost托管加载项以及在 heroku 上部署后都可以工作。 但是,当从命令(功能区上的加载项按钮)调用时,它仅在加载项托管在本地主机上时才有效,在我将其部署到 heroku 后,加载项工作,在功能区中显示命令,执行 JS 逻辑,但window.open什么也不做。 看起来打开新窗口的唯一方法是使用Office.context.ui.displayDialogAsync但即使如此,它也只有在页面与加载项代码位于同一源时才有效。 我认为有一些安全限制,但是为什么在本地主机上托管时它会起作用? 有什么办法可以使用新的 Javascript API 从 Outlook 中的命令打开浏览器窗口吗? 回答1 我的经验是window.open在不同的平台上并不是始终可靠的,这迫使您使用Office.context.ui.displayDialogAsync 。 正如您所提到的,如果您尝试打开不在您的域中的页面,它会对您大惊小怪。 我发现有几种方法可以解决这个问题,具体取决于您的使用场景: 您可以更新清单的
  • Outlook Javascript API - window.open not working from Outlook 2016 Desktop/Windows
    I have an Office Add-In written in the new JavaScript API, inside of it, I have a JS function which after some logic opens a web app in a new window using window.open(url, '_blank') It works when called from the add-in pane in Outlook Web in both, localhost hosted add-in, as well as after deployment on heroku. However when called from a command (add-in button on ribbon) it works only when the add-in is hosted on localhost, after I deploy it on heroku, the add-in works, shows commands in the ribbon, performs the JS logic, but window.open does nothing. Looks like the only way to open a new
  • In Excel Online, OfficeJS API is not passing the host_Info_ parameter anymore to Excel Add-In
    问题 我不知道这种情况何时开始发生,或者情况是否发生了变化,但框架没有将_host_Info参数传递给我在 Excel Online 中的 Excel 加载项。 它传递了一个空的"et="参数,在这种情况下是可以的,因为我处于开发模式。 Excel 桌面客户端仍在通过它。 这是我的加载项在 Excel Online 和 Excel for Windows 之间切换功能所必需的。 我检查了文档,找不到任何改变。 回答1 为了附加到 Sudhi 的答案:官方 API 根据 Sudhi 的答案中的链接提供,我们已经继续并在 OfficeJsHelpers 库中为 API 添加了一个“垫片”。 shim 仍然使用 Sudhi 提到的解决方法代码——window.sessionStorage window.sessionStorage['hostInfoValue'] ——但它将它包装在一个非常类似于官方 Office.js 中的 API 中。 一旦官方 API 可用,我们将切换 shim 代码以使用它。 这种方法的美妙之处在于,如果您通过 NPM 包使用 OfficeJsHelpers,您所要做的就是更新您的包依赖项,然后您会突然从一个非官方且可能脆弱的解决方法转变为 100% 官方依赖的 API -暴露的属性——所有这些都无需更改您自己的代码! 同样,如果那时您决定切换回使用官方