【UiPath】ワークフローの仕様をリバースエンジニアリング

# はじめに

- 本記事は、Studio ワークフローの仕様情報をリバースエンジニアリングしたい方向けのないようです。
- 記事の内容は、個人の見解または確認結果であり、UiPath の公式見解ではありません。
- 製品仕様や参考画像は 24.10 バージョンのもので構成しています。

# トピック一覧

```
# UiPathのワークフローをリバースエンジニアリングする方法
➀ フローのイメージ図 → シーケンス＞三点リーダー＞「イメージとして保存」
➁ 処理概要を起こす → 生成AI
➂ 構成Xamlと変数・引数をEXCEL出力 → UiPathProjectDocumentationHelper
➃ 構成Xamlとアクティビティ、変数・引数、外部呼出しなどをHTML出力 → PJDocument
```

# ➀ フローのイメージ図 → シーケンス＞三点リーダー＞「イメージとして保存」

文字だけだとわからん、フロー図が欲しいと言われたら ***シーケンス＞三点リーダー or 右クリック＞「イメージとして保存」！！***

![イメージ保存.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/371c2a81-344b-98cd-6a99-0a4f196a0a52.jpeg)

::: note
全展開すると高さが強烈なピクセルの画像ファイルになるので、適当に畳んだ状態で保存しましょう！
:::

# ➁ 処理概要を起こす → 生成AI

処理概要が欲しい場合は、Xamlファイルを渡して生成AIに作成してもらうのが一番です。
昔つくったクラウドOCの非稼働日カレンダーの操作ロボのXamlをもとに実際に生成AIが起こしてくれた処理概要は次の通りです↓↓

```
このXAMLファイルは、UiPathのワークフローを定義しており、特定のカレンダー操作を行うためのプロセスを記述しています。以下はその処理概要です。

1. **初期設定と変数の定義**:
   - ワークフローは、OrchestratorのURL、テナント名、実行したい内容、非稼働日カレンダーファイルのパス、カレンダーID、カレンダー名称などのプロパティを持っています。
   - いくつかの変数が定義されており、レスポンス、ステータスコード、トークン、リクエストボディなどが含まれます。

2. **トークンの取得**:
   - HTTPリクエストを使用して、Orchestratorからトークンを取得します。
   - ステータスコードが200の場合、レスポンスからトークンを抽出します。それ以外の場合は、エラーメッセージをログに記録します。

3. **カレンダー操作の選択**:
   - `実行したい内容`の値に基づいて、以下のいずれかの操作を行います:
     - **カレンダーIDの確認 (0)**:
       - Orchestratorからカレンダーの一覧を取得し、CSVファイルに書き出します。
     - **カレンダーの新規作成 (1)**:
       - 非稼働日カレンダーファイルを読み込み、カレンダーを新規作成するためのリクエストをOrchestratorに送信します。
     - **カレンダーの更新 (2)**:
       - 非稼働日カレンダーファイルを読み込み、既存のカレンダーを更新するためのリクエストをOrchestratorに送信します。
     - **カレンダーのダウンロード (3)**:
       - 指定されたカレンダーIDのカレンダーをOrchestratorから取得し、CSVファイルに書き出します。

4. **ログとエラーハンドリング**:
   - 各ステップで、ステータスコードやレスポンスをログに記録します。
   - エラーハンドリングが組み込まれており、例外が発生した場合は適切に処理されます。

このワークフローは、UiPath Orchestratorのカレンダー機能を操作するための自動化プロセスを提供します。
```

# ➂ 構成Xamlと変数・引数をEXCEL出力 → UiPathProjectDocumentationHelper

https://marketplace.uipath.com/listings/uipath-code-documentation-helper?searchId=c94584bb-00c8-4cc7-95f6-af38882235f4

![CodeDocHelper.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/8e2f17d7-b752-a064-b261-0d4ef3c540ac.jpeg)

このソリューションは、project.json ファイルの基本情報、フォルダー構造、およびすべてのワークフローの詳細 (ファイル名、タイプ、注釈、変数名とタイプ、引数名とタイプ) を含む Excel ファイルを提供します。

使い方：

1. コードをダウンロードして解凍します。
1. それを実行し、project.json が配置されているコード フォルダー パスを指定します。
1. プロセスが完了したら、DocumentationHelper フォルダー (C:\Users\UserName\Documents\DocumentationHelper) 内のファイルを確認します。

（出力EXCELイメージ - プロジェクト情報）
![CodeDocHelper_クラウドOCの非稼働日カレンダー操作.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/9e6329ba-4caf-246f-5d53-1d8c24f1e7a0.jpeg)

