ファイルに移る前に、もう1つのステップが必要です。ワークフロー
実行後に Log Excel ファイルが保存されるため、処理中のデータを格納する Datatable を作成する必要があります。これは、ワークフローの
時点で作成され、グローバルに値を保存します。
このトピックは、このドキュメントの他の例ですでにカバーされています。Create an Empty DataTableに従って、変数の名前が同じでないことに留意してください。
ファイルに移る前に、もう1つのステップが必要です。ワークフロー
実行後に Log Excel ファイルが保存されるため、処理中のデータを格納する Datatable を作成する必要があります。これは、ワークフローの
時点で作成され、グローバルに値を保存します。
このトピックは、このドキュメントの他の例ですでにカバーされています。Create an Empty DataTableに従って、変数の名前が同じでないことに留意してください。
タスクはルートディレクトリの各ファイルを分類することであるため、それらを繰り返し処理することが必要である。
ユーザーは、ForEachWithBodyFactor<>
アクティビティをメインシーケンスにドラッグして、DataTableの作成の下に置きます。最初のフィールドには、ディレクトリ内の各ファイルを表す “item “という単語が表示されます。この名前は変更可能で、どんな名前でも大丈夫です。
最も重要なのは、2番目のフィールド(”in”)である。ここでユーザーは、System.IO.Directory.GetFiles(path)
という式を入力します。ここで「path」は、メインシーケンスの最初にルートディレクトリのパスで既に設定されているArgument(「パス」)です。この式は、そのディレクトリにあるファイルのフルパスのリストを返します。したがって、ForEach
アクティビティはこのリストに対して反復処理を行います。
3番目のフィールドはBodyで、リストの各ファイルに対してActivityが実行される場所です。このBodyの中では、以下のActivityが実行される。
Body内部の最初のActivityは、ファイルの名前を取得することになります。System.IO.Directory.GetFiles()
式は、フルパスのリストを返すことに注意してください。後のActivityに進むには、ユーザーはファイル名だけを取得する必要があります。
それを実現する最もシンプルな方法は、VBエクスプレッションを使うことです。ユーザーはAssign
ActivityをBodyにドラッグします。この例では、Variableの名前は「file_name」になります。式はSystem.IO.Path.GetFileName()
で、ファイルのフルパスは括弧の中、つまり Variable “item” の中に挿入しなければなりません。
備考
この値は反復処理のファイルに応じて変更されるため、ユーザーは引数ではなく、変数を使用する必要があります。このVariableのスコープは、ForEachWithBodyFactor<>(
ここでは「Iterate over files」という名前)のBodyの中のSequenceでなければならないことに注意してください。このVariableのタイプは “string “である。
その後、ユーザーは最後のステップのすぐ後に、If
Activityをドラッグすることになります。ここでは、ファイルを拡張子によって分離することを考えます。この例では、.txtファイルだけが読み込まれるため、他の拡張子は考慮されません。
条件」フィールドに、System.IO.Path.GetExtension(file_name OR full path) = ".txt "
と入力します。
備考
ファイルの拡張子を取得する方法は、これだけではありません。ユーザーは、「file_name.EndsWith(“.txt”)」というVB式を使用することもできます。この式は、文字列の中にある文字列を探すので、引用符で囲む必要があることに注意してください。
つまり、ファイルの拡張子が「.txt」であれば、ロボットは「Then」フィールドに進み、そうでなければ、「Else」フィールドに進むことになる。
ここでは、Sequenceを2つに分割しています。まず、テキストファイルがどうなるかを考えてみましょう。
テキストファイルで実行される最初のアクティビティは、その内容を読み取ることです。ここでも、ユーザーはAssign
Activityを「Then」フィールドにドラッグし、Variableを使用します。この例では、Variableの名前は「content」、タイプは「string」です。
ファイルを読み込むための式はSystem.IO.File.ReadAllText(file_name)
を使用します。内容は、割り当てられたVariableに格納されます。
備考
この例では、.txtでないものを削除します。このチュートリアルでさらに説明します。
次に、ファイルの作成日を取得します。この手順は、前の手順(Read File)とよく似ています。つまり、ユーザーはAssign
Activityを使って、VB式の内容を保存することになります。
この場合、式はSystem.IO.File.GetCreationTime(file_name).ToShortTimeString
となります。
備考
ここでは、他の可能性もある。ユーザーは、時間、日、月、あるいは、ファイルの作成に関するその他の情報を取得することができます。これを行うには、ユーザーは式の最後の部分を必要な情報の種類に変更する必要があります(例えば、System.IO.File.GetCreationTime(file_name).Month
)。
この例では、ファイルを移動する前に、テキストファイルから情報を抽出してログファイルに追加するためのアクションがいくつか追加されています。Matches
アクティビティが採用され、ユーザーはその3つのプロパティに注目する必要があります。「入力」、「パターン」、「結果」です。
最初の “Input “は、”Pattern “の検索対象となる文字列または文字列を格納するVariableである。この場合、値はファイルの内容に対応する “content “変数である必要がある。
“パターン “は、”入力 “内の文字列から検索されるRegEx式です(引用符で囲まれている必要があることに注意してください)。
最後に、”Results “は結果が格納されるVariableまたはArgumentです(この場合、Variableでなければなりません)。
この Variable の型はSystem.Text.RegularExpressions.Match
でなければならないことにユーザーは注意しなければならない。これは、結果のリストになります。この例では、マッチごとに1つの結果のみが存在することになります。この結果を得るために、ユーザーは次の構文を使用する必要があります: variablename.First.ToString, つまり、リストの最初のアイテムは文字列に変換されます。
これらの手順が完了すると、ロボットはファイルを内容に応じて分類する。この例では、製品情報があるかどうかが基準になっています。
ユーザーは、このSequenceに別のIf
Activityをドラッグします(前のIf
文のBody)。ここでは、ファイルの内容を格納する変数「content」が使用されます。メソッドは.Contains("string")
で、構文は次のとおりです。content.Contains("product")
.
備考
なお、検索される語句は文字列であるため、引用符で囲まなければならない。
もし、そのような用語があれば、ロボットは「Then」フィールドに進み、そうでなければ、「Else」フィールドに進みます。つまり、このActivityは、ファイルを2つのカテゴリに分類しているのです。これは簡単な例ですが、より複雑な用語を検索することもできます。
最初の可能性(ファイルに製品情報がある)を考慮すると、ロボットはそのファイルを「製品情報」ディレクトリに移動します。これを行うには、別のアクティビティをシーケンスにドラッグして、Invoke Codeを
作成する必要があります。このアクションは引数や変数に格納する値を生成しないので、Assignで
ファイルを移動することはできません。
ユーザーは、「エディターを開く」をクリックして、呼び出すコードを編集します。ユーザーは、好きなプログラミング言語を自由に選択することができます。この例では、VBを使用しています。式の構文は次のとおりです。System.IO.File.Move (移動
元の
フルパス 、移動先の フル
パス
)
。ここで重要なのは、フルパスが必須であること、つまり、ファイル名を含むことです。
そして、オリジンのフルパスは、ファイルのフルパスを格納する変数(この例では、反復処理の「項目」)を介してアクセスされる。もう一つの方法は、ルートディレクトリのパス(この例では「path」という名前)を格納するArgumentを使い、サブディレクトリとファイル名を含む別の文字列と連結させる方法です。
備考
2つ以上の文字列を連結する方法は、”&”を使うことである。
移動時にファイル名を変更する場合、ユーザーが行うべきことは、移動先のフルパスに新しい名前を割り当てることのみです。
この例では、ファイル名の先頭に新しい単語を追加することでファイル名を変更しましたが、任意の名前を設定することができます。ファイルを移動する式を書くとき、ユーザーは新しい名前が式に書かれ、ディレクトリのパスに連結されていることを確認する必要があります。
次に、ワークフローの
最初に作成された DataTable に、ファイルについて収集した情報を追加します。ユーザーは、AddDataRowを
各サブワークフローの最後(つまり、製品情報を持つテキストファイル、製品情報を持たないテキストファイル、またその他のファイル)にドラッグして、各ファイルを処理した記録を保持します。
新しい行を正しいDataTableに参照させるために、DataTableの名前は以前に作成されたものでなければなりません。RowData には、ユーザが追加したい変数名を、辞書の構文に従って追加します({variable, variable, variable})。
詳細は、Add this iteration’s invoice to DataTableに記載されています。なお、これは別の例ですので、変数名はこの例に従って変更する必要があります。
この例では、Windows Powershellを使って
SOAPサービス「VIES VAT Validation<https://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl>
_」に接続し、WSDLを使って
データを収集するワークフローを作成し、入力データを取得して、収集したデータを出力バー内に展示します。
SOAPサービスがどのように定義されているかを可視化する
入出力変数の定義
SOAP Serviceに接続し、Invoke Code内でデータをマッピングする
収集したデータを展示する
ワークフロー終了 – 出力
ここでは、接続先となる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
) を返すのです。ユーザはvalid
、name
、addressだけを使って
、返されたデータを展示することになります。
ここでは、SOAPサービスに渡す入力変数と、SOAPサービス呼び出しの内容を格納するための出力変数を定義します。
まず、メインシーケンスにAssignアクティビティをドラッグします。To
入力フィールドに変数countryCodeを
、Enter a VB expression
フィールドに"DK "
を入力します。
さて、メインシーケンスにAssignアクティビティをドラッグします。To
入力フィールドに変数vatNumberを
、Enter a VB expression
フィールドに"40400230 "
を入力します。
備考
Ctrl+K
を押すと、入力フィールドに入力する際に自動的に変数が作成されますが、画面下部の変数ボックスをクリックして手動で作成することもできます。右側には、変数に代入する値を入力します。
ここで、返される他の出力変数、つまりvalid
、name
、address
を手動で定義しなければなりません。name
とaddress
はString
変数で、valid
はBoolean
変数です。これは、WSDL
ファイル内のcheckVatResponse
関数の定義で簡単に見ることができます。valid
変数の定義では、<xsd:element>の
type
パラメータはxsd:booleanと
みなされ、他の2つの変数については、そのtypeはxsd:stringと
みなされる。
あとは、Variables, Imports & Argumentsボックスの Variables セクションで
、これらの出力変数を作成するだけです。
ここでは、Invoke Codeアクティビティにデータをマッピングする方法と、Powershell
言語を用いてSOAP Serviceの呼び出しを実行する方法について学習します。
まず、Invoke Codeアクティビティをメインシーケンスにドラッグします。エディタを開く]ボタンをクリックしてエディタを開き、その言語をPowerShellに
設定します。
ここで、以下のコードをエディタに挿入してください。
$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
– をマッピングしています。
このセクションでは、ユーザーはWrite Lineアクティビティを使用して、Outputバーで収集したデータを表示します。
まず、WriteLineアクティビティをメインシーケンスにドラッグして、Text
入力フィールドにvalid.ToStringを
入力します。
さて、WriteLineアクティビティをメインシーケンスにドラッグして、Text
入力フィールドにnameを
入力します。
最後に、WriteLineアクティビティをメインシーケンスにドラッグして、Text
入力フィールドにAddressを
入力します。
このワークフローの例の出力内容の一部を紹介します。
この例では、Chuck Norris Jokes API(https://api.chucknorris.io/
) に接続し、ジョークをキャプチャするワークフローを作成することになります。
また、ユーザーはForge.FormsのダイナミックWPFフォーム(https://github.com/WPF-Forge/Forge.Forms
)を使って、ジョークのカテゴリーを選択できるダイアログボックスを作成します。
また、メッセージがChuck Norrisのジョークかどうかを確認するために、簡単な検証方法が用いられています。
その手順は以下の通りです。
Node-REDでTo/Fromに渡す変数を設定する
NodeREDにおけるメッセージの操作について
OpenRPAフォーム
openrpaでワークフローを呼び出す
冗談で失敗したワークフローを作成する
チャック・ノリス・ジョークを評価する
ジョーク失敗のワークフローを呼び出す
Node-REDにおける評価失敗ケースの設定
出力ロジック
ワークフロー終了
ロボットからデータを受け取り、Chuck Norris APIに問い合わせ、その値をロボットに返すというロジックがここにある。
ワークフローロジック
Workflow In
ノードをワークスペースにドラッグします。
Workflow In の
プロパティで、OpenFlow ワークフローが割り当てるキューを定義するために、キュー 名を
設定します。キュー名は完全に任意であり、ユーザが好きな名前を選択できます。この例では、chuckapi
と設定しています。
備考
Node-RED ワークスペース内のノードのプロパティにアクセスするには、指定されたノードをダブルクリックします。ノードのプロパティボックスが表示され、それ自体に必要な各入力フィールドが表示されます。
RPA
チェックボックスをオンにすると、このフローのワークフローがOpenRPAエージェントから呼び出されるようになります。
Name
入力フィールドにワークフローの名前を設定します。ここでは、ChuckAPIと
設定しています。
HTTP Request
ノードをワークスペースにドラッグします。
Workflow In」
ノードと「HTTP Request
」ノードを接続します。
備考
ノードの接続は、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 オブジェクトが
返されます。
Workflow Out
ノードをワークスペースにドラッグします。
HTTP Request
ノードとWorkflow Out
ノードを接続します。
備考
ノードの接続は、Ctrl
キーを押しながら、各ノードの外側にあるポートという灰色の長方形をクリックするだけで簡単にできます。クリックしたままでも接続できますが、筆者はCtrl
キーを使う方が使いやすいと思います。
画面左上の赤い「Deploy」ボタンをクリックして、フローをデプロイします。
ここで、OpenRPAからNode-REDにパラメータを送信して、ワークフローがそれほど静的でないようにしたいと思います。
このパラメータには、Chuck Norris APIの
ジョークが関連するカテゴリを
指定します。
Node-REDのワークフローで集めた変数からパラメータを変更するには、Function
ノードとそのプロパティで簡単に行うことができます。
RobotsIn/Out の
引数は常にmsg.payload
属性に渡され(Node-RED では)、Function
ノードで簡単に操作することができます。
ワークフローのChuckAPI Workflow In
ノードとHTTP Request
ノードの間にFunction
ノードをドラッグするだけで、ワークフローに追加できます。
備考
ノードを自動的に追加してシーケンスにバインドするには、Shift
キーを押しながらノードをドラッグします。こうすると、ノードがドラッグされる前にすでに確立されていたシーケンスの間に自動的に入ります。
この例では、必要なパラメータはmsg.category
で、これは OpenRPA ワークフローから渡されるcategory
引数からmsg.payload.category
として収集されます。
Function
ノードのプロパティでmsg.category = msg.payload.category
を設定します。
これは、ユーザーが次に構築するOpenRPAワークフローから取得したHTTP Request
ノードに、category
パラメータを設定するために使用されます。
備考
この例では、ユーザーはChange
ノードを使用してmsg.category
属性をmsg.payload.category
に設定することもできますし、単にmsg.payload.category
を HTTP リクエストに直接渡すこともできます(これについては後述します)。
ここで、ユーザーは動的なWPFフォームを作成し、クライアントからカテゴリ
値を収集します。
まず、Invoke Formula
スニペットをメインシーケンスにドラッグします。
ここで、「 デザイナーを開く
」をクリックして、フォーム デザイナーを
開きます。
備考
フォーム デザイナーは
、クライアントからの入力を収集するために、ユーザーが希望するWPFフォームを作成する場所です。その右側には、入力フォームのプレビューが表示される。その左側には、入力フォームを設計するために使用するコードを入力します。フォーム デザイナーに
コードを追加した後、常にビルドフォームボタンを押して変更を保存し、プレビューを可視化することができます。
サンプルコードをすべて消去し、下記のコードスニペットをデザイナーのコードエディタに追加します。そして、Build formボタンを押してフォームを更新してください。
<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>
備考
コードスニペットを追加した後、Create variablesボタンを押すと、WPFフォームで使用するすべての変数を自動的に作成することができます。
この場合、ワークフローはVariableを
使用することができない。Node-REDで消費される値なので、必ずDirectionが In/Out
またはOutで
、タイプがStringの
Argumentとして
設定しなければならない。
さて、WPFフォームから収集した値が正しい型であることを保証するために、ユーザーはAssignアクティビティを使用して値をStringに
キャストします。