当前位置: 首页 > 知识库问答 >
问题:

如何使用VBA调用Microsoft Graph API?

邓鸿雪
2023-03-14

问题

是否可以使用VBA代码调用Microsoft Graph API?

如果是,如何处理 O365 授权?我已经看到很多主题说在Microsoft Azure中创建一个应用程序以获取令牌,但我很惊讶我必须这样做以进行简单的本地使用。

我尝试了什么

在发现Microsoft Graph之后,我在Graph Explorer中尝试了这个API https://graph.microsoft.com/v1.0/planner/tasks

我能够在计划器中创建任务!

因此,在我看来,可以从直接在Outlook中执行的VBA代码调用此API。

我在Outlook中创建了此宏:

Sub TaskPlannerCreation()

    Dim PlannerService As New MSXML2.XMLHTTP60
    Dim sData As Variant

    sData = " { ""  ""planId"": ""K9Zv2QHm1U-GSAhd-PTGZfdFeOn"",""bucketId"": ""b6NVNiEIQkGZeBBzn7kWqJvAGvvs"",""title"": ""Outlook task"" } "

    With PlannerService
        .Open "POST", "https://graph.microsoft.com/v1.0/planner/tasks", False
        .setRequestHeader "Content-Type", "application/json"
        .setRequestHeader "Accept", "application/json"
        .setRequestHeader "User-Agent", "xx"
        .Send (sData)

我有一个授权错误

错误代码 401

12-03-2020更新:找到的解决方案,可以在调用图形资源管理器时获取图形API令牌分析URL(非常适合我):

Function GetToken()

    Dim xml As New MSXML2.XMLHTTP60
    Dim doc As MSHTML.HTMLDocument
    Dim urltoken As String

'copy paste the URL you see when calling Microsoft Graph Explorer and add prompt + domain_hint parameters
    urltoken = "https://login.microsoftonline.com/common/oauth2/v2.0/authorize?response_mode=form_post&nonce=graph_explorer&mkt=fr-FR&client_id={clientid}&response_type=token&scope=openid profile User.ReadWrite User.ReadBasic.All Sites.ReadWrite.All Contacts.ReadWrite People.Read Notes.ReadWrite.All Tasks.ReadWrite Mail.ReadWrite Files.ReadWrite.All Calendars.ReadWrite&prompt=none&domain_hint=organizations"

    xml.Open "GET", urltoken, False

    xml.Send

    If xml.readyState = 4 And xml.Status = 200 Then
        Set doc = New MSHTML.HTMLDocument
        doc.Body.innerHTML = xml.responseText

        GetToken = doc.getElementsByName("access_token")(0).Value

        sSuccess = True
    Else
         MsgBox "Error" & vbNewLine & "Ready state: " & xml.readyState & _
         vbNewLine & "HTTP request status: " & xml.Status
         sSuccess = False
    End If

    Set xml = Nothing

End Function

因此,使用 VBA 调用图形 API 是可能的:)

共有1个答案

壤驷鸿祯
2023-03-14

因此,您显示的代码仅部分正确。这是我发现实际有效的方法。(这是您提供的内容,因为我实际上找到了一个 Json 解析器来比 innerHTML 方法更好地处理数据,我还必须使用不同版本的 MSXML,因为您引用的那个不适合我。

Function GetToken()
    Dim xml As New MSXML2.XMLHTTP60
    Dim doc As MSHTML.HTMLDocument
    Dim urltoken As String

    'copy paste the URL you see when calling Microsoft Graph Explorer and add prompt + domain_hint parameters
    urltoken = "https://login.microsoftonline.com/{tenent id}/oauth2/v2.0/token"

    xml.Open "POST", urltoken, False

    xml.Send("client_id={clientid}&scope=https://graph.microsoft.com/.default&grant_type=client_credentials&client_secret=(cleint secret}")

    If xml.readyState = 4 And xml.Status = 200 Then
        Set doc = New MSHTML.HTMLDocument
        doc.Body.innerHTML = xml.responseText

        GetToken = doc.getElementsByName("access_token")(0).Value

        sSuccess = True
    Else
         MsgBox "Error" & vbNewLine & "Ready state: " & xml.readyState & _
         vbNewLine & "HTTP request status: " & xml.Status
         sSuccess = False
    End If

    Set xml = Nothing
End Function
 类似资料:
  • 本文向大家介绍使用VBA宏调用ABAP代码,包括了使用VBA宏调用ABAP代码的使用技巧和注意事项,需要的朋友参考一下 请尝试使用以下脚本-

  • 问题内容: 我需要根据通过Java从数据库中获取的数据生成Excel工作表。为此,我需要在生成Excel时调用一些VBA宏函数。有人可以帮助我如何从Java代码调用VBA宏吗? 问题答案: 我不太了解您从数据库中的数据生成Excel工作表的总体方法。通常,我会使用Vivek提出的Apache POI。 但是,如果您确实需要在工作表中调用Excel宏,则需要做两件事: 首先,您需要一个JAVA-CO

  • 我是vba新手,正在尝试使用vba和Excel创建。 我想创建像下面的图像作为输入表。 我试图添加、、、的行标签,值为、和。不为SHEET1生成任何透视表。

  • 我听说过很多关于在Excel VBA中使用的憎恶是可以理解的,但我不确定如何避免使用它。我发现,如果我能够使用变量而不是函数,那么我的代码将更加可重用。但是,如果不使用,我不确定如何引用东西(如等)。 我已经找到了这篇关于范围的文章和这个关于不使用select的好处的例子,但是我找不到任何关于如何使用的东西。

  • 本文向大家介绍如何使用JAVA调用SHELL,包括了如何使用JAVA调用SHELL的使用技巧和注意事项,需要的朋友参考一下 通过ProcessBuilder进行调度 这种方法比较直观,而且参数的设置也比较方便, 比如我在实践中的代码(我隐藏了部分业务代码): 这里有必要解释一下几个参数: RUNNING_SHELL_FILE:要运行的脚本 SHELL_FILE_DIR:要运行的脚本所在的目录; 当

  • 我知道这是一个基本的问题,但我就是无法解决它。 我下载了示例宁静项目(mvn原型宁静-junit-screenplay-原型)(https://www.youtube.com/watch?v=o-6CcDFn5Ug)在谷歌中搜索“BDD in Action”。 我使用Gradle进行编译: build.gradle 我更新了“SearchByKeywordStory”如下,以包括IEDriver和

  • 问题内容: 如何使用链接调用JavaScript代码? 问题答案: 要么 编辑: 上面的回答确实不是一个好的解决方案,自从我最初发布以来,已经学到了很多有关JS的知识.

  • 我正在使用spring rest示例代码。我想从代码中调用URL。我对Rest和Spring不熟悉。这是我的控制器 有模型课 当我调用url时localhost:8080/springrestexample/employees/出现了一些数据。现在我想修改这段代码。如果我调用上面的url,我想将页面重定向到另一个URL,如https://cp.lk/index.php/cbs/sms/send?