こんにちは。Kです。

前回、UiPathを使用した業務効率化ということで、入力データの準備から取り込み、システムへのログインまでの操作をご紹介しました。
その際に業務フローの理解のため、下記の内容を書き出しました。
※詳細は非エンジニアでもできる!UiPathを使用した業務効率化(前編)をご覧ください。
今回は3.以降、システム内での操作や実際にデータを入力するフローを作成していきます。

1.Excelなどで、入力する元データを用意する
2.ZACにログインする
2-1.ブラウザを立ち上げる
2-2.ZACを開く
2-3.ID、パスワードを入力する

ーーーーーーーここからーーーーーーーーー

3.入力画面まで遷移
3-1.メニューを順次クリック
3-2.経費申請者のアカウントに代理ログイン
4.必要項目の入力
4-1.発生日、勘定科目などを入力
4-2.登録ボタンをクリック

3.入力画面まで遷移

3-1.メニューを順次クリック
3-2.経費申請者のアカウントに代理ログイン

手動で作業する場合はZACへログイン後、入力画面へ遷移するためにメニューをクリックしていきます。
この手の申請業務をされている方にはおわかりいただけるかと思いますが、通常申請された経費の件数が多ければ多いほど作業量が増えますね。

UiPathでは、何度も繰り返し処理する必要のある作業をすべてループの中に組み込むことで、処理するデータの内容が違っても同じ処理を覚えさせることができます。
それでは、UiPath内で繰り返し処理を仕込んでいきましょう。

ここでは、手動で入力する際のフローと別に、UiPath内での処理について下記4つのフローに分けています。

■繰り返し処理

■社員番号の照合

■ログイン者変更

■画面遷移

■繰り返し処理

この「繰り返し処理」では、下記データを1行ごとに処理します。 1行目は見出し行であるため、2行目から処理を開始し、最終行まで繰り返し入力処理を実行していきます。

使用アクティビティは「繰り返し(各行)」です。

「繰り返し(各行)」では、「【何】を【どういう単位】ごとに繰り返し処理するか」を「コレクションと要素」で指定します。 今回は「データテーブルを行ごとに」処理するため、「コレクション」にはデータテーブル名、「要素」には行を意味する “row”を指定します。
「コレクション」とは、どのデータテーブルを繰り返し処理するかを指定するものです。

■社員番号の照合

2行目は社員番号244の鈴木さんで、現在は自分のアカウントにログインが完了している状態です。
社員から申請された経費を代理入力するには、その社員のアカウントにログインする必要があります。
記の【繰り返しのイメージ】図ですが、この時点では一度も代理ログインをしていないため、直前まで処理していた社員番号の識別ができません。
そこで、初期設定のために変数をひとつ作成します。

「body」だったシーケンスに「必要項目入力」と名前を付け、String型の変数「今の社員番号」を作成しました。
スコープは「必要項目入力」、規定値(初期値)を存在しない社員番号の「0」に設定しています。

こうすることで、最初の照合時に0(初期値)と244(鈴木さんの社員番号)を比べることができるため、ログイン者変更の画面に遷移させる処理に移行することがわかります。

さて、ログイン者変更をするか識別させるためには、UiPath内で0と244を比べなければなりません。
使用するアクティビティは「条件分岐」です。

Conditionに「今の社員番号=row.Item(“社員番号”).ToString」と入力しました。
条件分岐のアクティビティ自体がThen(Yes)Else(No)の二択で構成されているため、入力する内容もYes,Noで答えられるものでなければなりません。

ここで入力した内容は、「今の社員番号に設定されている番号(現時点では初期値の0)が、『経費一覧』というデータテーブルの中で、1行目の『社員番号』という見出しのセルと同じかどうか」という問いです。
「.ToString」は、「社員番号」という見出しから取り出した値を文字列に変換するもので、変数以外を入力する際に頻繁に使用します。 ※「.ToString」はおまじない。

該当するセルはA2の244のため、戻り値はElse(No)となります。

■ログイン者変更

