如何通过Jira REST API按邮箱查询用户名并在VBA创建Jira工单时用邮箱指定经办人
我来帮你搞定这两个问题,刚好之前做过类似的场景适配:
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

