3.A.2.2. フォーム

このセクションでは、Skypeアプリケーションを使用して添付ファイルとテンプレートメッセージを渡すために使用される、電子メールSkype コンタクトコンタクト 名を取得するフォームの作成方法について説明します。

OpenRPAフォーム

ここでは、ユーザーがクライアントから上記の値を収集するための動的なWPFフォームを作成します。

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

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

images/openrpa_workflow_examples_windows_automation_click_open_designer_button.png

サンプルコードをすべて消去し、以下のコードスニペットをデザイナーのコードエディタに追加します。

<form>   <title>Skype Automation Form</title>   <heading>Invoice Details</heading>   <input type='string' name='email'         label='Email'         tooltip='Enter the email address here.'         icon='pencil'>      <validate must='NotBeEmpty' message='Email is mandatory' />   </input>   <input type='string' name='usernameSkype'         label='Skype contact' icon='pencil'         tooltip='Enter the Skype contact to which the file will be sent here.'>      <validate must='NotBeEmpty' message='Skype contact is mandatory' />   </input>   <input type='string' name='name'         label='Contact name' icon='pencil'         tooltip='Enter the contact name to which the file will be sent here.'>      <validate must='NotBeEmpty' message='Contact name is mandatory' />   </input>   <action name='submit' content='START SKYPE AUTOMATION' icon='check' validates='true' ClosesDialog='true' /></form>
images/openrpa_workflow_examples_windows_automation_openrpa_forms_filled_designer.png

もしあなたがHTMLやその他のマークアップ言語に慣れているなら、この舞台裏で何が起こっているのか理解できるかもしれません。そうでない場合は、OpenRPA Formsのセクションを参照してください。

フォーム作成ボタンを押すと、フォーム デザイナーの左側パネルにWPFフォームが作成され、プレビューを見ることができます。

その後、ユーザーは変数作成ボタンを押すことで、フォーム デザイナーの内部で定義されたすべての変数が自動的に作成されます。簡単でしょう?

images/openrpa_workflow_examples_windows_automation_openrpa_forms_create_variables.png

備考

OpenRPA Formsの使用を避けたい場合は、Assignアクティビティを使用して変数emailusernameSkypenameに値を割り当てるだけで、その値を使用して目的のクライアントに添付ファイルとテンプレートメッセージを送信することができます。

備考

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

3.A.2.3. Windowsオートメーション(Skypeアプリ)/セレクタの使用方法のページです

さて、このワークフローの例では、これまでの旅の最大の山場がやってきました。内蔵のレコーダーは、このセクションで紹介したタスクを効果的に達成するために、ユーザーが通常行うタスクを記録するために使用されます。

タスクの記録

ここでは、Skypeアプリケーション内でコンタクトを検索し、そのコンタクトを選択(またはクリック)して、添付ファイルを含むメッセージを送信するという、通常行われる作業を記録します。

まず、Skypeのアプリケーションを起動します。

これで、Skypeアプリケーションを開いたまま、OpenRPAのリボン内のボタンをクリックしてOpenRPA内のRecorderを起動し、手動で行ったようにタスクを実行することができるようになります。

images/openrpa_workflow_examples_windows_automation_skype_app_click_recorder.png

レコーダーを起動した状態で、「人、 グループ メッセージ」のプレースホルダーがある「検索」タブをクリックする必要があります。

images/openrpa_workflow_examples_windows_automation_skype_app_click_search_tab.png

検索」タブ内に、プレースホルダー「Search Skype」を含む入力フィールドが表示されます。その入力フィールドをクリックすると、InsertText入力フィールドが表示されます。ユーザは、このセクションで適切なセレクタを割り当てるためのダミーとして使用される既存のコンタクトを入力する必要があります。Skypeのオートコンプリート機能がユーザーを見つけるのを待ってから、ユーザーは目的のコンタクトをクリックする必要があります。

images/openrpa_workflow_examples_windows_automation_skype_app_search_tab_input_field.png
images/openrpa_workflow_examples_windows_automation_skype_app_search_tab_input_field_filled.png

