3.A.6.2. DataTableの作成

ファイルに移る前に、もう1つのステップが必要です。ワークフロー実行後に Log Excel ファイルが保存されるため、処理中のデータを格納する Datatable を作成する必要があります。これは、ワークフローの時点で作成され、グローバルに値を保存します。

このトピックは、このドキュメントの他の例ですでにカバーされています。Create an Empty DataTableに従って、変数の名前が同じでないことに留意してください。

3.A.6.3. ディレクトリ内のファイルに対する反復処理

タスクはルートディレクトリの各ファイルを分類することであるため、それらを繰り返し処理することが必要である。

ユーザーは、ForEachWithBodyFactor<>アクティビティをメインシーケンスにドラッグして、DataTableの作成の下に置きます。最初のフィールドには、ディレクトリ内の各ファイルを表す “item “という単語が表示されます。この名前は変更可能で、どんな名前でも大丈夫です。

最も重要なのは、2番目のフィールド(”in”)である。ここでユーザーは、System.IO.Directory.GetFiles(path)という式を入力します。ここで「path」は、メインシーケンスの最初にルートディレクトリのパスで既に設定されているArgument(「パス」)です。この式は、そのディレクトリにあるファイルのフルパスのリストを返します。したがって、ForEachアクティビティはこのリストに対して反復処理を行います。

images/openrpa_manipulatingfiles_iteratedirectory.png

3番目のフィールドはBodyで、リストの各ファイルに対してActivityが実行される場所です。このBodyの中では、以下のActivityが実行される。

3.A.6.4. ファイル名を取得する

Body内部の最初のActivityは、ファイルの名前を取得することになります。System.IO.Directory.GetFiles()式は、フルパスのリストを返すことに注意してください。後のActivityに進むには、ユーザーはファイル名だけを取得する必要があります。

それを実現する最もシンプルな方法は、VBエクスプレッションを使うことです。ユーザーはAssignActivityをBodyにドラッグします。この例では、Variableの名前は「file_name」になります。式はSystem.IO.Path.GetFileName()で、ファイルのフルパスは括弧の中、つまり Variable “item” の中に挿入しなければなりません。

備考

この値は反復処理のファイルに応じて変更されるため、ユーザーは引数ではなく、変数を使用する必要があります。このVariableのスコープは、ForEachWithBodyFactor<>(ここでは「Iterate over files」という名前)のBodyの中のSequenceでなければならないことに注意してください。このVariableのタイプは “string “である。

images/openrpa_manipulatingfiles_getfilename.png

3.A.6.5. Extensionに従ってファイルを分割する

その後、ユーザーは最後のステップのすぐ後に、IfActivityをドラッグすることになります。ここでは、ファイルを拡張子によって分離することを考えます。この例では、.txtファイルだけが読み込まれるため、他の拡張子は考慮されません。

条件」フィールドに、System.IO.Path.GetExtension(file_name OR full path) = ".txt "と入力します。

備考

ファイルの拡張子を取得する方法は、これだけではありません。ユーザーは、「file_name.EndsWith(“.txt”)」というVB式を使用することもできます。この式は、文字列の中にある文字列を探すので、引用符で囲む必要があることに注意してください。

つまり、ファイルの拡張子が「.txt」であれば、ロボットは「Then」フィールドに進み、そうでなければ、「Else」フィールドに進むことになる。

3.A.6.6. ファイルを読む

ここでは、Sequenceを2つに分割しています。まず、テキストファイルがどうなるかを考えてみましょう。

テキストファイルで実行される最初のアクティビティは、その内容を読み取ることです。ここでも、ユーザーはAssignActivityを「Then」フィールドにドラッグし、Variableを使用します。この例では、Variableの名前は「content」、タイプは「string」です。

ファイルを読み込むための式はSystem.IO.File.ReadAllText(file_name) を使用します。内容は、割り当てられたVariableに格納されます。

images/openrpa_manipulatingfiles_readfile.png

備考

この例では、.txtでないものを削除します。このチュートリアルでさらに説明します。

3.A.6.7. ファイル作成日を取得する

次に、ファイルの作成日を取得します。この手順は、前の手順(Read File)とよく似ています。つまり、ユーザーはAssignActivityを使って、VB式の内容を保存することになります。

この場合、式はSystem.IO.File.GetCreationTime(file_name).ToShortTimeString となります。

images/openrpa_manipulatingfiles_getcreationdate.png

備考