さて、ここから、右のElseの箱にログイン者変更の処理を組み込んでいきます。

ZAC上での操作は下記の通りです。

ここまではクリックのみですね。

実際にUiPathでアクティビティを組み合わせると下記のようになります。

過程がひとつ足りないと思いましたか?
実は、右側のプロパティで「クリックをシミュレート」を「True」に設定することで、「隠れているだけのメニュー」をピンポイントでクリックすることができます。
これは、クリックした際に画面が遷移せずに表示されるメニューにのみ有効です。
他にも、画面上で重なったウィンドウの項目をクリックする場合にも適用可能です。

さて、ZACのログイン者変更の画面で社員番号を入力し代理ログインしましょう。
使用するアクティビティは「文字を入力」「クリック」です。

<a

テキストボックスには「row.Item(“社員番号”).ToString」と入力しました。
「データテーブル内で処理中の行の、『社員番号』という見出しのセルの内容を文字列として入力」という指示です。
先ほどの社員番号の照合と同じく、該当するセルはA2の「244」です。

戻り値の「244」が入力され、ZACのデータベース内で該当する鈴木さんが表示されました。
このままシーケンス「変更ボタン押下」の処理に移ります。

■画面遷移

遷移したZACの画面では、鈴木さんのアカウントにログイン者変更の権限がないため、操作取消と表示されています。

ここで、赤枠の中を見てみましょう。
クリックすると、先ほどと同じく隠れたメニューが表示されます。

今回使用するメニューは「各種経費申請」です。
ZAC上で操作する場合、「各種経費申請」をクリックして遷移した画面では、更に「新規申請入力」をクリックします。
ここまでをUiPathで作成してみます。

「各種経費申請クリック」のシーケンス内でクリックする項目は前述のとおり隠れたメニューのため、「クリックをシミュレート」を「True」に設定しました。
ここでも使用するアクティビティは「クリック」のみのため、先ほどのおさらいですね。

新しいウィンドウが開いて入力画面に遷移しました。
ここから一気に必要項目を入力していきます。

■Then(Yes)側の処理

「条件分岐」アクティビティ内で、直前まで処理していた社員番号が次の行の社員番号と違った場合(戻り値がElse)の処理を右側の箱に作成しました。
左側の箱では、社員番号が同じならアカウントの切り替えをする必要がないため、スルーさせるという意味でコメントを挿入します。

これは前回の記事でも記載した「こまめに名前を変更すること」と同じように、何をさせるための処理かをわかりやすくするために大切なことです。

4.必要項目の入力

4-1.発生日、勘定科目などを入力
4-2.登録ボタンをクリック

ここから、データテーブル内のデータを登録画面に入力していきます。
UiPath内でのフローは下記のように分けました。

■社員番号の格納

■日付と金額の書式変換

■項目の入力

■アカウント切り替え時の処理

■社員番号の格納

3.でログイン者変更をした際に、照合用に「今の社員番号」という変数を作成しました。
これは初期値を0に設定してありますが、現在処理中の列が終了した後次の行の処理をする際、現在処理中の「244」と照合するために「今の社員番号」を上書きしなければなりません。
ログイン者変更の処理が完了したこのタイミングで挿入してしまいましょう。

ここで使用するアクティビティは「代入」です。

左側のテキストボックスに格納先の変数名、右側のテキストボックスに格納する内容を入力します。
今回は、現在処理中の社員番号を格納したいため、格納先の変数名は「今の社員番号」、格納する内容は「row.Item(“社員番号”).Tostring」を指定しました。
社員番号照合の時と同じく戻り値は「244」のため、「今の社員番号」に「244」が設定されます。

■日付と金額の書式変換

前回作成したデータテーブル内(元データのExcel内)で、日付と金額の値がどのように表示されていたか覚えていますか?
Excelでデータを作成する際、多くの場合は日付は”yyyy/MM/dd”、金額は”¥0,000″と表示するのではないでしょうか。
特に日付の場合は、データの形式を変えるとシリアル値に変換されてしまうこともあり、取り扱いが難しい数値だと思います。
金額についても値をそのまま貼り付けようとすると¥マークが挿入されてしまうこともありますよね。