連絡先をクリックすると、その連絡先の「メッセージ」タブが表示されます。

ここでユーザーは、右下のセクションにある「 ファイルの追加」ボタンをクリックする必要があります。

images/openrpa_workflow_examples_windows_automation_skype_app_click_add_file_button.png

ここでファイルダイアログが表示され、ユーザーは希望のファイルを選択できます。また、InsertTextというタイトルのOpenRPAからの入力ダイアログが表示され、ここで再びダミーテキストを挿入できます。セレクタはこのダイアログを操作して、次のセクションで見るように、送信されるファイルを選択します。そして、「開く」ボタンをクリックします。

images/openrpa_workflow_examples_windows_automation_skype_app_select_file.png

ここで「Type a message」プレースホルダーを含む入力フィールドをクリックすると、「InsertText」というタイトルの別の入力ダイアログが表示されます。ここで再び、任意のダミーテキストを入力することができます。

images/openrpa_workflow_examples_windows_automation_click_type_a_message.png

その後、青色の送信ボタンをクリックしてください。

images/openrpa_workflow_examples_windows_automation_click_send_button.png

最後に、検索タブ内の×ボタンをクリックして検索ダイアログを閉じ、ESCボタンを押してレコーダーを終了します。

images/openrpa_workflow_examples_windows_automation_skype_app_close_search_tab.png

セレクタを設定する

これで、OpenRPAのデザイナー内に登場した多くのGetElementアクティビティのSelectorが設定されました。

まず、Skypeアプリケーションペイン内で最初にクリックされる要素に対して、最初のセレクタを設定します。これは、People, groups & messagesのプレースホルダーを持つものです。このケースでは、ワークフローに関心を持つ可能性のあるサードパーティによる表示プロセスを容易にするために、その表示名を Search for people, groups & messages から Search Contact GetElementに変更しました。

特定のフィールド用に生成されたGetElementアクティビティ内の [セレクタを開く] ボタンをクリックします。

images/openrpa_workflow_examples_windows_automation_skype_app_people_groups_messages_selector.png

この画像では、ユーザーは入力されたダミーユーザー名に対応する「Type Text」アクティビティに気づきます。次のステップで別のアクティビティに置き換えられるので、ユーザーはワークスペースからそのアクティビティを削除することができます。

新しいウィンドウでハイライトボタンをクリックしても、Skypeアプリケーションのウィンドウを開いたままでは、画面内のどの要素もハイライトされないことにお気づきでしょう。そこで、指定された要素を手動で選択する必要があります。

そのためには、まず、Pane Skype->Document Skype XXXXXXXXXX->Button Search for people, groups & messages という要素をダブルクリックし、この最後の要素を右クリックして、表示されるSelect Elementボタンをクリックします。下図は、この要素を強調表示したものです。

images/openrpa_workflow_examples_windows_automation_skype_app_people_groups_messages_selector_element_highlighted.png

ここで、最初のセレクタのファイル名属性を変更します。"%ProgramFiles%﹑Microsoft.SkypeApp_15.61.100.0_x86__XXXXX﹑Skype.exe" で、skypeのバージョンとその次のハッシュ(ここでは{XXXXX} として指定)をトリミングします。これを行うには、“%ProgramFiles%⇄WindowsApps⇄Microsoft.SkypeApp_*”“¹に変更するだけです。

これで、ユーザーは4番目のセレクタの選択も解除しなければなりません。ここまでの変更はすべて下の画像に示されています。

images/openrpa_workflow_examples_windows_automation_skype_app_people_groups_messages_selector_finished.png

その後、画面左下の「Ok」ボタンをクリックするだけです。アクティビティ内のHighlightボタンをクリックして、適切なセレクタが設定されているか、再度確認することをお勧めします。

ここでユーザーは、「検索」タブ入力のキャプチャを担当するGetElementアクティビティ内で、上記と同じ手順を実行する必要があります。Pane Skype->Document Skype XXXXXXXXX->Edit Search Skype.で要素を選択します。ここで重要なのは、セレクタを開く前にSkypeアプリケーション内にSearchタブが表示されていなければならないということです。

