You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Jira REST API按邮箱查询用户名并在VBA创建Jira工单时用邮箱指定经办人

解决Jira REST API通过邮箱指定经办人/报告人及查询用户名的问题

我来帮你搞定这两个问题,刚好之前做过类似的场景适配:


1. 能不能直接通过邮箱指定经办人?

很遗憾,Jira REST API在创建工单(POST /rest/api/3/issue)时,assignee和reporter字段默认不支持直接传入邮箱地址,必须传入包含name(用户名)或accountId(用户唯一ID)的对象——这就是你收到assignee: expected Object containing a 'name' property错误的核心原因。

不过有个靠谱的间接方案:先通过邮箱地址查询到对应的用户信息(用户名/accountId),再把这个值传入创建工单的请求里,这也是生产环境中最稳妥的做法。


2. 如何通过Jira REST API根据邮箱查用户名?

你可以用Jira的用户查询接口来实现,常用的有两个:

接口1:精准匹配邮箱获取单个用户详情

调用GET /rest/api/3/user?emailAddress={你的邮箱地址},这个接口会返回匹配该邮箱的完整用户信息,包含name、accountId等关键字段。

接口2:模糊搜索匹配邮箱的用户

调用GET /rest/api/3/user/search?query={你的邮箱地址},适合需要模糊匹配的场景,若邮箱唯一则返回单个用户结果。

VBA代码示例(查询用户名)

下面是一段可直接复用的VBA代码,用来发送请求获取邮箱对应的用户名:

Function GetJiraUsernameByEmail(email As String, jiraBaseUrl As String, apiToken As String, jiraLoginEmail As String) As String
    Dim objHTTP As Object
    Dim responseText As String
    Dim jsonResult As Object
    
    Set objHTTP = CreateObject("MSXML2.XMLHTTP")
    ' 构造请求URL,对邮箱做URL编码避免特殊字符问题
    Dim requestUrl As String
    requestUrl = jiraBaseUrl & "/rest/api/3/user?emailAddress=" & URLEncode(email)
    
    With objHTTP
        .Open "GET", requestUrl, False
        ' Jira云版认证方式:邮箱+API Token转Base64
        .SetRequestHeader "Authorization", "Basic " & Base64Encode(jiraLoginEmail & ":" & apiToken)
        .SetRequestHeader "Content-Type", "application/json"
        .Send
        
        If .Status = 200 Then
            responseText = .responseText
            ' 解析JSON(需要导入VBA-JSON库,可从GitHub获取开源版本)
            Set jsonResult = JsonConverter.ParseJson(responseText)
            GetJiraUsernameByEmail = jsonResult("name") ' 返回用户名
            ' 也可以返回更稳定的accountId:jsonResult("accountId")
        Else
            GetJiraUsernameByEmail = ""
            MsgBox "用户查询失败:" & .Status & " " & .statusText
        End If
    End With
    
    Set objHTTP = Nothing
    Set jsonResult = Nothing
End Function

' 辅助函数:URL编码处理特殊字符
Function URLEncode(str As String) As String
    Dim objURL As Object
    Set objURL = CreateObject("Microsoft.XMLHTTP")
    objURL.Open "POST", "http://tempuri.org", False
    objURL.SetRequestHeader "Content-Type", "application/x-www-form-urlencoded"
    objURL.Send "x=" & str
    URLEncode = Mid(objURL.responseText, 3)
    Set objURL = Nothing
End Function

' 辅助函数:Base64编码用于Jira认证
Function Base64Encode(str As String) As String
    Dim objXML As Object, objNode As Object
    Set objXML = CreateObject("MSXML2.DOMDocument")
    Set objNode = objXML.createElement("b64")
    objNode.DataType = "bin.base64"
    objNode.nodeTypedValue = StrConv(str, vbFromUnicode)
    Base64Encode = objNode.Text
    Set objNode = Nothing
    Set objXML = Nothing
End Function

提示:这段代码需要依赖VBA-JSON库来解析JSON响应,你可以自行导入这个开源库到你的VBA项目中。


3. 修改你的创建工单代码

拿到用户名后,只需要在原有代码里加一步查询,再替换JSON模板中的变量即可:

' 先获取邮件发件人对应的Jira用户名
Dim assignUsername As String
assignUsername = GetJiraUsernameByEmail(OutlookMail.SenderEmailAddress, "https://你的Jira实例地址", "你的API Token", "你的Jira登录邮箱")

' 替换JSON模板中的@assignAlias,生成最终请求体
JSON = getJSON(CustomReplace(OutlookMail.Subject), CustomReplace(OutlookMail.Body), "Ticket", assignUsername, "")

如果你的Jira版本支持accountId(更推荐,因为用户名可能变更),可以在查询时返回accountId,然后修改JSON的assignee字段为:

"assignee": {
  "accountId": "@assignAccountId"
}

内容的提问来源于stack exchange,提问作者TedroyG

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 19:58:10