前回はフリーの RPA ツールのPulover’s Macro Cretorを使ってウィンドウの待機とIf文での条件分岐を実現しました。なぜ条件分岐が必要だったかというと、名前を付けて保存の確認ダイアログが表示されたり、されなかったりするからでした。
今回は、 RPA の実行中に名前を付けて保存の確認ダイアログが表示された場合に、RPAが自律的に判断するのではなく、人間に操作してもらう、エスカレーションを実現します。
フリーの RPA ツールPMCでエスカレーションを実現する
今回の記事でも、これまでと同様に前回までの RPA シナリオ利用するので、作成していない方は作成してくださいね。
さて、エスカレーションを実現するにはどういった要素が必要でしょうか?
ユーザーに操作してもらうために、通知するダイアログが必要ですね。それから、「名前を付けて保存の確認」ダイアログが表示されていることを認識するためのIf文が必要そうです。If 文は初めの頃は悩みやすいので、復習も兼ねて作って行きましょう。また、さらに今回はIf文の入れ子、Elseにも挑戦します。
この記事が役に立つ人
- Pulover’s Macro Creator で処理を止め、ユーザー入力によるエスカレーションを実現したい人
- If文をもっと使いこなしたい人
- RPA シナリオの実行の終了を通知したい人
- 定型業務と非定型業務が混在した業務で、定型部分を RPA 化したい人
この中で、「定型業務と非定型業務が混在した業務で、定型部分を RPA 化したい人」というのが少しイメージしにくいかもしれません。たとえば、ブログのライティング業務があったとします。「ブログのお題」、「素材」、「資料」などがまとめて管理システムなどに格納されているとします。
それらの必要な情報をどこからか自分のPCコピーしてきた後、開いてデスクトップに並べたら「ライティングを促す表示を出し」、実際にライターが記事を書き終わったら表示を消すと、今度は書き上がった成果物が提出される……、というような RPA シナリオです(お察しの通り、相当複雑なシステムになります)。しかし、そういうことも可能だ、という参考ですね。
関連記事
本連載の他の回や、Pulover’s Macro Creator 関連の記事はまとめページから探すのが便利です。
エスカレーションを実現する RPA を作成する
下準備
それでは、前回制作した、 RPA シナリオを開いてください。シナリオを開いたら、該当するタブで Ctrl + Shift + D、または、マクロメニューから「マクロを複製する」を選択します(DはDuplicate のDですね)。すると、前回の RPA が新しいタブにMacro2やMacro 3といった名前で複製されます。今回は、この複製された RPA シナリオを編集していきます。
まずは、前回作成した、IfWindow Active アクションから[EndIf]アクションまでを(If も含めて)削除します。
RPA シナリオが表示されたパネルは、上記のようになります。せっかく作成したIf文ですが、練習も兼ねて作りなおしましょう。
ユーザーに問い合わせるダイアログを作成する
削除がすんだら、Moveが選択された状態で、メッセージボックスボタン(Shift + F5キー)をクリックします。
表示された「メッセージボックス」編集ダイアログで、
- メッセージに「上書きするか決定してください」
- タイトルに「確認してください」
と入力してOKをクリックしてダイアログを閉じます。
いつも、タイムアウトには10秒を入れていましたが、ユーザーが入力するまで待ちたいので、ここでは0(無限に待つ)のままにします。
RPA を実行すると、「名前を付けて保存の確認」ダイアログが表示されるタイミングで、設定したメッセージボックスが表示されます。成功でしょうか?
残念ながら、If文がないのでtest.txtファイルを削除しても「確認してください」ダイアログが表示されてしまいます。まずこれをなんとかするところから始めましょう。
「指定ウィンドウがアクティブでないとき」のIf文を使う
今作成した[MsgBox]アクションを選択した状態で、If文ボタン(F10)をクリックします。
- If文の条件は、「ウィンドウがアクティブでない場合」
- WinTitleで「Title」からチェックを外し、ClassとProcess だけにチェックがついた状態で、「…」ボタンをクリック、メモ帳ウィンドウを右クリックします。
上図のような状態ですね。
前回は「ウィンドウがアクティブな場合」で「名前を付けて保存の確認」ダイアログがアクティブな時にIf文の中を実行しました。ただ、今回も前回も、「名前を付けて保存」ダイアログが非アクティブになった直後にIf文を実行しているので、実際にはほぼ同じ状態を示しています。
「名前を付けて保存の確認」ダイアログがアクティブになったときは、「メモ帳本体」は非アクティブですし、「メモ帳本体」がアクティブなときは、「名前を付けて保存の確認」ダイアログは非アクティブ(表示されてもいない)ということです。こういうことを、A = !B, !A = Bと書いたりします(もっとも、この条件は他のウィンドウがアクティブになってしまうときに成立しないので、正確ではないです)。
それはともかくとして、OKをクリックする前に、今回もウィンドウを特定するための文字列「ahk_class Notepad ahk_exe notepad.exe」をコピーしてクリップボードにいれておきます。コピーしたら、改めてOKボタンをクリックしてIf文のダイアログを閉じます。
上図のように、If文が挿入されました。
続けて、[EndIf]の行を選択し、ウィンドウボタン(F6キー)を押します。コマンドは「WinActivate」、アクティブにするのはメモ帳のウィンドウなので、先ほどコピーしておいたウィンドウを特定する文字列をペーストします。
test.txtファイルを消して実行してみると、今度は「名前を付けて保存の確認」ダイアログが表示されたときだけ、ユーザーの確認のためのダイアログが表示されます。
ここにWindowActivateコマンドを入れないと、MsgBoxが消えた後に、他のアプリケーションのウィンドウがアクティブになる可能性があるからです。というのも、MsgBoxでダイアログを表示しているのはメモ帳ではなく、Pulover’s Macro Creatorなので、通常のモーダルウィンドウとは挙動が大きくことなるからです。
本来、「名前を付けて保存」「名前を付けて保存の確認」ダイアログでも都度、WindowActivateでウィンドウをアクティブにする操作を入れた方が通知などに邪魔されることがなく安全です。ただ、この辺りは RPA シナリオを作成する手間や実行時間とのトレードオフでもあるので、自分で適切なバランスを見極めましょう。
また、無人で長い時間動作する RPA を動かすPCでは、可能な限り通知が発生しないように Windows10の集中モードを活用したり、そもそも日頃の業務のPCとは分けるなどの工夫が必要です。
ユーザーの入力に従うエスカレーションを RPA に実装する
さて、前節までの内容で、一応エスカレーションは実現できました。しかし、ユーザーが混乱して RPA が上手く動かなくなりそうなところが残っています。
そこは、ユーザーが「名前を付けて保存の確認」ダイアログで「いいえ」をクリックした場合です。このパターンをまだ試していない方は、試してみてください。「いいえ」をクリックすると、「名前を付けて保存の確認」ダイアログは閉じますが、「名前を付けて保存」ダイアログは閉じません。
これは言うまでもなく通常の動作ですが、 RPA の動作中としては「キャンセル」は保存しないで継続中にしたいところです。「OK」をクリックした際に、「名前を付けて保存」ダイアログが残っていたら閉じるという RPA を作ることもできますが、今回は「OKで上書き保存、キャンセルで保存しないで続ける」 RPA を作って見ましょう。
今回は作成しませんが、OKをクリックしたときにダイアログが表示されたままであれば、閉じて処理を継続する RPA も作って見ましょう。
ダイアログはEscapeキーで簡単に閉じることができます。また、次に示す通り、If文は2重構造にできます。
下準備
If文アクションと、[EndIf]アクションの間にある[MsgBox]アクションと、WinActivateアクションを選択して削除します。
If文とセットのダイアログを作成する
[EndIf]アクションが選択された状態で、メッセージボックスボタン(Shift + F5)を押します。メッセージとタイトルは、分かる内容であればなんでも大丈夫です。
ここで重要なのは、ボタンを「OK/キャンセル」にすること、「If文を追加」にチェックをいれること、「常に手前に表示」にチェックを入れることです(その他の項目は後で説明します)。
どの項目も読んで字のごとく……ではありますが、上図のように設定したら、OKボタンをクリックします。
すると、上図のように3つのアクションが同時に入力されます。
- [MsgBox]はメッセージボックスを表示するアクションです。今回は、OKボタンの他に、キャンセルボタンがあり、さらに、常に手前に表示されるメッセージボックス(ダイアログボックス)です。
- IfMessage Box (詳細)OK アクションは、直前のメッセージボックスで押されたボタンが OK だったとき(真だったとき)に、EndIfまでを実行するIf文のアクションです。
- [EndIf]は常に一番近いIf文の終わりを示します。
- IfWindow Not Active, [MsgBox], 最後の[EndIf]アクションの行番号に*, IfMessage Box アクションと次の[EndIf]アクションに**がついていることを確認してください。どのIf文のグループに属しているか、ということを示しています。
このように、If文の中にIf文があるような状態のことを入れ子と呼びます。プログラミングの世界では、余りに入れ子が深いとプログラムが読みにくくなるので嫌われる傾向にあります。 RPA シナリオでももちろん同様なのですが、 RPA の方が仕組み上、入れ子の回避が難しかったりします。
ともあれ、これで「メッセージボックスへの応答が OK であれば上書きする」 RPA が作れるようになりました。
OK ボタンが押されたときに上書きする RPA を作る
とはいえ、一度これは作っていますね。今回は、前回の RPA を複製して作っているはずなのでコピーしてきましょう。
複製元のタブを開き、If文の中、[Text]とWinWaitNotActiveアクションを選択し、Ctrl + Cでコピーします。そうしたら、今回作業しているタブに戻って、**の[EndIf]を選択した状態でCtrl + Vを押し、ペーストします。
上図のようにコピーできたでしょうか? このように改造する前に複製しておくと、必要になった部分を後からコピーできて便利なことがあります。
複製せずに作業を始めてしまった方は、2アクションだけなので手動で追加してしまいましょう。ここまでやってこられた方なら、問題なくできると思います。
このままでも上手く動作する場合も多いですが、今回はこれだけだと安定しません。なぜだったでしょうか?
そう、Pulover’s Macro Creator のダイアログが消えた後、どのウィンドウがアクティブになるか確実ではないのでした。コピーしてきた「WinWaitNotActive」アクションをダブルクリックして、編集ダイアログを開きます。
「名前を付けて保存の確認」ダイアログを指定するための文字列が、一番下のテキストボックスに入力されていますので、それをコピーしましょう。
コピーしたら、同じくコピーしてきた[Text]アクションを選択した状態で、ウィンドウボタン(F6キー)を押し、「WinActive」コマンドを追加しましょう。アクティブにするのは、もちろん「名前を付けて保存の確認」ダイアログですから、コピーした文字列が使えますね。
では、ここまで作業ができたら、一旦 RPA を実行してみましょう。
test.txtがある状態で実行すると、上図のようなダイアログが出てきます。OKをクリックすると、期待通りに動作しますね。また、他のウィンドウを選択しても、このダイアログが表示されたままであることが確認できると思います。
さて、さきほど解説を後に回した二つのオプションですが、
- 「アイコン」は、ダイアログのメッセージの左に表示されるアイコンを設定します。これといった決まりはないですが、今回のような用途では「エラー」よりも「?」の方が向いているかもしれません。
- 「デフォルト」は、最初から選択されているボタンになります。「メッセージボックス」コマンドでは最大3個までボタンが表示できるので「一番目~三番目」があります。今回は「二番目」を指定したので、最初からキャンセルボタンにフォーカスがあたっています。
ただ、もちろん、キャンセルボタンを押しても上手く動作しません(何も書いていないので当たり前ですが)。
**[EndIf]と*[EndIf]の間にアクションを記載しても、期待通りの動作にはなりません。たとえば、Escapeキーを2回押す、といった動作であれば上手く動いたように見えますが、実際には「OK」をクリックしてもその部分のアクションが実行されてしまいます。
どうしたらいいでしょうか?
「それ以外の場合」を実現する[Else]コマンド
先ほど追加した IfMessage Boxアクションは、Message BoxがOKだったときにIf文の中身を実行するものでした。であれば、「OK以外のとき」を判断できればよさそうです(キャンセルのとき、では半分正解です。ダイアログボックスはEscapeで閉じたり、「×」ボタンで閉じたりすることもできるからです)。
こういった「それ以外」に対応するコマンドが[Else]コマンドです。プログラミングでもおなじみの概念ですね。高校の数学ででてきた集合の概念で言えば、OK集合に対しての補集合と言えるでしょう。
[Else]コマンドの追加
では、[Else]コマンドを追加します。**[EndIf]アクションを選択した状態で、If文ボタン(F10)を押します。
表示されたIf文編集ダイアログに「Else」ボタンがあるので、これをクリックします。「Else」ボタンをクリックした段階で [EndIf]の前に、[Else]アクションが追加されているので、キャンセルをクリックしてダイアログを閉じます。
上図のようにアクションが記録されています。もし、「少し違うな」という場合でも心配ありません。ドラッグして位置を変えれば、[Else]はそれぞれの位置に対応する[Else]に代わります(そのため、*の数には気をつけるようにしましょう)。
後は、[Else]と[EndIf]の間にダイアログを閉じていく操作を書けば、完成です。
仕上にダイアログを閉じる RPA を書く
では、ダイアログを閉じる RPA を書きましょう。まずは、IfMessage Boxアクションと[Else]アクションの間にある、WinActivate アクション、[Text] アクション、WinWaitNotActivateアクションを選択して、Ctrl + cでコピーします。
そうしたら、**[EndIf]を選択した状態で、Ctrl + Vでペーストします。
このままだと、OKを押してダイアログを閉じた場合でも、ファイルが上書き保存されてしまいますが、心配いりません。コピーしてきた[Text]アクションをダブルクリックして、「テキスト」編集ダイアログを表示します。ここで、送信する文字を「y」から「n」に変更し、「OK」ボタンをクリックしてダイアログを閉じます。
上図のようになっていれば大丈夫です。通常のダイアログは「y」で「はい」、「n」で「いいえ」を選択することになります。マウス操作だと、ここで座標を変える必要がありますが、キーボード操作を主体にしていると、こういうときも比較的、楽です。
ただ、このままではまだ、「名前を付けて保存」ダイアログが残ってしまいます。**[EndIf]の行を選択した状態で、「テキスト」ボタン(F3キー)を押します。
- 送信する文字列は{Escape}
- 送信モードは「コマンドを記述したテキスト」
にして、OKをクリックします。ダイアログは、「Escape」キーで何もせずに閉じることができたのでした(「×」ボタンクリックと同等の操作)。また、ESCキーのような特殊なキーの送信は、AutoHotKey の日本語Wikiを見れば分かるので、覚えていないうちは参考にしましょう。
最後の仕上に、「名前を付けて保存」ダイアログが閉じられ(て、メモ帳の本体がアクティブにな)るのを待ちます。「WinWait」アクションに、「名前を付けて保存」ダイアログを特定するための文字列が入力されているはずなので、コピーします。
コピーしたら、**[EndIf]の前に、WinWaitNotActive アクションを追加して、「名前を付けて保存」ダイアログが非アクティブになるのを待つアクションとしましょう。ここはもちろん、WinWaitActive アクションで、メモ帳本体がアクティブになるのを待つアクションでも大丈夫です。これはIf文とElseの関係ほど論理的に完璧ではありませんが、状況によってはほぼ同じ、集合に対する補集合のような関係になります。
この、「ある場合」と「それ以外の場合」という関係は、 RPA シナリオの自作にもプログラミングにもよく出てくるので、感覚的に理解できるようにしておきましょう。
さて、ここまで出来たら今回の RPA シナリオは完成です。色々な条件で実行してみて、きちんとファイルの保存周りが動いていることを確認しましょう。
今回の内容は、「長くて、 RPA シナリオの自作なんて大変すぎる!」と思った方もいるかもしれません。
ただ、実は大変なのはIf文であって、それ以外の連続した操作の作成自体はそれほど大変ではなかったりします。チュートリアルの講座なので、大事なところに集中できるように、操作部分は簡素にしていますが、それでも[Else]~[EndIf]の中はコピー&ペーストも駆使してさくさく作れたのではないでしょうか(ウィンドウの切り替えも大分面倒な、If文に近い処理ですが)。
このように、 RPA シナリオの面倒くささはIf文の量でかなり変わって来ます。もちろん、安定性も変わってくるので、 RPA 化を行う前に、できるだけ条件分岐をしなくてもいいように業務の標を進めることが重要です。
終わりに
今回は、If文について深く説明しました。また、それによりダイアログを表示して、 RPA からユーザーに通知や操作を求める方法も学習できましたね。
ここまでで、
- キーボードからの操作
- マウスからの操作
- ウィンドウの切り替えや状態の取得
- 処理の流れの変更
- ユーザーの操作を待つ
といったことを学習してきました。まだまだ基本編ではありますが、実はすでに業務で使える RPA を作れるところまで来ています。
誰でも作れるサンプル・チュートリアルである都合上、メモ帳を使っていますが、もし業務で困っていることがあれば、自作できないか試してみて下さいね。
1件のフィードバック