images/openrpa_workflow_examples_windows_automation_skype_app_search_tab_selector_finished.png

また、ユーザーは、現在のGetElementアクティビティ内のAssignアクティビティの右側の値を、希望する連絡先のユーザー名を保持する変数に変更する必要があります。この例では、フォームのセクションで定義したとおり、usernameSkypeがその変数になります。

images/openrpa_workflow_examples_windows_automation_skype_app_search_tab_assign_properties_tab.png

ここでユーザーは、ワークフローに「Delay」アクティビティを追加しま す。Delayの Durationプロパティを00:00:05に設定し、この遅延が5秒間継続することを意味します。これは、Skypeアプリケーションに組み込まれたオートコンプリート機能のため、明示的に必要です。これは、ロボットが次のステップに進む前にオートコンプリート機能が完了するのを待たなければならないという、ハードコードされた制約です。

images/openrpa_workflow_examples_windows_automation_skype_app_delay.png

次に、ユーザーは、ContactボタンをキャプチャするGetElementアクティビティ内で、上記の手順を繰り返す必要があります。 Pane Skype->Document Skype XXXXXXX->Group PEOPLE->Button {Contact Name}, {Status}, {Chatted Last}, {Skype Name}– すなわち、この例ではPaulo Veras,Away,Chatted 23 minutes ago,Skype Nameを選択します。 ここで重要なのは、セレクタを開く前にSkypeアプリケーション内にContactボタンが表示されていなければならないということです。これによりOpenRPAはContactボタンをウィンドウ内の要素として認識することができます。以下は、セレクタが正しく設定され、ボタンが強調表示された画像です。

images/openrpa_workflow_examples_windows_automation_desired_contact_selector_finished.png
images/openrpa_workflow_examples_windows_automation_desired_contact_selector_highlighted.png

ContactボタンをキャプチャするGetElementアクティビティに含まれるClick Elementアクティビティ内のPost Waitプロパティを使用して、ポストウェイトを追加してください。 この値は、00:00:02に設定する必要があります。ポストウェイトを使用すると、Skypeウィンドウの左ペインに表示される目的のコンタクトボタンをクリックした後、アプリケーション自体がメッセージタブをロードするのを待ちます。ポストウェイトを追加したため、Delayアクティビティは必要ありません。

ユーザーは、残りのアクティビティに対して適切なセレクタを選択するために指定された手順を繰り返し、適切に構成されたときに画面内の要素がハイライトされることを保証する必要があります。要素を正しく選択するために、[Add file]ボタンでウィンドウを開く必要があるかもしれないことを覚えておいてください。

次に、Skypeアプリで送信するファイルのfilepathに適切な値を設定します。ファイルパスが設定される入力フィールドに対応する各アサインアクティビティ内で、適切な値を割り当てます。引数をまだ作成していない場合は、今すぐ作成します。引数の 方向は Inに設定する必要があることを忘れないでください。以下は、この引数を適切に設定する方法です。

images/openrpa_workflow_examples_windows_automation_set_filepath_inside_getelement.png

最後に、GetElementアクティビティに含まれるAssignアクティビティで、Pane Skype->Document Skype XXXXXXX->Edit a message 対応するセレクタ内の要素について、設定が正しいかどうかを確認し、 item.valueを item.SendKeys に変更します。

ユーザーがこれを控えた場合、OpenRPAはSkypeの編集フィールドの値を変数templateMessageの内容に直接設定しようとします。問題は、そのことです。Skypeはそれを好まないのです!Skypeアプリは、ユーザーがエディットフィールドの値を直接変更する代わりに、一文字ずつ入力することを想定しています。そうしないと、実際のテキストメッセージの上にプレースホルダー「Type a message ” 」が表示されて、UIがめちゃくちゃになります。

一文字ずつ入力するユーザーを模倣するには、item.SendKeysメソッドを使用するのが正しい方法です。

