chido
(chido)
1
こんにちは。超初心者なのでわかりづらい質問かもしれませんが、アドバイスいただけると嬉しいです。
Excelで未処理のデータをもとにアプリケーションを操作し、その後作業日を該当データ行に入力する方法がわかりません。
【作りたいロボットの概要】
- WEB人事システムにログイン
- Excelの社員異動情報リストから、退職者情報をフィルターウィザードを使って絞り込み(検索条件:ステータスが「退職」かつ「システム登録日」列が空欄の行)
- 繰り返し(各行)を使って社員データをString型変数に代入し、WEB人事システムにアクセスして社員ステータスを退職に変更し、
- Excelの該当者の情報の行の「システム登録日」列に登録日を入力する(未処理データがなくなるまで、3~4の繰り返し)
【使用するアプリケーション】
Excel:社員の異動情報・退職情報が1万行分くらい入っています
WEB人事システム:社員情報を管理するシステムです
【わからないこと】
1-3まではできたのですが、4で「システム登録日」を入力するセルをどのように指定すればよいのかがわからず、困っています。
(最初の行などに入力されてしまいます)
試行錯誤しすぎてロボットがぐちゃぐちゃになってしまい、お見せできず申し訳ありません。
検索してもぴったりな解決方法を見つけることができませんでした。
大まかな考え方と使うメソッドなどを教えていただけると嬉しいです。よろしくお願いいたします。
HANACCHI
(はなっち!UiPath Japan MVP 2019-2022)
2
Excelの社員異動情報リストを読み込む時、「範囲を読み込む」アクティビティを使って、DataTable型に展開します。
DataTable型は、EXCELのシートの行、列のようにデータが格納できるものです。行単位には、「繰り返し(行単位)」アクティビティを使います。繰り返しの際の行単位の変数は、標準では「row」になります。そのrowから列の値を得るには、row.item(“列名”)とします。
ですので、row.item(“システム登録日”).ToString.Equals(String.Empty)がTrueだったら、代入アクティビティで、row.item(“システム登録日”) = Nowとすれば、DataTable型の領域にシステム日付が設定されます。
★ステータスも同じ考え方で、row.item(“ステータス”).ToString.Equals(“退職”)としたり。。。
「繰り返し(行単位)」アクティビティで、すべての行に対する処理が終了したら、「範囲を書き込む」アクティビティを使って、Excelの社員異動情報リストに書き戻してあげます。
1 Like
chido
(chido)
3
さっそくご回答くださりありがとうございます!!
初心者にもわかるように解説してくださって本当に助かります。
念のため確認させてください。
- 最初に1万行分のデータをすべてDataTable型の変数に格納する
- 繰り返し(行単位)アクティビティで、1のDataTable型の変数データの中のrow.item(“システム登録日”).ToString.Equals(String.Empty)がTrueかつ、row.item(“ステータス”).ToString.Equals(“退職”)がTrueのデータを使い、WEB人事システムを操作する
- row.item(“システム登録日”) = Nowを代入
- (2-3の繰り返しが終わったら)「範囲を書き込む」アクティビティで1万行分のデータを上書きする
という理解で合っていますでしょうか。
1万行分のデータがあるので、全部読み込んだり書き込んだりすると時間がかかるのではないかと素人ながら考えたのですが、そんなことはないのでしょうか。
もう少しお付き合いいただければ幸いです。ありがとうございます!
HANACCHI
(はなっち!UiPath Japan MVP 2019-2022)
4
その考えでOKですね。
但し、いきなり実装を開始すると大変なので、まず新たな「シーケンス」を作成し、小さいデータでどんな動きをするか、ちゃんと書き込めるか、保存しているか。。。などを検証してから、本実装していくことをお勧めします。
chido
(chido)
5
ありがとうございます。
まずは教えていただいたやり方で、テスト用のExcelを使って試してみます。
またご質問させていただくかもしれませんが、よろしくお願いいたします。
1 Like
Yoichi
(Yoichi)
6
こんにちは
今回のようにシステムに情報を書き込む業務の場合、途中でエラーが発生したときのリカバリーを考慮すると、最後に一括書き込みは方法としてあまりよくないケースが多いです。
(エラーが発生した際に、どこまで処理が終わったか、システム側を確認しないとわからないからです。)
基本的には1行単位の処理が完了すれば、エクセルに欠き戻す。データテーブル単位の書き戻しでパフォーマンスに影響がある場合は、セル単位でこれを行う方法や別ファイルでこれを管理する方がエラー発生時のリカバリーの観点からはベターです。
そのようにしておけば、仕掛レコードだけを手当すれば、単純リランでリカバリーできるからです。
逆にこのあたりを気にしなくてよいなら、最後に一括でも問題ないかと思います。
1 Like
HANACCHI
(はなっち!UiPath Japan MVP 2019-2022)
7
あっ!そうか!更新系か…
まぁ、既にWEB側の「ステータス」が「退職」になっている場合はそのままスルーするようなロジックでもOKですね。
金銭が伴うと、二重払い、多重請求になりかねませんね。
chido
(chido)
8
リスクについて教えてくださりありがとうございます。
Yoichi様のご提案の
基本的には1行単位の処理が完了すれば、エクセルに欠き戻す。
という方法も、まずは全データをDatatable型変数に読み込み、1行ずつチェックして今回の操作に関係ない情報であっても上書きしていく、を繰り返すという理解で合っておりますでしょうか。
10年間くらいの異動情報が全部詰まったExcelなのですが、毎月の退職者は3名など少ないです。
操作対象の退職者情報だけを抽出してシステム操作し、その退職者の行にだけ日付を入力できれば安心なのですが、そのようなロボットは一般的ではないのでしょうか。
Yoichi
(Yoichi)
9
こんにちは
今回処理しないレコードは、書き戻す必要はないと思います。そのレコードを処理する際に、確認し、既に更新済みであれば、そのレコードはスキップすることになると思います。
書き戻しはあくまで今回の更新処理が完了した情報を残すことが主眼かと思います。
操作対象の退職者情報だけを抽出してシステム操作し、その退職者の行にだけ日付を入力できれば安心なのですが、そのようなロボットは一般的ではないのでしょうか。
先に「セル単位で書き込むと」POSTしたのは上記に近く、テーブルを書き戻すのではなく、必要のある行(セル)だけに書き込む方法です。ただし書き込むセルのアドレスを算定するロジックは必要になる点ちょとだけ複雑になります。
chido
(chido)
10
はい、1つのExcelシートをずっと更新していく(異動情報が増えるたびに行が増えていく)ような、積み上げ式のリストになっております。わかりづらくて申し訳ありません。
WEBでは氏名検索して操作するしかなく、WEBへのアクセス回数は最小限にしたいと考えています。
したがって、Excelのデータが「ステータス」が「退職」かつ「システム登録日」が空欄の場合のみ操作し、そうでない場合はスルーする、となるのかと思っております。
1 Like
chido
(chido)
11
ありがとうございます。
方向性が大きくはずれていないことがわかって安心しました。
ただ、日付を書き込むセルを特定する方法がわからなくて困っておりました。
行のインデックスを使ったりするのでしょうか。。。
Yoichi
(Yoichi)
12
こんにちは
別でint32の変数(仮にiとし、初期値を最初のエクセルの行番号の値にする)を用意しておき
for each rowの中でひとつずつ増やしていく
セルの列は決まっていると思うので 例えばA列ですと
"A"+i.toString
がアドレスになります。
1 Like
chido
(chido)
13
ありがとうございます!
それで試してみます。今日はこれで失礼してしまうので、取り急ぎお礼まで。
1 Like
chido
(chido)
14
@Yoichi さん
@HANACCHI さん
まだ完成はできていないのですが、Yoichiさんの教えていただいたロジックで今のところうまく動きそうです!
また、条件設定についてもよくわかっていなかったので、HANACCHIさんが書き方を丁寧に教えてくださったのが役立ちました。
1週間ぐらいどうすればよいのかわからず悩んでいたので、本当に助かりました。
お二人のおかげです。ありがとうございました。
1 Like
system
(system)
Closed
15
This topic was automatically closed 3 days after the last reply. New replies are no longer allowed.