ここでは、他の可能性もある。ユーザーは、時間、日、月、あるいは、ファイルの作成に関するその他の情報を取得することができます。これを行うには、ユーザーは式の最後の部分を必要な情報の種類に変更する必要があります(例えば、System.IO.File.GetCreationTime(file_name).Month)。

3.A.6.8. ファイルの内容(マッチング)を確認し、情報を抽出する

この例では、ファイルを移動する前に、テキストファイルから情報を抽出してログファイルに追加するためのアクションがいくつか追加されています。Matchesアクティビティが採用され、ユーザーはその3つのプロパティに注目する必要があります。「入力」、「パターン」、「結果」です。

最初の “Input “は、”Pattern “の検索対象となる文字列または文字列を格納するVariableである。この場合、値はファイルの内容に対応する “content “変数である必要がある。

“パターン “は、”入力 “内の文字列から検索されるRegEx式です(引用符で囲まれている必要があることに注意してください)。

最後に、”Results “は結果が格納されるVariableまたはArgumentです(この場合、Variableでなければなりません)。

この Variable の型はSystem.Text.RegularExpressions.Match でなければならないことにユーザーは注意しなければならない。これは、結果のリストになります。この例では、マッチごとに1つの結果のみが存在することになります。この結果を得るために、ユーザーは次の構文を使用する必要があります: variablename.First.ToString, つまり、リストの最初のアイテムは文字列に変換されます。

3.A.6.9. ファイルを移動する

これらの手順が完了すると、ロボットはファイルを内容に応じて分類する。この例では、製品情報があるかどうかが基準になっています。

ユーザーは、このSequenceに別のIfActivityをドラッグします(前のIf文のBody)。ここでは、ファイルの内容を格納する変数「content」が使用されます。メソッドは.Contains("string")で、構文は次のとおりです。content.Contains("product").

備考

なお、検索される語句は文字列であるため、引用符で囲まなければならない。

もし、そのような用語があれば、ロボットは「Then」フィールドに進み、そうでなければ、「Else」フィールドに進みます。つまり、このActivityは、ファイルを2つのカテゴリに分類しているのです。これは簡単な例ですが、より複雑な用語を検索することもできます。

最初の可能性(ファイルに製品情報がある)を考慮すると、ロボットはそのファイルを「製品情報」ディレクトリに移動します。これを行うには、別のアクティビティをシーケンスにドラッグして、Invoke Codeを作成する必要があります。このアクションは引数や変数に格納する値を生成しないので、Assignでファイルを移動することはできません。

images/openrpa_manipulatingfiles_movefile.png

ユーザーは、「エディターを開く」をクリックして、呼び出すコードを編集します。ユーザーは、好きなプログラミング言語を自由に選択することができます。この例では、VBを使用しています。式の構文は次のとおりです。System.IO.File.Move (移動 元の フルパス 移動先の フル パス )。ここで重要なのは、フルパスが必須であること、つまり、ファイル名を含むことです。

そして、オリジンのフルパスは、ファイルのフルパスを格納する変数(この例では、反復処理の「項目」)を介してアクセスされる。もう一つの方法は、ルートディレクトリのパス(この例では「path」という名前)を格納するArgumentを使い、サブディレクトリとファイル名を含む別の文字列と連結させる方法です。

備考

2つ以上の文字列を連結する方法は、”&”を使うことである。

3.A.6.A. ファイル名を変更する

移動時にファイル名を変更する場合、ユーザーが行うべきことは、移動先のフルパスに新しい名前を割り当てることのみです。

この例では、ファイル名の先頭に新しい単語を追加することでファイル名を変更しましたが、任意の名前を設定することができます。ファイルを移動する式を書くとき、ユーザーは新しい名前が式に書かれ、ディレクトリのパスに連結されていることを確認する必要があります。

3.A.6.B. DataTableに情報を追加する

次に、ワークフローの最初に作成された DataTable に、ファイルについて収集した情報を追加します。ユーザーは、AddDataRowを各サブワークフローの最後(つまり、製品情報を持つテキストファイル、製品情報を持たないテキストファイル、またその他のファイル)にドラッグして、各ファイルを処理した記録を保持します。

新しい行を正しいDataTableに参照させるために、DataTableの名前は以前に作成されたものでなければなりません。RowData には、ユーザが追加したい変数名を、辞書の構文に従って追加します({variable, variable, variable})。

詳細は、Add this iteration’s invoice to DataTableに記載されています。なお、これは別の例ですので、変数名はこの例に従って変更する必要があります。