Detectorが適切に設定されていれば、ユーザーは以前に定義されたディレクトリ内に.PDFファイルを挿入して、ワークフロー例をテストすることができます。そうでなければ、以下の注意事項に従うことができます。

備考

このワークフロー例の最初のステップで見たように、ユーザーがFileWatcherDetectorPluginから取得するfilepath引数を設定していない場合、ユーザーはAssignアクティビティを使用して手動でその値を設定する必要があります。

備考

アクティビティのパラメータ内の名前(DisplayName)を変更するには、アクティビティの名前を2回クリックし、希望の名前を入力してリターンキーを押すか、プロパティボックス内のパラメータDisplayNameを設定することができます。

備考

ワイルドカード(https://ryanstutorials.net/linuxtutorial/wildcards.php) は、ファイルやディレクトリのセットを定義するパターンを作成するための構成要素のセットです。覚えているように、コマンドラインでファイルやディレクトリを参照するときは常に、実際にはパスを参照しています。パスを参照するときは常に、パスの中でワイルドカードを使用して、ファイルやディレクトリのセットに変換することもできます。

3.A.3. 画像検索/OCR

この例では、ファイルから読み込んだ画像に対してOCRを実行し、その結果を検証基準に照らしてチェックすることができます。

このワークフローの例では、アクティビティの範囲を狭めるために、検出された文書が運転免許証かどうかをチェックすることだけを目的としています。

検証方法は以下の通りです。画像内に「DRIVER」という文字があれば、OpenRPAはこのドキュメントを確かに運転免許証であると判断します。

備考

よく知られているように、OCRはテキストの読みやすさと画質の両方が成功率に重要な役割を果たすため、100%成功することを保証するものではありません。

3.A.3.1. ファイルから画像を読み込む

Load From File]アクティビティをメインシーケンスにドラッグします。

...ボタンをクリックして、読み込む画像を選択します。

プロパティ] タブを開き、Resultパラメータに変数を割り当て、アクティビティで作成されたImageElementを格納します。

何らかの要素を返すアクティビティから取得したものはすべて、自動的に項目の要素にマッピングされることをユーザーに思い出させるのに便利です。

備考

OpenRPAは、アクティビティ/プロパティに必要な正しい型の新しい変数を自動的に作成することができます。プロパティボックスで新しい変数を作成する場合、変数名を入力した後、入力フィールド内にキャレットを置いたまま、Ctrl+Kを押します。

images/openrpa_workflow_example_image_search_ocr_load_from_file.png

3.A.3.2. テキストを取得する

テキストを取得]アクティビティを[ファイルから読み込む]アクティビティ内のシーケンスにドラッグします。

images/openrpa_workflow_example_image_search_ocr_get_text.png

3.A.3.3. 評価

Ifアクティビティを、Get Textアクティビティの内側のシーケンスにドラッグします。ここでユーザーは検証ロジック全体を実装することになります。

条件入力フィールドの中に、item.Value.Contains("DRIVER")を挿入します。ここでは、Get Textアクティビティを使用して取得したテキスト、つまりitem.Value内にDRIVERという単語が含まれているかどうかがチェックされます。

Ifアクティビティ内のThenシーケンスにAssignアクティビティをドラッグします。 変数containsDriverLicenseTrue に代入します。これは、ワークフローがDRIVER を含む値のインスタンスを見つけた場合、変数containsDriverLicenseの値を自動的にTrue に変更することを意味します。Elseシーケンスには何も含まれていないため、実行は継続されます。

備考

Assign」アクティビティは、変数に値を参照するために使用します。これを行うには、アクティビティーの左側に、値をマップする変数の名前、またはエイリアスを入力します。必要であれば、Ctrl+K を押して、自動的に変数を作成するか、手動で作成することができます。右側を使用して、変数に割り当てられる値を入力します。

images/openrpa_workflow_example_image_search_ocr_if_clause.png

3.A.3.4. お知らせを表示する

次に、「通知を表示」アクティビティをメインシーケンスの最後にドラッグします。これは、バリデーションが成功したかどうかをユーザーに示す方法です。

