【初心者向け】UiPathによるRPA実装30 For Eachループ中にエラーが発生した際のスキップ処理2

前回の記事では、申請書に不備(入力項目の1つ以上がブランク)があった場合に、どのような処理フローにするかを、以下の図のように設計しました。

今回の記事ではこの設計内容に沿って、自動化処理を実装していきたいと思います。

<スポンサーリンク>

事前準備

実装作業を行う前に、2点ほど準備をお願いします。

「処理済み」及び「不備あり」フォルダの作成

処理した申請書を移動する先として、「処理済み」と「不備あり」の2つのフォルダを作成しておいて下さい。

本記事では、アプリフォルダ直下、「申請書」フォルダと同じ階層に作成します。

不備あり申請書のダウンロード

例によって、使用する申請書をGitHubにアップしておきましたので、以下リンク先よりダウンロードしてお使い下さい。

GitHub ( 第30回用Excelファイルダウンロードリンク )

といっても、申請書上の4つの項目のうち、1つ以上をブランクにすれば不備あり申請書になりますので、ご自身で作成しても全く問題ありません。

また、アップしているzipファイルには正常な申請書3つと不備あり申請書1つが入っていますが、正常な申請書3つはこれまで使用してきたものと同じものです。

自動化処理の実装

それでは、順に自動化処理を実装していきましょう。

エラーフラグの定義と初期化

まずはエラーフラグをBoolean型のVariableとして作成し、For Eachループに入る前にFalseで初期化しておきます。

VariablesペインでVariableを作成した後、ループ前にAssign Activityを入れます。エラーフラグのVariable名は、ここでは「errorFlag」としておきます。

申請書不備チェックの追加

続いて、「申請書のAppへの登録」Sequence内の、「Excelデータのコピー」Sequenceの直後に、読み取った申請書中のデータのうち1つでもブランクのものがないかを判断するIf Activityを追加します。

Condition内には「empNo = “” or expDate = “” or expItem = “” or expAmount = “”」と記入します。

「A or B or C or …」という式は、「A, B, C, …のいずれか1つでもTrue」であればTrueを返す式です。したがって、上の式は、「empNo, ExpDate, expItem, expAmountのどれか1つでも”” (ブランク)であればTrueを返す」という意味になります。

また、「Excelデータのコピー」Sequenceの最後に、Write line Activityがあると思いますが、今となっては不要ですし、申請書に不備がある場合はここでエラーになってしまいますので、削除しましょう。

不備がある場合の処理追加

上記の条件式にてTrueと判定された場合の処理を、If ActivityのThenの中に追加します。

入れる内容と順序は前回の設計内容に基づき、以下のようになります。

  • エラーフラグをTrueに設定(Assign Activity)
  • 申請書ファイルを「不備あり」フォルダに移動(Move file Activity、From-Path Propertyには「item.ToString」と入力することにより、移動元のファイルを指定できます)
  • 「申請書」フォルダ内のファイル一覧を再取得(Assign ActivityでDirectory.Getfiles関数を使用)
  • Breakでループを抜ける(Break Activity)

Breakは今回初登場ですが、Activitiesペインで「break」と検索すると1つしか出てきませんので、すぐに分かると思います。

不備がない場合の処理追加

今度は逆に、条件式にてFalseと判定された場合の処理を、Elseの中に追加します。

入れる内容、順序は以下の通りです。

  • 申請書ファイルを「処理済み」フォルダに移動(Move file Activity)
  • アプリケーションへ申請書データを入力(作成済みの「Appへの登録」Sequenceを移動するだけです)

また、ついでに、If Activityの名称を分かりやすいものに変更しておきましょう。

ループを再度回すかどうかの判断処理追加

続いて、For Eachの直後に、不備の有無と残申請書の有無に応じて、再度ループに戻るかアプリのクローズ処理へ移るかを決める条件分岐を入れます。

ここではFlow Decision Activityを用います。

設計書では条件分岐を2つ書きましたが、結局2つの分岐の結果、不備でループが終わって(errorFlagがTrue)、かつ、残ファイルがある(fileList.Lengthが0でない)であれば再ループへ、そうでなければアプリクローズ処理へ遷移するという2つに集約されますので、1つの条件分岐にまとめることができます

ということで、Flow Decisionを追加し、Conditionには「errorFlag and fileList.Length <> 0」と入れておきます。

「A and B and …」という式は先ほど紹介したorとは逆で、AもBも、それ以降もすべてTrueを返す時にTrueとなります。なお、1つめの条件「errorFlag」は「errorFlag = True」と書いても良いですが、そもそもerrorFlagを参照すると自動的にTrueが返ってきますので、「= True」を付ける必要はありません。

さらに、Flow Decisionのラベルについても、必要に応じて修正しておきましょう。DisplayName Propertyも修正するのが、分かりやすくて良いと思います。

全て不備申請書だった場合の結果ファイル更新処理の修正

さて、以上で再ループに関する処理は完成しましたが、ワークフロー上にはもう1点修正すべきところがあります。それは、「結果ファイル更新」です。

このボックスのTryブロックでは、プロジェクトフォルダに生成された”expense.txt”をアプリフォルダに移動するためにMove file Activityが使われていますが、処理対象としたすべての申請書に不備があった場合、アプリへの登録処理は行われないため、プロジェクトフォルダに”expense.txt”が作成されません。そのため、Move file Activityを実行した時ににIOExceptionが発生します

幸い、その下のCatchブロックでこのExceptionが拾われるわけですが、今度はCatchブロック内のRead text file Activityで存在しないファイルを読みに行こうとして、また別のExceptionが発生します

対応方法は色々考えられるのですが、今回はCatchブロック内にIf Activityを入れ、expense.txtが存在する場合のみ、既存の処理、つまり、プロジェクトフォルダ内のexpense.txt内容を読み取って、アプリフォルダ内のファイルに追記する処理を実施するようにします。

If ActivityのConditionには、「Directory.Exists(“expense.txt”)」と入れます。これはexpense.txtが存在する場合にTrueを、存在しない場合にはFalseを返す式です。

テスト実行

それでは、自動化した処理が正しく動くか、実際に実行して確かめてみましょう。

「申請書」フォルダ内に、正常な申請書のみが存在する場合、正常/不備申請書のいずれも存在する場合、不備申請書のみが存在する場合のように、ケース分けして何度か実行してみて下さい。

意図した通りに動くことが確認できましたでしょうか。

なお、今回の実装を行うことで、プログラムを走らせるたびに「申請書」フォルダから申請書ファイルがなくなることになります。これまでは自動化処理が終わっても「申請書」フォルダにファイルが残っていたため、プログラムを走らせる前に登録済み申請書を人手で削除するかどこかに移しておかなければなりませんでしたが、その手間も省けたことになります。

終わりに

前回、今回の2回で、申請内容に不備がある場合の対応を自動化しました。前回触れたように、不備の定義次第ではさらに機能を拡張する必要もありますが、興味がありましたら色々試してみて頂ければと思います。

さて、今回で初心者向けUiPathの使い方紹介は終わりにしたいと思います。かなり基本的なことを中心に紹介させて頂きましたが、あとは実際にプログラムを作成し、詰まったらWeb等で調べるということを繰り返すことで、徐々に実装スキルが磨かれていくものと思います。

とは言え、まだまだ紹介したい使い方も山ほどありますので、折を見てトピック的にご紹介できればと考えています。