3.A.7. SOAPサービス

この例では、Windows Powershellを使って SOAPサービスVIES VAT Validation<https://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl> _」に接続し、WSDLを使ってデータを収集するワークフローを作成し、入力データを取得して、収集したデータを出力バー内に展示します。

  1. SOAPサービスがどのように定義されているかを可視化する

  2. 入出力変数の定義

  3. SOAP Serviceに接続し、Invoke Code内でデータをマッピングする

  4. 収集したデータを展示する

  5. ワークフロー終了 – 出力

3.A.7.1. SOAPサービスがどのように定義されているかを可視化する

ここでは、接続先となるSOAPサービスのWSDL定義にアクセスし、入出力変数を定義することになります。

まず、VIES VAT Validation(https://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl) ウェブサービスページにアクセスし、どのクラスでデータを収集するのかを確認することができます。

.wsdlファイルに定義されたスキーマから分かるように、定義されたtargetNamespaceはurn:ec.europa.eu:taxud:vies:services:checkVat:typesです。つまり、テンプレートの残りの部分で定義される要素は、checkVatクラスから継承された型です。これは、データを収集するために使用されるクラスです。

このクラス内のメイン関数はcheckVat関数で、この関数は2つの入力パラメータ、countryCodeと vatNumberを受け取ります。この関数が呼ばれると、checkVatResponse関数の内容、つまり、countryCode,vatNumber,requestDate,valid,name,addressが返されます。つまり、checkVat の入力パラメータ(countryCode,vatNumber) とcheckVat関数の呼び出しの出力パラメータ(requestDate,valid,name,address) を返すのです。ユーザはvalidnameaddressだけを使って、返されたデータを展示することになります。

3.A.7.2. 入出力変数の定義

ここでは、SOAPサービスに渡す入力変数と、SOAPサービス呼び出しの内容を格納するための出力変数を定義します。

まず、メインシーケンスにAssignアクティビティをドラッグします。To入力フィールドに変数countryCodeをEnter a VB expressionフィールドに"DK "を入力します。

さて、メインシーケンスにAssignアクティビティをドラッグします。To入力フィールドに変数vatNumberをEnter a VB expressionフィールドに"40400230 "を入力します。

備考

Ctrl+Kを押すと、入力フィールドに入力する際に自動的に変数が作成されますが、画面下部の変数ボックスをクリックして手動で作成することもできます。右側には、変数に代入する値を入力します。

images/check_soap_service_define_input_variables.png

ここで、返される他の出力変数、つまりvalidnameaddress を手動で定義しなければなりません。nameaddressString変数で、validBoolean変数です。これは、WSDLファイル内のcheckVatResponse関数の定義で簡単に見ることができます。valid変数の定義では、<xsd:element>の typeパラメータはxsd:booleanとみなされ、他の2つの変数については、そのtypeはxsd:stringとみなされる。

images/check_soap_service_response_class.png

あとは、Variables, Imports & Argumentsボックスの Variables セクションで、これらの出力変数を作成するだけです。

images/check_soap_service_create_output_variables.png

3.A.7.3. SOAPサービスに接続し、Invoke Code内でデータをマッピングする

ここでは、Invoke Codeアクティビティにデータをマッピングする方法と、Powershell言語を用いてSOAP Serviceの呼び出しを実行する方法について学習します。

まず、Invoke Codeアクティビティをメインシーケンスにドラッグします。エディタを開く]ボタンをクリックしてエディタを開き、その言語をPowerShellに設定します。

images/check_soap_service_drag_invoke_code.png
images/check_soap_service_open_editor.png

ここで、以下のコードをエディタに挿入してください。

 $Client = New-WebServiceProxy -Uri "http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl" -Class "checkVat"$DateChecked = $Client.checkVat([ref]$countryCode, [ref]$vatNumber, [ref]$valid, [ref]$name, [ref]$address)

Client行はVIES VAT Validationウェブサービスに接続し、データを収集するために使用されるクラスを定義します:checkVat.Toは、VIES VAT Validationウェブサービスに接続し、データを収集するために使用されるクラスを定義します。