アクティビティーのダイアログまたはプロパティボックスの メッセージ入力フィールドに、"Is the document a Driver's License? " + containsDriverLicense.ToString.Message” というテキストを挿入します。

ここでは、boolであるcontainsDriverLicenseの値を文字列にキャストして、Show Notificationアクティビティで印刷できるようにしています。

images/openrpa_workflow_example_image_search_ocr_show_notif.png

3.A.3.5. ワークフローの完成

ワークフローを実行した後のプレビューです。出力ウィンドウは、データを表示するために当然切り離されています。

images/openrpa_workflow_example_image_search_ocr_finished_1.png
images/openrpa_workflow_example_image_search_ocr_finished_2.png
images/openrpa_workflow_example_image_search_ocr_finished_3.png
images/openrpa_workflow_example_image_search_ocr_finished_output.png

3.A.4. エクセルリード

この例では、Excel ファイル (.xlsx)に含まれるいくつかの請求書を読み込み、その中のデータを取り込んで、マージされたデータを含む新しいExcel ファイルを生成します。

この例を示すために使用する請求書は、こちらでご覧いただけます。請求書(https://github.com/open-rpa/examples-files/raw/master/bpa-doc/read_excel/invoices/invoices.zip)

images/openrpa_workflow_example_read_excel_invoice_example.png

.rarファイルを任意のディレクトリで解凍し、そのフォルダパスをどこかに保存してください(後で使用します)。

このワークフロー例を実現するために、以下のステップを踏んでいます。

  1. 空のDataTableを作成する

  2. 各請求書について
    • 個々のセルを読み取る

    • テーブルのセル(”items”)を読み込む

    • DataTableにこのイテレーションのインボイスを追加する。

  3. DataTableからExcelを書き出す

3.A.4.1. 空のDataTableの作成

請求書から読み込まれるExcelデータは、すべてDataTableに保存されます。

CreateDataTableアクティビティをメインシーケンスの末尾にドラッグします。

最初の入力フィールドで、DataTableの名前をinvoicesDataTableとする。

備考

OpenRPAは、アクティビティ/プロパティに必要な正しい型を持つ新しい変数を自動的に作成することができます。プロパティボックスで新しい変数を作成する場合、変数名を入力した後、キャレットを入力フィールドに入れたまま、Ctrl+Kキーを押します。

この場合、2つ目の入力フィールドに割り当てられるフィールドはヘッダーです。したがって、2番目の入力フィールドには、{"Invoice Number", "Company Name", "Shipping Address", "Shipping Tel. Number"、 "Due Date"、 "Qty. of Items"、 "Due Balance"}を内容として記述します。

各アクティビティのDisplayNameを意味のあるものにリネームすると、ワークフローの各パーツが何をするのかが把握しやすくなるのでおすすめですそう考えると、このアクティビティを「Create Empty DataTable」にリネームしてみましょう。

images/openrpa_workflow_example_read_excel_create_empty_data_table.png

備考

OpenRPAでは、DataTableは値を保持するために使われる2次元の非シリアライズ可能なオブジェクトに相当します。これはij列の行列と考えることができます。i行は.Rows(n)属性でアクセスできます。ここでnはアクセスしたい行の番号です(0から始まります)。j個の列には、.Item(n)属性を使ってアクセスします。nは、アクセスしたい列の番号-0から始まる-です。ここで、ユーザがRows属性にアクセスしなければならないことを思い出してください。したがって、ユーザがデータ テーブルの 3 行目の 2 列目にアクセスしたい場合は、.Rows(2).Item(1)属性を使用することになります。

備考

.NET APIでは、DataTable オブジェクトは、同じ名前のクラスのDataSet オブジェクト 含まれるインメモリデータの1つのテーブルに対応します。Excel ファイルを読み込むと、それは自動的にDataSetクラスに割り当てられ、すべてのシートは DataTableクラス(0からExcel ファイル内のシート数まで番号が付けられている)に保存されます。ここで、DataTableオブジェクトは大文字と小文字を区別することに注意しましょう。

3.A.4.2. 各インボイスについて

最初のアクティビティは、ディレクトリをループして、そこに含まれるすべてのファイル名を返します。

まずAssignアクティビティをドラッグして、ループさせたいディレクトリの絶対パスを変数に代入します(例:path)。

images/openrpa_workflow_example_read_excel_assign_path.png

ForEachWithBodyFactory<>アクティビティをメインシーケンスにドラッグします。

プロパティボックス内の適切なTypeArgumentパラメータをStringに設定します。これは、反復処理されるディレクトリにファイルパスが含まれ、それがString型の値として返されるためです。

アクティビティの右側で、filePathに割り当てられているアイテム変数を変更します。

アクティビティの左側に、System.IO.Directory.GetFiles(path)を挿入してください。

filePath変数に、各請求書のフルファイルパスへの文字列が入るようになりました。

images/openrpa_workflow_example_read_excel_for_each_with_body_factory.png

個々のセルを読み取る

ここでは、ロボットは単一の値のみを含むフィールドの個々のセルを読み取ります。これらのフィールドは静的です(行数は固定で1つです)。

これらのステップは非常に繰り返しが多いので、invoiceNumber変数のステップのみを再現します。さらに練習したい場合は、他の変数、つまりcompanyNameshippingAddressshippingTelephoneNumberdueDateについても同様に行うことを強くお勧めします。

Recorderでセルを選択するか、OpenRPA.Utilitiesツールボックス内にあるReadCellアクティビティをForEachWithBodyFactory<>アクティビティ内のシーケンスにドラッグしてください。

Recorderが使用されていない場合、ユーザーはこのアクティビティを使用するために、さらにいくつかのステップを踏む必要があります。まず、プロパティ・ボックス内のFilenameパラメータをfilePath変数に割り当てて、読み込まれるExcel ファイルを 選択します。Cellパラメータにキャプチャされるセルを入力します。この例では、請求書番号に対応する「H3」です。

ReadCellアクティビティはExcel ファイルから読み込んで、デフォルトでString変数にセルを保存します。ユーザーは、Propertiesタブ内のArgumentTypeパラメータを変更することで、取り込むデータの種類を変更することができます。

この変数はまだ存在しないので、まず作成する必要があります。この変数には必ずSystem.Data.String 型を設定しなければならないことに注意してください。

プロパティタブ内のResult入力欄をクリックし、使用したい変数名を入力するだけです。この場合、invoiceNumberとなります。

ここで、残りの変数についても、上記の手順を繰り返してください。

images/openrpa_workflow_example_read_excel_read_individual_cell.png

ここで集めた値をすべて取り込んで、後でDataTableに保存できるようにするためには、変数Scopeを一番外側のシーケンスに変更する必要があることを忘れないでください。

images/openrpa_workflow_example_read_excel_change_scope.png

備考

プロパティボックスで新しい変数を作成する場合、変数名を入力した後、キャレットを入力フィールドに置いたまま'K'を押すと、OpenRPAはこの新しい変数をアクティビティに必要な正しいタイプで自動的に作成します。

テーブルのセル(”items”)を読み込む

ここでは、ロボットが請求書内の「表」を読み取ります。個々のセルを読み取るのとは異なり、表は通常動的です(行の数は変化する可能性があります)または。これは、開発者が手動で各変数のReadCellアクティビティを追加することを許可するように、単にあまりにも巨大であるセルの特定の範囲を読み取ることができるプログラム的な方法で行われます。

この「テーブル」は「itemsDataTable」という新しいDataTableに格納され、空の列の削除、値の合計やカウントなど、いくつかのロジックも適用される。

Sequenceアクティビティをドラッグして、Items Processing Logicと名付けます。

このシーケンス内で、CreateDataTableアクティビティをドラッグして、itemsDataTableという名前のテーブルを作成します。

このDataTableのヘッダは、{"itemName", "quantity", "rate", "subTotal"}でなければならない。

images/openrpa_workflow_example_read_excel_read_items_processing_logic_create_data_table.png

課題では、0、3、5、7列を使用します。請求書のテンプレートを見てみると、これらはデータを含む列のインデックスになっています。

Read Rangeアクティビティを利用して、テーブルの内容をDataTableに取り込みます。

まず、「Filename」入力フィールドに、アクティビティが読み込むファイルのパスを入力します。

プロパティボックスの中の「セル」フィールドに、取り込みたいセルを入力します。この例では、「A14:H18」です。

images/openrpa_workflow_example_read_excel_range_cells.png

インデックス0357は、現在の行の内部にあるインデックス付きオブジェクト、つまり列を参照します。

プロパティボックスの DataTableフィールドに、保存するDataTableの名前を入力します。今回の場合、このDataTableは itemsです。

プロパティ]ボックスで、[IgnoreEmptyRows]プロパティを見つけ、この値を[True]に設定します。このテーブルにはヘッダーがないので、Use Header RowプロパティをFalseに設定します。これにより、アクティビティはデータの最初の行 (行 14) を読み込むようになります。

