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

今回は前回の予告通り、For Eachの応用として、「Excel申請内容に不備がある場合にそのファイルをスキップして処理を継続する」という操作を自動化していきたいと思います。

なお、長くなってしまうので、2回の記事に分けて説明していきます。

<スポンサーリンク>

実装方針の検討と設計

UiPathで対象とする不備の定義

さて、一言で「申請内容の不備」といっても、その種類は色々なものが想定されます。

例として、未記入事項がある、あるいは、あり得ない日付(2017年13月1日など)が設定されているなど、機械的に判断できるものもあれば、費目のつけ間違い、金額が通常想定されるものと乖離がある(例えば、通常6,000円程度あれば宿泊できる地域で、それより遥かに高額な宿泊費が発生している)、また、社員の役割の観点から、接待を行うことが想定されない社員により接待交際費の申請が行われているなど、不備かどうかを考える際に非定型的な判断を伴うものもあります。

後者は基本的にUiPathで対応することができず、ビジネスプロセス上に人間による確認/承認行為を盛り込んだり、AIの活用等による対応を行う必要があります。

前者の機械的な不備判断はUiPathで対応できますが、これについてもUiPathで実装するのか、それともExcelマクロを使う、アプリケーションの改修で対応する、あるいは、申請書の記載ルールを整備して社員に周知徹底するといった対応も考えることができます。

さらに言うと、後者の非定型判断を伴う場合であっても、それをルール化する、例えば前述の宿泊費の例であれば、10,000円以上であれば機械的に高額とみなして不備とするなどして、UiPathで対応を行うといったことも考えられます。

不備の対応は一例ですが、このように判断処理をUiPathで実装することを考える際、判断が機械的なものなのかそうでないのかを識別し、その上で、UiPathで対応すべき対象を何とするかを定義しておく必要があります

前置きが長くなってしまいましたが、本記事では簡単な例として、申請書に記入すべき4項目のいずれかが空欄の場合をUiPathで対象とする不備であると定義し、実装を進めて行きたいと思います。

実装方針の検討

さて、現行のプログラム上、申請書の内容を読み取る処理はFor Eachループの中にあります。この読み取り処理において不備が検出された場合、「処理中の申請書に対する操作を打ち切り、For Eachループの先頭に移り次の申請書の処理を行う」という操作が実装できれば、不備への対応処理は組み立てられそうです。

こういった、「ループの処理を途中で打ち切り、先頭に戻ってループを再開する」という制御について、通常のプログラミング言語ではcontinueなど専用の関数やActivity等が準備されていることが多いですが、UiPathではcontinueに該当するActivityが現状ありません。あるのはbreakという、ループを完全に終了し、ループの下に書かれている処理から実行を続けるActivityのみです。

したがって、UiPathでループの先頭から処理を再開したい場合は、このbreakを使って一工夫する必要があります。基本的には、

  • ループ中にエラーが発生した場合は、フラグを立てて、breakでループを抜ける
  • フラグをチェックし、立っていれば途中で終了したことを意味しているので、ループの先頭から再開する

という方針になります。

処理手順の設計

さて、今回自動化する処理は多少複雑になりそうですので、実装に入る前に手順をしっかり設計して置きたいと思います。

既存の処理フローのうち、「申請書Appへの登録」Sequenceを中心に修正していくことになりますが、その内容を図示したものが以下の図です。

図上の番号に沿って順にポイントを説明しますが、前提として、「一度読み込まれた申請書ファイルは、不備が有ったか無かったかによって、それぞれ「不備あり」フォルダか「処理済み」フォルダに移動する(「申請書」フォルダからは無くなる)」処理を追加することを頭に入れてお読みいただくと、理解が深まると思います。

①まずは申請書の有無で条件分岐がありますが、これはFor Eachループの繰り返し条件を意味しています。初めにFor Eachループに入るときには、事前に申請書有無チェックで「あり」と判定されていますので無条件にYとなります。この条件分岐は「アプリにデータ登録」処理からも矢印でつながれているため、繰り返し通ることになりますが、2回目以降通る際には、対応すべき申請書が「申請書」フォルダには無い場合もあるので、この条件分岐が実際に機能します。

②不備がない場合は、申請書ファイルを「処理済み」フォルダに移動した上で、アプリへの登録処理を行い、ループ先頭に戻って残りの申請書への対応を行います。

③不備がある場合、ループ開始前にFalseと設定していたエラーフラグをTrueにして、申請書ファイルを「不備あり」フォルダに移動し、その後にその時点で「申請書」フォルダに残っているファイル名の一覧をfileList Variableに入れなおします。その上で、ループをbreakで抜けます。

④ループから抜けるのは、2つの場合があります。1つ目は、処理が正常に完了し、「申請書」フォルダには処理すべき申請書ファイルが残っていない場合です。この場合、エラーフラグはFalseの状態でループから抜けることになります。したがって、Appクローズ処理へ遷移します。2つ目は不備が検出されてループを途中で抜けた場合です。この場合エラーフラグがTrueになっていますので、その下の条件分岐に遷移します。

⑤この条件分岐に入ってくるのは、不備が検出された場合ですが、その場合さらに2つのパターンに分けられます。1つは、「申請書」フォルダには1つもファイルが残っていない場合ですが、その場合はAppクローズ処理に遷移します。もう1つは「申請書」ファイルにはまだ対応すべきファイルが残っている場合です。この場合は、ループ前に戻り、エラーフラグをFalseにリセットした上で、③で更新したファイル名一覧を元に、再度ループを回します。

終わりに

今回は申請内容の不備対応について、自動化する処理が複雑であることから、設計を行いました。次回の記事では、この設計内容に沿って、一つずつ自動化処理を進めて行きます。