そこで、UiPath内でもデータの内容を統一するために書式を指定して変数に格納してしまいましょう。
使用するアクティビティは先ほどと同じく「代入」です。

社員番号の格納と合わせて、一つのシーケンスにまとめました。
日付の格納の際に入力した式は「DateTime.Parse(row.Item(“発生日”).ToString)」です。
「row.Item(“発生日”)」(処理中の行の「発生日」という見出しのセル)を「.ToString」で文字列に変換した後に、更に「DateTime.Parse」でDateTime型に変換しています。
これを格納する変数はDateTime型で作成します。

金額の格納の際に入力した式は「row.Item(“金額”).ToString」です。
こちらは先ほど社員番号を格納する際に使用した式と同じで、違いは「金額」という見出しのセルを指定していることのみですね。

これで入力のための書式設定が完了しました。

■項目の入力

前回用意したデータと対応した入力画面は下記の通りです。

データ

入力画面

入力画面を参考に、下記を入力していきましょう。
①日付の入力
②JOBNoの入力
③費目(コンボボックス)の選択
④金額の入力
⑤乗車区間の入力
⑥訪問先の入力

①日付の入力

「文字を入力」のアクティビティを使用して日付を入力します。
テキストボックスが年、月、日で分かれているためそれぞれ対応する値を抜き出すと、下記のようになります。

年=「日付.Year.ToString」
月=「日付.Month.ToString」
日=「日付.Day.ToString」

「DateTime型の変数『日付』の中から『年(月、日)』を文字列にして入力」という意味ですね。

②JOBNoの入力

使用するアクティビティは「文字を入力」、入力する内容は「row.Item(“案件No.”).ToString」です。
お馴染みになってきた「データテーブル内で処理中の行の、『案件No.』という見出しのセルの内容を文字列として入力」です。

ZAC内で情報を紐づけていて案件No.を入力すると集計コードが自動で反映されるため、集計コードの入力はスルーします。

③費目(コンボボックス)の選択

コンボボックスの項目です。

左のコンボボックスの項目は一つ、右のコンボボックスの項目はエンジニアの交通費の申請のため、選択する項目はどちらも一番上です。
実は、選択する方法が2つあります。

使用するアクティビティは「ホットキーを押下」もしくは「項目を選択」です。

選択する項目が毎回同じ場所にある場合はAの「ホットキーを押下」、選択する項目が毎回同じ内容の場合はBの「項目を選択」が有効です。

A.「ホットキーを押下」を使用する場合、必ず画面右のプロパティで「入力前にクリック」にチェックを入れましょう。
ホットキーは「down」を選択しているため、実際の動作としては「クリックした後に十字キーの下を押す」のと同じです。
これで一番上の選択項目が設定されました。
2番目以降の項目を選択する場合、同じアクティビティを回数分組み込みます。

B.「項目を選択」を使用する場合、アクティビティ内のテキストボックスに実際に選択する項目を入力するか、スクリーンショットを設定した後にアクティビティ内のコンボボックスで選択する方法があります。
ブラウザ上で対象のコンボボックスを選択してスクリーンショットを設定すると、アクティビティ内のコンボボックスにも反映されるのは非常に便利ですね。

④金額の入力

次に、金額を入力します。

使用するアクティビティは「文字を入力」ですが、Excel 上で金額表示だったものをUiPath の変数に格納すると、文字列の「¥0,000」に変換されています。
これまで通り「金額.ToString」で入力しようとすると「¥」まで入力されてしまい、多くの数字のみ入力できるフォーマットではエラーで弾かれてしまうかと思います。

そこで、「¥」以降の文字を入力するため「金額.Substring(1)」を使用します。
「String型の変数『金額』の中から2文字目以降を取り出して入力」という意味です。
UiPath内では、文字列の1文字目を「0」として扱うため、2文字目を指定する場合は「1」を指定します。