images/openrpa_workflow_example_read_excel_items_processing_read_range.png

そして、ForEach DataRowアクティビティでDataTableをループさせることで、Add DataRowアクティビティを使用して、各アイテム情報を「itemsDataTable」にループさせています。

images/openrpa_workflow_example_read_excel_items_processing_for_each_and_add_data_row.png

ここで、小計の値を計算し、その値を合計値に加算するロジックが登場するが、これは最終的なExcel シートで説明される。

System.Decimal 型の新しい変数quantityを宣言します。Assignアクティビティを使用して、その値をquantity + Convert.ToDecimal(row(3).ToString)に割り当てます – これにより、この変数はアイテムの反復ごとにその値を増加させることになります。

System.Decimal 型の新しい変数currentQuantityを宣言します。Assignアクティビティを使用して、その値をConvert.ToDecimal(row(3).ToString)に代入します。

変数currentRateについてもrow(5)を基準値として、上記の手順を実行します。

System.Decimal 型の新しい変数subTotalを宣言します。Assignアクティビティを使用して、その値をcurrentQuantity*currentRateに代入します。

最後に、System.Decimal.Decimal 型の新しい変数dueBalanceを宣言します。Assignアクティビティを使用して、その値をdueBalance + currentQuantity*currentRate に代入します。

