メールトリガーでUiPath Orchestratorのジョブを実行する方法

RPAエンジニア 大庭

普段の業務の中で、ある条件に当てはまるメールを受信したときにUiPath Orchestratorにある特定のプロセスのジョブを実行したい場合があると思います。今回はOutlook VBAを使ってメール受信をトリガーにしてジョブを実行する方法をご紹介します。

前提として、Microsoft Outlookでマクロを編集できるようにしておいたり、マクロに自己署名をつけておく必要があります。

メインのプロシージャのコードは下記のようになります。

Private Sub Application_NewMailEx(ByVal EntryIDCollection As String)

Const TASK_SUBJECT = "メールの件名"
Const PROCESS_NAME = "UiPath Orchestrator上のプロセス名"
Dim MailMessage
Dim Token As String, ReleaseKey As String

Set MailMessage = Session.GetItemFromID(EntryIDCollection)

If InStr(MailMessage.Subject, TASK_SUBJECT) <> 0 Then
    Token = UiPath_Authenticating 'アクセストークンを取得するプロシージャを実行して戻り値を格納
    ReleaseKey = UiPath_RequestReleaseKey(Token, PROCESS_NAME) 'リリースキーを取得するプロシージャを実行して戻り値を格納
    UiPath_StartJob Token, ReleaseKey 'ジョブの実行を命令するプロシージャを実行
End If

End Sub

このプロシージャは、指定したメールの件名が受信したメールの件名に含まれていたときに、指定したプロセス名のジョブを実行する命令をOrchestratorに対して行います。送信元を指定したり本文に特定の文字列が含まれている場合などを条件にしたいときはIf文の条件を適宜修正してください。

注意点として、このプロシージャはメールを受信したときに実行されるので、Outlookを常に起動させておく必要があります。

また、ジョブを実行するにはいくつかの段階を踏む必要があります。

  1. まず、アクセストークンを取得します(上記コードのUiPath_Authenticatingプロシージャ)。

  2. 次にそのアクセストークンでプロセスのリリースキーを取得します(上記コードのUiPath_RequestReleaseKeyプロシージャ)。

  3. 最後にアクセストークンとリリースキーでプロセスのジョブを実行する命令をします(上記コードのUiPath_StartJobプロシージャ)。

以下はそれぞれの段階に対応するプロシージャのコードです。

アクセストークンの取得(UiPath_Authenticating)

Function UiPath_Authenticating() As String

Dim sURL As String, sHTML As String, Body As String, Token As String
Dim oHttp As Object
Dim Doc, JsonObject

Set oHttp = CreateObject("MSXML2.ServerXMLHTTP")
sURL = "https://account.uipath.com/oauth/token"
oHttp.Open "POST", sURL, False
oHttp.setRequestHeader "Content-type", "application/json"
oHttp.setRequestHeader "X-UIPATH-TenantName", "テナント名"
Body = "{""grant_type"" : ""refresh_token"",""client_id"" : ""クライアントID"",""refresh_token"" : ""リフレッシュトークン""}"
oHttp.Send Body

sHTML = oHttp.ResponseText
Set Doc = CreateObject("HtmlFile")
Doc.Write "<script>document.JsonParse=function (s) {return eval('(' + s + ')');}</script>"
Set JsonObject = Doc.JsonParse(sHTML)
Token = CallByName(JsonObject, "access_token", VbGet)

UiPath_Authenticating = Token

End Function

トークン取得の要求を行い、その応答をJSONオブジェクトにしてその中からアクセストークンを取得しています。

リリースキーの取得(UiPath_RequestReleaseKey)

Function UiPath_RequestReleaseKey(ByVal Token As String, ByVal ProjectName As String) As String

Dim sURL As String, sHTML As String, Body As String, ReleaseKey As String
Dim oHttp As Object
Dim Doc, JsonObject, Value, item
Dim i As Long

Set oHttp = CreateObject("MSXML2.ServerXMLHTTP")
sURL = "リリースキー取得APIのURL"
oHttp.Open "GET", sURL, False
oHttp.setRequestHeader "Content-type", "application/json"
oHttp.setRequestHeader "X-UIPATH-TenantName", "テナント名"
oHttp.setRequestHeader "Authorization", "Bearer " & Token
oHttp.Send

sHTML = oHttp.ResponseText
Set Doc = CreateObject("HtmlFile")
Doc.Write "<script>document.JsonParse=function (s) {return eval('(' + s + ')');}</script>"
Set JsonObject = Doc.JsonParse(sHTML)
Set Value = CallByName(JsonObject, "value", VbGet)
For i = 0 To 100 'Orchestratorにあるプロセスが101個を超える場合は値を変更
    If CallByName(CallByName(Value, i, VbGet), "Name", VbGet) = ProjectName Then
        ReleaseKey = CallByName(CallByName(Value, i, VbGet), "Key", VbGet)
        Exit For
    End If
Next

UiPath_RequestReleaseKey = ReleaseKey

End Function

リクエストキー取得の要求を行い、その応答をJSONオブジェクトにします。For文でその中から指定したプロジェクト名のリリースキーを取得します。

ジョブの実行を命令(UiPath_StartJob)

Sub UiPath_StartJob(ByVal Token As String, ByVal ReleaseKey As String)

Dim sURL As String, sHTML As String, Body As String
Dim oHttp As Object

Set oHttp = CreateObject("MSXML2.ServerXMLHTTP")
sURL = "ジョブ実行APIのURL"
oHttp.Open "POST", sURL, False
oHttp.setRequestHeader "Content-type", "application/json"
oHttp.setRequestHeader "X-UIPATH-TenantName", "テナント名"
oHttp.setRequestHeader "Authorization", "Bearer " & Token
oHttp.setRequestHeader "X-UIPATH-FolderPath", "Orchestratorのプロセスがあるクラシックフォルダのパス"
oHttp.setRequestHeader "Content-type", "application/json"
Body = "{""startInfo"": {""RobotIds"": [],""Strategy"": ""All"",""ReleaseKey"": """ & ReleaseKey & """,""NoOfRobots"": 0}}"
oHttp.Send Body

sHTML = oHttp.ResponseText '必要に応じてログに出力する仕組みを導入する

End Sub

ジョブの実行を命令する要求を行います。必要に応じて応答を出力するプロシージャなどを作成してログとして出力します。

メールトリガーの仕組みを業務の効率化に活用していただければ幸いです。