DateCheckedの行は、前のセクションで見たように、定義されたcheckVatを実行し、参照変数(https://ss64.com/ps/syntax-ref.html)を使って、返される変数 –countryCode,vatNumber,valid,name,address– をマッピングしています。

3.A.7.4. 集めたデータを展示する

このセクションでは、ユーザーはWrite Lineアクティビティを使用して、Outputバーで収集したデータを表示します。

まず、WriteLineアクティビティをメインシーケンスにドラッグして、Text入力フィールドにvalid.ToStringを入力します。

さて、WriteLineアクティビティをメインシーケンスにドラッグして、Text入力フィールドにnameを入力します。

最後に、WriteLineアクティビティをメインシーケンスにドラッグして、Text入力フィールドにAddressを入力します。

images/check_soap_service_writeline.png

3.A.8. RESTサービス(Node-REDとの連携)

この例では、Chuck Norris Jokes API(https://api.chucknorris.io/) に接続し、ジョークをキャプチャするワークフローを作成することになります。

また、ユーザーはForge.FormsのダイナミックWPFフォーム(https://github.com/WPF-Forge/Forge.Forms)を使って、ジョークのカテゴリーを選択できるダイアログボックスを作成します。

また、メッセージがChuck Norrisのジョークかどうかを確認するために、簡単な検証方法が用いられています。

その手順は以下の通りです。

  1. Node-REDでTo/Fromに渡す変数を設定する

  2. NodeREDにおけるメッセージの操作について

  3. OpenRPAフォーム

  4. openrpaでワークフローを呼び出す

  5. 冗談で失敗したワークフローを作成する

  6. チャック・ノリス・ジョークを評価する

  7. ジョーク失敗のワークフローを呼び出す

  8. Node-REDにおける評価失敗ケースの設定

  9. 出力ロジック

  10. ワークフロー終了

3.A.8.1. Node-REDでの変数の受け渡しの設定

ロボットからデータを受け取り、Chuck Norris APIに問い合わせ、その値をロボットに返すというロジックがここにある。

ワークフローロジック

Workflow Inノードをワークスペースにドラッグします。

images/openrpa_workflow_example_rest_workflow_in_drag.png
images/openrpa_workflow_example_rest_workflow_in_workspace.png

Workflow In のプロパティで、OpenFlow ワークフローが割り当てるキューを定義するために、キュー 名を設定します。キュー名は完全に任意であり、ユーザが好きな名前を選択できます。この例では、chuckapi と設定しています。

備考

Node-RED ワークスペース内のノードのプロパティにアクセスするには、指定されたノードをダブルクリックします。ノードのプロパティボックスが表示され、それ自体に必要な各入力フィールドが表示されます。

RPAチェックボックスをオンにすると、このフローのワークフローがOpenRPAエージェントから呼び出されるようになります。

Name入力フィールドにワークフローの名前を設定します。ここでは、ChuckAPIと設定しています。

images/openrpa_workflow_example_rest_workflow_in_double_click.png
images/openrpa_workflow_example_rest_workflow_in_set_properties.png

HTTP Requestノードをワークスペースにドラッグします。

images/openrpa_workflow_example_rest_http_request_drag.png

Workflow In」ノードと「HTTP Request」ノードを接続します。

images/openrpa_workflow_example_rest_http_request_nodes_connect.png
images/openrpa_workflow_example_rest_http_request_nodes_connected.png

備考

ノードの接続は、Ctrlキーを押しながら、各ノードの外側にあるポートという灰色の長方形をクリックするだけで簡単にできます。クリックしたままでも接続できますが、筆者はCtrlキーを使う方が使いやすいと感じています。

リクエストのMethodを GETに設定します。

リクエストの送信先となるAPIのURLを設定します。この例では、https://api.chucknorris.io/jokes/random?category={{category}}です。

Mustache(https://mustache.github.io/mustache.5.html) の中の変数、すなわちcategoryも同様に任意の名前になっています。

この変数は、OpenRPAがユーザーから取得した選択肢の値を渡すために使用されます。ユーザーは自分の好きなように名前をつけることができます。

返送するタイプを設定します。この例では、パースされた JSON オブジェクトが返されます。

images/openrpa_workflow_example_rest_http_request_set_properties.png

Workflow Outノードをワークスペースにドラッグします。

images/openrpa_workflow_example_rest_workflow_out_drag.png

HTTP RequestノードとWorkflow Outノードを接続します。

images/openrpa_workflow_example_rest_workflow_out_nodes_connect.png
images/openrpa_workflow_example_rest_workflow_out_nodes_connected.png

備考

ノードの接続は、Ctrlキーを押しながら、各ノードの外側にあるポートという灰色の長方形をクリックするだけで簡単にできます。クリックしたままでも接続できますが、筆者はCtrlキーを使う方が使いやすいと思います。

画面左上の赤い「Deploy」ボタンをクリックして、フローをデプロイします。

images/openrpa_workflow_example_rest_chuck_api_deploy.png

3.A.8.2. Node-REDにおけるメッセージの操作

ここで、OpenRPAからNode-REDにパラメータを送信して、ワークフローがそれほど静的でないようにしたいと思います。

このパラメータには、Chuck Norris APIのジョークが関連するカテゴリを指定します。

Node-REDのワークフローで集めた変数からパラメータを変更するには、Functionノードとそのプロパティで簡単に行うことができます。

RobotsIn/Out の引数は常にmsg.payload属性に渡され(Node-RED では)、Functionノードで簡単に操作することができます。

images/openrpa_workflow_example_rest_function_node.png

ワークフローのChuckAPI Workflow InノードとHTTP Requestノードの間にFunctionノードをドラッグするだけで、ワークフローに追加できます。

備考

ノードを自動的に追加してシーケンスにバインドするには、Shiftキーを押しながらノードをドラッグします。こうすると、ノードがドラッグされる前にすでに確立されていたシーケンスの間に自動的に入ります。

images/openrpa_workflow_example_rest_parameter_passing_function_drag.png
images/openrpa_workflow_example_rest_parameter_passing_function_workspace.png

この例では、必要なパラメータはmsg.categoryで、これは OpenRPA ワークフローから渡されるcategory引数からmsg.payload.categoryとして収集されます。

images/openrpa_workflow_example_rest_parameter_passing_function_double_click.png

Functionノードのプロパティでmsg.category = msg.payload.category を設定します。

これは、ユーザーが次に構築するOpenRPAワークフローから取得したHTTP Requestノードに、categoryパラメータを設定するために使用されます。

images/openrpa_workflow_example_rest_parameter_passing_function_set_properties.png

備考

この例では、ユーザーはChangeノードを使用してmsg.category属性をmsg.payload.categoryに設定することもできますし、単にmsg.payload.categoryを HTTP リクエストに直接渡すこともできます(これについては後述します)。

3.A.8.3. OpenRPAフォーム

ここで、ユーザーは動的なWPFフォームを作成し、クライアントからカテゴリ値を収集します。

まず、Invoke Formulaスニペットをメインシーケンスにドラッグします。

ここで、「 デザイナーを開く」をクリックして、フォーム デザイナーを開きます。

images/openrpa_workflow_example_rest_openrpa_forms_click_open_designer_button.png

備考

フォーム デザイナーは、クライアントからの入力を収集するために、ユーザーが希望するWPFフォームを作成する場所です。その右側には、入力フォームのプレビューが表示される。その左側には、入力フォームを設計するために使用するコードを入力します。フォーム デザイナーにコードを追加した後、常にビルドフォームボタンを押して変更を保存し、プレビューを可視化することができます。

サンプルコードをすべて消去し、下記のコードスニペットをデザイナーのコードエディタに追加します。そして、Build formボタンを押してフォームを更新してください。

images/openrpa_workflow_example_rest_openrpa_forms_empty_designer.png
<form-designer> <title>Choose Chuck Norris API Category</title> <heading>Please enter the desired category number inside the input field. The returned joke will be related to the selected category.</heading><select name="category" label="Choose the desired category">   <option name="animal" />   <option name="career" />   <option name="celebrity" />   <option name="dev" />   <option name="explicit" />   <option name="fashion" />   <option name="food" />   <option name="history" />   <option name="money" />   <option name="movie" />   <option name="music" />   <option name="political" />   <option name="region" />   <option name="science" />   <option name="sport" />   <option name="travel" /></select><action name="submit" content='SUBMIT' icon='check' validates='true' ClosesDialog='true' ></action></form-designer>
images/openrpa_workflow_example_rest_openrpa_forms_filled_designer.png

備考

コードスニペットを追加した後、Create variablesボタンを押すと、WPFフォームで使用するすべての変数を自動的に作成することができます。

この場合、ワークフローはVariableを使用することができない。Node-REDで消費される値なので、必ずDirectionが In/OutまたはOutで、タイプがStringの Argumentとして設定しなければならない。

images/openrpa_workflow_example_rest_openrpa_forms_arguments_box.png

さて、WPFフォームから収集した値が正しい型であることを保証するために、ユーザーはAssignアクティビティを使用して値をStringにキャストします。