ここで集めた値をすべて取り込み、後でDataTableに保存するためには、ユーザは変数のScopeを一番外側のシーケンスに変更しなければならないことを指摘しておく。

images/openrpa_workflow_example_read_excel_items_logic_assign_variables.png

備考

範囲を読み取る」アクティビティでは、「:」というコロン記号で取り込みたい範囲を区切り、その左側のセルを開始セル、右側のセルを終了セルとします。

3.A.4.3. この反復のインボイスをDataTableに追加する

このイテレーションの請求書から重要なデータをすべて集めたので、この情報をステップ1で作成したDataTableに追加したいと思います。

AddDataRowアクティビティをForEachWithBodyFactory<>アクティビティ内のシーケンスの最後にドラッグしてください。

最初の入力フィールドに、invoicesDataTable を挿入します。

2つ目の入力フィールドに{invoiceNumber, companyName, shippingAddress, shippingTelephoneNumber, dueDate, quantity, total}を挿入します。

images/openrpa_workflow_example_read_excel_add_invoices_data_table.png

3.A.4.4. DataTableからExcelを書き込む

これは、ワークフローの最後の部分である。ここでユーザーは最終的に、収集したすべてのデータを含むExcel ファイルを 作成することになります。

WriteExcelアクティビティをメインシーケンスの末尾にドラッグしてください。

...ボタンをクリックして、Excel ファイルを保存するファイル名を選択します。表示されるエクスプローラーウィンドウのファイル 入力フィールドにファイル名を入力します。その後、「保存」を押して、最終的に割り当てます。

収集したデータをExcel ファイルに保存するDataTable の名前を、Properties ボックスの DataTableプロパティに入力し、指定します。