これで2文字目以降の「314」が入力されました。

⑤乗車区間の入力

乗車区間を入力していきます。
交通機関は先ほどのコンボボックス選択のBを使用して「電車」に設定しています。

入力した内容は「row.Item(“行き”).ToString+row.Item(“⇔”).ToString+row.Item(“帰り”).ToString」です。
先ほどまで単体でのみ入力していた項目も、「+」を使用することにより複数のセルを組み合わせて入力することができます。

⑥訪問先の入力

訪問先も同じく⑥の項目をまとめて入力します。

使用するアクティビティはこれも同じく「文字を入力」、入力内容は「row.Item(“①内容(用途)”).ToString+” ”+row.Item(“②場所(目的地、支払先)”).ToString」です。
このように、間にスペースを挟むこともできます。

登録

最後に、登録ボタンを押下して完了です。


「明細登録」のボタンを押下すると右のメッセージボックスが出現するため、「クリック」のアクティビティを2回使用しています。

■アカウント切り替え時の処理

登録のフローは完了しましたが、手動で登録する際も次の行が現在処理している社員以外からの申請だった場合、アカウント切り替えのために一旦代理ログインしているアカウントからログアウトする工程を踏みます。
最後にこの処理を仕込みましょう。

■社員番号の照合で作成した条件分岐のシーケンス(「社員番号照合」とタイトルを付けました)のElse内最上部に、ログアウトの処理を追加します。

※諸事情によりアクティビティ内スクリーンショットが反映されていません。申し訳ありません…

社員番号の照合により、処理しようとしている行の社員番号が直前に処理していた社員番号と違った(戻り値がElseだった)場合、「戻る」ボタンを押してログアウトします。

このボタンは2.ZACにログインするで管理者アカウントにログインした際には存在しないものなので、「これから処理しようとしている社員番号が直前に処理した社員番号(初期値は0)と違い、尚且つ戻るボタンが存在する場合にボタンを押下する」という指示を与えます。

使用するアクティビティは「要素」と検索するとヒットする「CV要素の有無」(赤枠)と「条件分岐」(青枠)です。

「要素の有無」のアクティビティを使用するにあたって、下部青枠の変数を作成します。
変数の型を「Boolean」に設定することで「真(true)」か「偽(false)」を判定し、その後のアクティビティを分岐させることができます。
わかりやすく「判定」と名前を付けました。

赤枠「CV要素の有無」アクティビティ内のスクリーンショットには戻るボタンを撮影して指定し、青枠「条件分岐」アクティビティ内のConditionに「判定」の変数を指定します。
これで1行目の処理時、初期値の0と処理する行の社員番号を照合した際に戻るボタンが存在しないためElseに分岐し、戻るボタンの押下がスルーされます。
Then時は「クリック」のアクティビティで戻るボタンのスクリーンショットを指定することで押下の処理が入ることになります。

以上ですべての処理の設定が完了しました。

さいごに

ここまで、様々なアクティビティを使用してフローを作成してきました。
前回の記事にも記述した通り、これ以外にも、それこそ「なんでもできる」のではと思うくらいのアクティビティが実装されており、やりたいことを検索するだけで「○○する」という名前で候補が提示されるUiPathは素晴らしいものだと思います。

しかしながら、やはり頻繁にアップデートが入るようなシステムとは相性が悪く、せっかく作成したフローも元のシステムの仕様が少し変わるだけで動かなくなってしまうということもあります。
RPAのプラットフォームは他にもたくさん展開されていますので、自動化したいシステムの特徴を理解したうえで、適切なツールを使用して是非業務効率化にチェレンジしていただければと思います。

自動化を検討するうえで何か困ったことがあれば是非弊社にもご相談ください。
長くなってしまいましたが、ここまでお読みいただきありがとうございました。

K
CSVIT事業部 K
アニメやゲームを嗜みながら自由気ままに生きるのが夢。とは言いつつも日々スプレッドシートの関数と戦っています。