（出力EXCELイメージ - フォルダ構成）
![CodeDocHelper_クラウドOCの非稼働日カレンダー操作2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/ae822611-eb65-adf3-75e0-634fe4e99c05.jpeg)

（出力EXCELイメージ - ワークフロー）
![CodeDocHelper_クラウドOCの非稼働日カレンダー操作3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/21fdc1d0-ba66-7e13-6c66-8a51dc9c5678.jpeg)


# ➃ 構成Xamlとアクティビティ、変数・引数、外部呼出しなどをHTML出力 → PJDocument

https://marketplace.uipath.com/ja/listings/jpn4jogqcesx9gr9y37nz?searchId=198ab069-b306-4946-967f-96e432cc9ef3

![PJDoc.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/f1c5229c-f069-d116-756b-40fc40302235.jpeg)

プロジェクトで使用しているxamlファイル、アクティビティ、変数、引数・ワークフロー呼び出し・セレクタの一覧をHTML出力します。

使い方：

1. ワークフローファイル（PJDocument_1.2.0.xaml）をダウンロードしてプロジェクトフォルダに配置します。
1. ワークフロー呼び出しなどでPJDocument_1.2.0.xamlを実行します。 ※入力引数に仕様を書き起こしたいプロジェクトのパスを指定します。

::: note warn
手元の24.10.8の空プロジェクトではアセンブリの設定不足でエラーが出ていたので、名前空間とアセンブリセクションを次の様に変更しています。
```
  <TextExpression.NamespacesForImplementation>
    <scg:List x:TypeArguments="x:String" Capacity="66">
      <x:String>GlobalConstantsNamespace</x:String>
      <x:String>GlobalVariablesNamespace</x:String>
      <x:String>Microsoft.VisualBasic.Activities</x:String>
      <x:String>Microsoft.VisualBasic</x:String>
      <x:String>Newtonsoft.Json.Linq</x:String>
      <x:String>Newtonsoft.Json</x:String>
      <x:String>System.Activities.DynamicUpdate</x:String>
      <x:String>System.Activities.Expressions</x:String>
      <x:String>System.Activities.Statements</x:String>
      <x:String>System.Activities.Validation</x:String>
      <x:String>System.Activities.XamlIntegration</x:String>
      <x:String>System.Activities</x:String>
      <x:String>System.Collections.Generic</x:String>
      <x:String>System.Collections.ObjectModel</x:String>
      <x:String>System.Collections.Specialized</x:String>
      <x:String>System.Collections</x:String>
      <x:String>System.ComponentModel</x:String>
      <x:String>System.Data.DataTable</x:String>
      <x:String>System.Data</x:String>
      <x:String>System.Diagnostics</x:String>
      <x:String>System.Drawing</x:String>
      <x:String>System.Dynamic</x:String>
      <x:String>System.IO</x:String>
      <x:String>System.Linq</x:String>
      <x:String>System.Net.Mail</x:String>
      <x:String>System.Net</x:String>
      <x:String>System.Reflection</x:String>
      <x:String>System.Runtime.InteropServices</x:String>
      <x:String>System.Runtime.Serialization</x:String>
      <x:String>System.Text.RegularExpressions</x:String>
      <x:String>System.Text</x:String>
      <x:String>System.Web</x:String>
      <x:String>System.Windows.Annotations</x:String>
      <x:String>System.Windows.Forms.TreeNode</x:String>
      <x:String>System.Windows.Forms</x:String>
      <x:String>System.Windows.Markup</x:String>
      <x:String>System.Xml.Linq</x:String>
      <x:String>System.Xml.ReaderWriter</x:String>
      <x:String>System.Xml.Serialization</x:String>
      <x:String>System.Xml.XmlDocument</x:String>
      <x:String>System.Xml.XPath</x:String>
      <x:String>System.Xml</x:String>
      <x:String>System</x:String>
      <x:String>UiPath.Core.Activities</x:String>
      <x:String>UiPath.Core</x:String>
    </scg:List>
  </TextExpression.NamespacesForImplementation>
  <TextExpression.ReferencesForImplementation>
    <scg:List x:TypeArguments="AssemblyReference" Capacity="112">
      <AssemblyReference>Microsoft.Bcl.AsyncInterfaces</AssemblyReference>
      <AssemblyReference>Microsoft.VisualBasic</AssemblyReference>
      <AssemblyReference>mscorlib</AssemblyReference>
      <AssemblyReference>Newtonsoft.Json</AssemblyReference>
      <AssemblyReference>PresentationCore</AssemblyReference>
      <AssemblyReference>PresentationFramework</AssemblyReference>
      <AssemblyReference>System.Activities</AssemblyReference>
      <AssemblyReference>System.ComponentModel.TypeConverter</AssemblyReference>
      <AssemblyReference>System.Core</AssemblyReference>
      <AssemblyReference>System.Data.Common</AssemblyReference>
      <AssemblyReference>System.Data.DataSetExtensions</AssemblyReference>
      <AssemblyReference>System.Data.DataTable</AssemblyReference>
      <AssemblyReference>System.Data</AssemblyReference>
      <AssemblyReference>System.Drawing.Common</AssemblyReference>
      <AssemblyReference>System.Drawing.Primitives</AssemblyReference>
      <AssemblyReference>System.Drawing</AssemblyReference>
      <AssemblyReference>System.Linq</AssemblyReference>
      <AssemblyReference>System.Memory</AssemblyReference>
      <AssemblyReference>System.Net.Mail</AssemblyReference>
      <AssemblyReference>System.Net</AssemblyReference>
      <AssemblyReference>System.ObjectModel</AssemblyReference>
      <AssemblyReference>System.Private.CoreLib</AssemblyReference>
      <AssemblyReference>System.Private.DataContractSerialization</AssemblyReference>
      <AssemblyReference>System.Private.ServiceModel</AssemblyReference>
      <AssemblyReference>System.Private.xml</AssemblyReference>
      <AssemblyReference>System.Runtime.Serialization.Formatters</AssemblyReference>
      <AssemblyReference>System.Runtime.Serialization.Primitives</AssemblyReference>
      <AssemblyReference>System.Runtime.Serialization</AssemblyReference>
      <AssemblyReference>System.ServiceModel</AssemblyReference>
      <AssemblyReference>System.Text.RegularExpressions</AssemblyReference>
      <AssemblyReference>System.ValueTuple</AssemblyReference>
      <AssemblyReference>System.Web</AssemblyReference>
      <AssemblyReference>System.Windows.forms.TreeNode</AssemblyReference>
      <AssemblyReference>System.Windows.Forms</AssemblyReference>
      <AssemblyReference>System.Xaml</AssemblyReference>
      <AssemblyReference>System.Xml.Linq</AssemblyReference>
      <AssemblyReference>System.Xml.ReaderWriter</AssemblyReference>
      <AssemblyReference>System.Xml.XmlDocument</AssemblyReference>
      <AssemblyReference>System.Xml</AssemblyReference>
      <AssemblyReference>System</AssemblyReference>
      <AssemblyReference>UiPath.Studio.Constants</AssemblyReference>
      <AssemblyReference>UiPath.System.Activities.Design</AssemblyReference>
      <AssemblyReference>UiPath.System.Activities</AssemblyReference>
      <AssemblyReference>UiPath.UiAutomation.Activities</AssemblyReference>
      <AssemblyReference>WindowsBase</AssemblyReference>
    </scg:List>
  </TextExpression.ReferencesForImplementation>
```
NET5以降だと互換性がない？アセンブリの参照設定（System.Windows.forms）は入れているものの、TreeNodeメソッドだけはエラーを解消できませんでした。。。
このため、***アクティビティの表示名：「Invoke Code - set tree tag - invokeWorkflowFile」
の箇所はコメントアウト***して実行しています。

![PJDoc2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/1ea39787-fb80-6d7f-4793-e212fcce1a1e.jpeg)
:::

（出力HTMLイメージ - プロジェクト情報）
![PJDoc3.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/7b21d23f-47b8-1984-35eb-d4e98f03510e.jpeg)

（出力HTMLイメージ - ワークフロー）
![PJDoc4.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/7074a4ea-6e22-b930-176e-ab81e334ed80.jpeg)

（出力HTMLイメージ - 引数）
![PJDoc5.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/1fefb91d-6f34-618b-c7ae-043e5eb3c80e.jpeg)

（出力HTMLイメージ - 変数）
![PJDoc6.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/35b854d6-a03a-9274-bc52-a97399b36ff4.jpeg)

# さいごに
いかがでしたでしょうか。UiPathのワークフローは、個人的には最も可読性の高い作業指示書だとおもっており、仕様を確認したい場合、プロジェクトフォルダをそのまま送って欲しいと伝えます。RPAの功績って自動化よりも***作業を可視化したこと***の方が大きいのではないかとおもってます。
生成AI系はどこまでいってもロジックがブラックボックスなので、昨今はブームの去ったルールベースのロボットも良さが見直されてる気がします🤖