RPA の単発の機能は使えても、それを実際に組み合わせて役立つツールを作る方法が分からないと悩んでいませんか? 今回は、筆者がプライベートでマーダーミステリーのGMをやった際に、資料を間違いなく・手早く配布して通知するために作成した、 RPA のシナリオの作り方を紹介します。
さながらミステリー小説の登場人物になったかのように、役柄になりきり、殺人事件(とは限らない場合もありますが)の犯人を捜すアナログの大人向けゲーム。
謎解きと演技が重視され、1度プレイしたら二度と同じゲームをプレイできないものの、会話主体であり近年人気が急拡大している。
本来、対面で行うゲームではあるものの、コロナ禍の影響もありオンラインのチャットツール(音声通話ツール)を使ってプレイすることも多い。
- RPA の機能を組み合わせて、実際に役に立つ RPAを作る流れ・考え方を知りたい
- マーダーミステリーをオンラインでプレイしていて、資料配付を楽にしたい
- オンラインミーティングなどで、資料配付を楽にしたい
- Pulover’s Macro Creator の複数の RPA を外付けテンキーなどから楽に起動したい
通常、 RPA は業務の中でなんども繰り返されるプロセスを自動化(オートメーション)するものです。
ただ、今回のように「人間が手動でやるには時間がかかる作業を、本番で高速化したい」「ミスが許されない作業を完全に定型化しておく」といった用途にも使用可能です。
また、全く同じものは1度だけしか使いませんが、コピー&ペーストで他の事例に簡単に適用できる場合もあるので、結果的には時間短縮にもつながります。
RPA 実践編-Pulover’s Macro Creator で資料配付して発言するシナリオを作る
使用アプリケーション
- Discord (音声でのコミュニケーションに主眼を置いたホビー向けのコミュニケーションツール)
- OneDrive(資料配布用)
下準備
- 参加者はDiscord サーバーに招待しておく
- 配付資料は事前に作成しておく
- 配布資料は、OneDrive の 共有フォルダに格納する(時間制限つき、編集不可、ユーザー制限はなく URL 共有)
- 共有フォルダは、全員共有用と、各登場人物用を作成する(登場人物 + 1つのフォルダがある)
- Discord サーバーには、プライベートなテキストチャンネルを登場人物ごとに用意し、それぞれの登場人物とホスト役(GM)だけがアクセスできるようにしておく
※以下、全員共有用のフォルダ=全員のフォルダ、各登場人物用のフォルダ=各自のフォルダ、各登場人物用のテキストチャット=各自のチャットとする
今回つくる RPA の全体像
準備用 RPA
- 実行確認を行う
- 全員のフォルダに、全員向けの説明・ゲームのルール、注意点などをコピーする。
- 各自のフォルダに、登場人物が最初から知っている情報、プレイヤーの役割などが記載された資料をコピーする。
- 各自のチャットに、各自のフォルダのURL を送信する(登場人物の数だけ)
- 全体のチャットに、全員のフォルダのURL を送信する
- 全体のチャットに、フォルダのURLが送信された旨を送信して、確認を促す
各フェーズ用の RPA
マーダーミステリーでは通常、最初から知り得た情報だけでゲームが進行することは少なく、時間経過などで新しい情報(資料)が提供されます。
- 実行確認を行う
- 全員のフォルダに、全員向けの新情報の資料をコピーする。
- 各自のフォルダに、その人物だけが新しく知り得た情報をコピーする。
- 全体のチャットに、ファイルが追加された旨を送信して、確認を促す
準備用と比較して、URLの送信がなくなった分、非常にシンプルになりました。
ただし、似たようなファイルを大量に(10人分近く)間違えなく、テンポを崩さずに配布するのはなかなか難しいです(特にフォルダ間のコピーなどは)。こういった、1度しか実行しないものの似たような作業をコピー&ペーストで量産できるのも、RPA の強みです。
また、Discord (コミュニケーションツール)自体でファイルを共有する方法もありますが、RPA の複雑度が増すので避けています。
仕上:LuaMacros 連携
LuaMacros 側を一度設定してしまえば使い回せますが、LuaMacros を使って外付けテンキーや、ゲーム向けキーパッド(安価な専用ソフトがついていないもの)から1キーで起動できるように設定します。
準備用 RPA を作成する
ファイルコピー 操作をする
ファイルのコピーは、 WindowsのUI(エクスプローラー)からやると工数が多いですが、Pulover’s Macro Creator ではファイル操作用のアクション1つでできます。
「実行/ファイル/その他」ボタン(F8)からコピー元とコピー先を選択するだけです。
- コピー元のファイルを指定
- コピー先のファイルを指定
Pattern とあるように、ワイルドカード(*)を使用することができます。ただ、今回は元となる資料のファイル構造から、ワイルドカードは使わずに個別で指定します。
ファイルコピーアクションのコピー
フォルダ構造を書き換えれば対応するような構造になっているので、コピー&ペーストで人数分アクションを複製し、一部修正します。
- c:\murder-mystery\pc1\file1.pdf
- c:\murder-mystery\pc2\file1.pdf
- c:\murder-mystery\pc3\file1.pdf
- c:\murder-mystery\share\pc1\file1.pdf
- c:\murder-mystery\share\pc2\file1.pdf
- c:\murder-mystery\share\pc3\file1.pdf
上記のようなフォルダ構造にすると、フォルダだけ書き換えられ、プログラムや RPA で処理しやすいです(shareは、共有用のフォルダ)。
ただし、全部同じファイル名になってしまうため、配布ミスに人間が気づきづらい欠点があります。そのため、
- c:\murder-mystery\pc1\pc1-file1.pdf
- c:\murder-mystery\pc2\pc2-file1.pdf
- c:\murder-mystery\pc3\pc3-file1.pdf
- c:\murder-mystery\share\pc1\pc1-file1.pdf
- c:\murder-mystery\share\pc2\pc2-file1.pdf
- c:\murder-mystery\share\pc3\pc3-file1.pdf
のように、ファイル名でも区別できるようにしておいた方が安全です。
また、share全体を共有できるようにしておくと、(OneDriveの場合)フォルダ構造を上にたどれてしまうので、見られたくない場合は個別に共有しましょう。
もちろん、業務で流出が許されない場合は、URL 共有ではなく、ユーザーを指定して共有します。ホビー用途でも「公衆送信」状態になってしまうおそれがあるので、共有期限を設定する・クリーンアップ用の RPA を用意するなど工夫が必要です。
一時停止を入れる
ファイルのコピーはすぐ終わっても、OneDriveのサーバーにアップロードされるには時間がかかるので、10秒ほど待機時間を設けます(一時停止ボタン、F5キー)。
Discord をアクティブにし、ウィンドウを最大化する
Discord(または使用するソフト)をウィンドウ(F6)コマンドでアクティブにします。
その際の注意点は、Class 指定だけではなく Process 指定も入れることです。なぜなら、Discord は Chrome_WidgetWin_1 という、Chrome系で広く(Edgeでも)使われているClassを使用しているために、誤選択の可能性が高いからです。
ウィンドウの最大化は、本ブログでは初出ですが、同じくウィンドウコマンドで対応可能です。「WinMaximize」を選択し、WinTitleの設定はアクティブ化と同様にします。
Discord はウィンドウハンドルでの操作やキーボードでの安定した操作が難しいアプリケーションのため、マウス操作を行います。
このとき、画像検索を使ってもいいのですが、位置が固定されているのであればマウス操作の方が RPA を作るのが楽に、早くなります。そこで、ウィンドウサイズを最大化することで、UIの位置のずれを抑止して動作を安定させています。
目的のサーバーを選択する
Discord はサーバーという、SlackやChatwork, Teamsでいう会社や組織のようなものを頻繁に行き来することを想定しています。ゲーム中に他のDiscord サーバーを見に行くことも少ないとは思いますが、一応、マーダーミステリーをプレイするサーバーを毎回選択するようにします。
縦にならんだアイコンのひとつひとつが、サーバーを示しています(白い縦棒が着いているのが選択中のサーバー)。
マウスの座標で固定的にクリックしてもいいですが、アイコンが自分で設定できるので画像検索を行います。
Discord のアイコンは、選択中のサーバーは角丸の四角形、他は丸になるので、アイコンの中心あたりをキャプチャします。
補助的な動作なので、「見つかった場合」に単に中心をクリックする処理にしていますが、「繰り返し」「…まで繰り返し」、「変形」などを駆使して精度を高めてもいいでしょう。
テキストチャンネルを選択
Discordのテキストチャンネルはこのように並びます。それぞれに画像のアイコンを設定できれば画像検索でもいいのですが、文字だけなので、Window 座標でのマウスクリックで実現します。
マウス(F2)編集ダイアログの「…」ボタンから、テキストチャンネルの上を右クリックするだけで設定できます。ただし、この時の注意点としては、必ずDiscord のウィンドウをアクティブにしてから(念のために1度左クリックするなど)行うようにすることです。
RPA の作成だけに集中できる、チュートリアル中などはいいのですが、実際に RPA を作成する場合はいろいろなウィンドウをアクティブにする関係上、予期しないウィンドウのWindow 座標として記録されてしまう場合がありバグの元となります。
チャットの入力欄を選択
通常、テキストチャンネルを選択した直後は、テキスト入力欄にフォーカスがあたった状態になりますが、念のため(安定動作のため)、マウスでクリックして選択することにします。
こういったテキストの入力欄には、WinTitleのような、「コントロール」と呼ばれる指定方法がありますが、残念ながら Discordでは、全体が「Intermediate D3D Window1」というものでできてしまっているので、この方法が使えません(当ブログでこの方法を未紹介なのも、これからどんどん使えないアプリケーションが増えることが予想されるため)。
テキスト入力欄はこのような見た目(ただし、#general のところはテキストチャンネル名)です。アイコンの位置から右に50ピクセル……といった指定方法もできそうですが、せっかくウィンドウを最大化しているので、こちらもマウス(F2) で、移動してクリックアクションを作成して対応します。
URL を送信する
OneDriveのURLを送信します。OneDriveのURLには「!」のような、Pulover’s Macro Creatorで特殊な文字(Sendコマンドにおいて)と判断されるものが含まれています。
さらに、テキストチャンネルで日本語入力がオンだと、日本語として入力されてしまうので、「クリップボードからの貼り付け」でテキストボックスに入力します。
{Enter}キーで送信
URLを「クリップボードから貼り付け」した後は、「コマンドを記述したテキスト」で{Enter}を送信します。
ここまでで一人分ができました。
人数分を繰り返し、全体への共通メッセージを送る
テキストチャンネルの選択~{Enter}での送信までの流れをコピーして、クリックする座標・送信するURLを変更して全プレイヤー分に対応します。
最後に全体のチャンネルを選択し、全体用のURL、メッセージなどを全体のチャットに送信する処理を行います。
確認メッセージを追加する
最後に、RPA の最初にメッセージボックスを表示して、本当に送信処理を行うかを確認するメッセージを表示します。
メッセージボックス(Shift + F5)編集ダイアログを表示し、確認のメッセージ・OK, キャンセルボタンを表示するメッセージボックスを表示します。
同時にIf分を追加して、「OK」ボタンだったら何もしない、[Else]アクションを追加して、「OK以外だったら何もしないで RPA を終了するために Return アクションを実行する」ように設定します。
「キャンセル」だったら終了する、にしないのは、ボタンを押す以外での動作で閉じてしまった場合に、誤動作することを避けるためです。確実にOKのときのみ、以後に進むようにします。
RPA の先頭部分は上図のようになります。
RPA を複製して、その他の状況に対応できるようにする
Ctrl + Shift + D で今作成した RPA を複製します。
各自のチャットを選択していく動作などは、初回の RPA だけでいいので削除します。
以後はファイルのコピーと全体のチャットへの通知だけになるので、ダブルクリックで内容を修正するだけで対応可能です。
本当は、FileCopy アクションのフォルダのパスを変数にしておけば、この工程で非常に楽ができました……
順番に素早く実行できるようにホットキーを割り当てる
Pulover’s Macro Creatorでは、タブごとに「再生」に入力したホットキーで RPA を実行できます。つまり、開いているタブの分だけ RPA をすぐ実行できる待機状態にできます。これは、商用 RPA ではなかなかない便利な機能です。
これを最大限利用するために、LuaMacros を使って 1キーで呼び出せ、かつ通常の動作で誤動作しないようにします。
Pulover’s Macro Creator 向けお手軽 LuaMacrosの汎用コード
lmc.minimizeToTray = true
lmc_minimize()
lmc_device_set_name("MACROS", "3151ADB1")
lmc_set_handler("MACROS", function(btn, dir)
if(dir == 1) then
return
end
if(btn == 81) then
lmc_send_keys("{F13}", 50)
end
if(btn == 87) then
lmc_send_keys("{F14}", 50)
end
if(btn == 69) then
lmc_send_keys("{F15}", 50)
end
if(btn == 82) then
lmc_send_keys("{F16}", 50)
end
if(btn == 65) then
lmc_send_keys("{F17}", 50)
end
if(btn == 83) then
lmc_send_keys("{F18}", 50)
end
if(btn == 68) then
lmc_send_keys("{F19}", 50)
end
if(btn == 70) then
lmc_send_keys("{F20}", 50)
end
if(btn == 90) then
lmc_send_keys("{F21}", 50)
end
if(btn == 88) then
lmc_send_keys("{F22}", 50)
end
if(btn == 67) then
lmc_send_keys("{F23}", 50)
end
if(btn == 84) then
lmc_send_keys("{F24}", 50)
end
end
)
安いゲーミングキーパッド用に、筆者が使っているLuaMacros の汎用コードです(コピペする場合は、lmc_device_set_nameの行を書き換えてください)。
Q, W, E, R, A, S, D, F, Z, X, C, Tに、通常のキーボードにはない、F13~F24キーを割り当てています。
Pulover’s Macro Creator側の設定
上記設定にあわせ、Pulover’s Macro Creator 上で、ゲームの進行に従って押す順に設定しておきます。メインウィンドウの「再生」テキストボックスは、F13以降の表示に対応していないので(設定自体はできる)、マクロの編集(Ctrl + Shift + M)ダイアログで確認します。
※作成順の都合でMacro6が先頭になっています。
これで、Pulover’s Macro CreatorとLuaMacros を起動しておけば、1キーで必要なファイルの配布と、ユーザーへの通知が可能です。
おわりに
詳細を出しても問題ない RPA ということで、趣味向けの解説となりました。とはいえ、これをZoomのチャットなどに応用すれば、セミナーやプレゼンテーションの進行にあわせてテキストチャットでの補足や資料配付なども可能になります。
また、顧客に提供するファイル一式を用意しておき、コピー元はいじらないでコピー先だけ顧客にあわせて変更するなどの応用をすれば、手動で、間違えないようにファイルをコピーしたり、チャットで発言したりといった面倒からは解放されますので、今回ご紹介した考え方、作り方をベースに、何かひとつ 独自の RPA を作ってみて下さい。
さらに、LuaMacrosと連携すれば、プレゼンテーションなどでの応用はもっと広がりますよ。