【RPA】オフィスステーションへの自動ログインと公文書取得を自動化した話
はじめに
今回もPAD(Power Automate Desktop)のお話です。
前回のKiteraアップロードRPA化に続き、今度はオフィスステーションへの自動ログインと公文書の一括取得をRPA化しました。
今回もRPA
note開始当初は、VBAやPythonのことを書くつもりでした。
RPAは何年も前から興味はあったものの上手くいかずだったのですが、なぜかnoteで投稿し始めてから成功し出して(AIさまさまです)、RPAばかりの投稿になっています。おいおい、RPA以外も投稿しようと思います。
今回はオフィスステーションへのログインと公文書取得です。オフィスステーションへは毎回ログインID・パスワードの入力に加え、乱数表認証があります。これが地味に手間で…。ログインするたびにExcelで乱数表を開いて、指定された座標の数字を探して入力する、という作業が発生していました。
公文書取得は、帳票画面へ移動、手続状況(審査中・審査終了・手続終了)の判定、チェックボックス1をONにして、一括ダウンロードする作業を今のところ手作業で行っています。
数年前に退職した事務所では、開発済みのRPAを購入して、この作業を自動化していました。その頃はAIがまだそんなに使われていなかったから、自力では到底できなかったのですが、本当は自分で作りたかった・・・。という気持ちを持ったままでいてたので、今回の成功は過去の自分に教えてあげたいです。
今回はトリプルディスプレイ環境での罠にもはまりつつ、なんとか完成までこぎつけましたので、フローをご紹介します。
フローの全体像
今回は大きく分けて、2フェーズで構成されています。
ログインフェーズ:ブラウザを起動、ID・パスワード入力、乱数表入力
公文書取得フェーズ:対象案件にチェックを入れて一括出力する
フロー詳細
【1.ログインフェーズ①】ブラウザ起動〜ログイン
| 1 | 新しいブラウザを起動
| 2 | ウィンドウをメインディスプレイ(座標0,0)に移動
| 3 | キー送信(Win+↑)でウィンドウを最大化
| 4 | ログインIDを入力
| 5 | パスワードを入力
| 6 | ログインボタンをクリック
トリプルディスプレイ環境の罠
私は在宅勤務で、トリプルディスプレイで作業しています。その環境では、メインディスプレイ以外でブラウザが起動するとUI要素がうまく認識されないことがありました。「ウィンドウの移動」アクションで座標(0,0)に強制移動してから操作する方法で解決しました。これは今後使えそう。
また、移動後にウィンドウが小さくなってしまうため、`{LWin}{Up}` のキー送信で最大化しています。
【1.ログインフェーズ②】乱数表認証フェーズ
ログイン後、乱数表認証画面が表示されます。毎回異なる座標(アルファベットと数字)2つ指定されるので、対応する数値を入力する必要があります。乱数表はExcelで作成し、それを読み込んで、表示された座標と一致するものを入力するという方法をとりました。
| 1 | Excelを起動(バックグラウンド)
| 2 | ワークシートの全データを変数に格納
| 3 | Excelを閉じる
| 4 | 画面上の1つ目の座標ラベルの取得
| 5 | サブテキストの取得で列と行に分解
| 6 | Excelから該当セルの値を取得
| 7 | 1つ目の入力欄に値を入力
| 8 | 2つ目の座標も同様に処理
| 9 | 「次へ」ボタンをクリック
ポイント:セレクターの動的化
乱数座標は毎回変わるため、UI要素をキャプチャしたままでは固定値(例:`B5`)として認識されてしまい、次回以降エラーになります。セレクターのテキストエディターで末尾の条件を「``で始まる」に変更することで、毎回変わる座標に対応できるようにしました。たぶんこういうところが、私のような非エンジニアが躓くところなんだろうな、と思います。
【ポップアップ対応】お知らせを閉じる
ログイン後、「お知らせ」のポップアップが表示されることがあります。大抵のソフトでたまに出てくる「お知らせ」ってありますよね。
毎回表示されるとは限らないため、「Webページに次が含まれる場合」アクションで「とじる」ボタンの存在を確認し、ある場合だけクリックする条件分岐にしています。
【公文書取得フェーズ】対象案件のチェックと一括出力
| 1 | 「Webページからデータを抽出する」でテーブル全体を取得
| 2 | カウンター変数(Count)=0で初期設定
| 3 | 行インデックス変数(RowIndex)1で初期設定
| 4 | For eachで全行をループ処理
| 5 | 「状況」列に「終了」が含まれる行のチェックボックスをONにする
| 6 | Countを+1、RowIndexを+1
| 7 | ループ終了後、Count=0なら「対象なし」メッセージを表示して終了
| 8 | 「公文書・コメント一括出力」ボタンをクリック
「手続終了」「手続終了(返戻)」「審査終了」はすべて「終了」を含むため、1つの条件でまとめて対応しています。「審査中」はこれに該当しないためスキップされます。
ポイント:チェックボックスの動的指定
各行のチェックボックスを動的に指定するために、セレクターの行番号部分(`dataitem:eq(1)` の `1`)をRowIndex変数に置き換えています。これにより、ループのたびに対象行が自動的に変わります。
ブラウザの使い分け
Webブラウザの起動で、ChromeとEdgeを試したのですが、UI要素の取得方法にも違いがありました。
Chrome:UIオートメーション「ウィンドウにあるUI要素の詳細を取得する」でOK
Edge:ブラウザー自動化「Webページ上の要素の詳細を取得する」を使わないと認識されない
同じ操作でもブラウザによって動作が変わるのは少しはまりポイントでした。
ハマりやすいポイントまとめ
■UI要素が認識されない問題
(原因)トリプルディスプレイでメインディスプレイ以外でブラウザが起動する場合がある
(解決策)ウィンドウの移動(X:0, Y:0)を追加
■乱数座標が固定値として認識される問題
(原因)セレクターが特定の値で固定されている
(解決策)セレクターを「`*`で始まる」に変更
■ウィンドウ起動の状態により、UI要素が認識されない
(原因)移動でウィンドウ状態がリセットされる
(解決策)キーの送信(Win+↑)で最大化
まとめ
前回のKiteraに続き、オフィスステーションの自動化も無事できました!
乱数表認証という独特の仕組みへの対応と、毎回変わるUI要素のセレクター動的化がこの自動化の肝でした。セレクターの固定値問題は最初はまったく原因がわからず、Claudeに聞きまくって解決できました。聞きながらでも触っていくうちに、ちょっと慣れてきたかも、と思っています。
毎日のログイン作業がボタン一つになったのは、地味ですが積み重なると大きな時短です。オフィスステーションで取得した公文書の解凍、IEモード問題は別途投稿を考えています。
今後もちょこちょこRPA化できる業務を見つけてチャレンジしていきたいと思います。同じような環境で業務されている方の参考になれば幸いです。