Excel ファイルのスタイル設定に使用するテーマを、プロパティボックスの Themeプロパティに入力します。

images/openrpa_workflow_example_read_excel_write_excel.png

3.A.6. ファイルの操作

この例では、OpenRPAでファイルを操作する方法を説明します。ファイルの保存、移動、削除、および基本的なディレクトリ操作など、すべての基本的な手順が網羅されています。

異なるタイプのファイルを含むディレクトリがあるとします。最初の作業は、これらのファイルを拡張子に従って異なるサブディレクトリに分離することです。.txtでないファイルは削除されます。

その後、ロボットは.txtファイルにアクセスし、与えられたキーワードを検索する。ここでのアイデアは、製品の説明文の分類の自動化をシミュレートすることです。もしファイルがキーワードを持っていれば、特定のサブディレクトリに移動されます。

各アクションの後、ロボットはファイルの名前、作成日、ファイルに含まれる商品情報(種類、価格、割引)などの情報をログとしてエクセルシートに書き込む。

手順は以下の通りです。

  1. 新規ディレクトリの作成

  2. DataTableの作成

  3. ディレクトリ内のファイルを繰り返し処理する

  4. ファイル名の取得

  5. 拡張子でファイルを分ける

  6. ファイルを読む

  7. ファイル作成日の取得

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

  9. 移動ファイル

  10. ファイル名の変更

  11. DataTableに情報を追加する

  12. ファイルの削除

  13. データテーブルをExcelファイルに保存する

3.A.6.1. 新しいディレクトリを作成する

最初のステップは、ファイルのあるディレクトリ(ルートディレクトリ)を指定することです。これを行うには、新しいSequenceを開始し、AssignActivityをその中にドラッグします。To “フィールドに、既存の引数を指定します。この引数のタイプは「String」でなければなりません。なぜなら、ディレクトリへのパスはテキストとしてこの引数に割り当てられるからです(つまり、引用符で囲まれます)。

次のステップでは、ファイルの移動先となるサブディレクトリを作成します。この例では、製品情報を含むファイル(「製品情報」)、製品情報を含まないファイル(「その他のtxtファイル」)、ログファイル(「Logs」)の3つのディレクトリを作成します。作成の手順はどれも同じで、違うのはそれぞれの名前だけです。

新しいディレクトリを作成するには、ユーザーはAssignActivityをSequenceにドラッグします。最初のフィールドで、ユーザーは別の引数を指定します。この引数のタイプは、「Browse for Types…」オプションで確認できます。ユーザーは、”System.IO.DirectoryInfo “と入力するか、参照することができます。この引数は、文字列や整数を格納するのではなく、新しいディレクトリを作成するための式を受け取ることを意味します。引数の名前はディレクトリの名前にはならないので、ロボットの使用のためだけであることに注意してください。

images/openrpa_manipulatingfiles_createdirectories.png

2番目のフィールド(すなわち「VB式の入力」)には、ユーザーは「System.IO.Directory.CreateDirectory(path of the new directory)」と入力することになります。括弧の中には、ルートディレクトリのパスと新しいディレクトリの名前を、すでに存在しているかのように入力します。ここでも、パスは引用符で囲む必要があります。たとえば、次のようになります。

ルートディレクトリが「C:example」の場合、ユーザーは「C:examplesubdirectoryName」と入力して、サブディレクトリを作成する必要があります。

3.A.6.12. ファイルを削除する

この例ではテキストファイルのみを対象としているので、他のファイルは削除されます。このアクションは変数に格納する値を生成しないので、変数や引数を使用することはできません。そのため、ユーザーはもう一度Invoke CodeActivityを使用する必要があります。

この例では、.txtでないファイルだけが削除されます。つまり、このActivityは、ファイルの拡張子フィルタのELSEフィールドに落とされることになります。

ファイルを削除する最短の方法は、エディタに次のコードを追加することです。System.IO.File.Delete(file_name).

images/openrpa_manipulatingfiles_deletefile.png