CSV ファイルの設定をごまかす
Libre Officeでは CSV ファイルを書き出す際に、細かな設定を調整することができます。
しかし、この設定ダイアログは困ったことに、ここまで使ってきたウィンドウコントロールによる操作ができません。さらに、文字エンコーディングについてはスクロールされる程度にながく、「Unicode(UTF-8)」で保存したいですが、Unicodeには種類が沢山あって、キーボードによる指定も難易度が非常に高くなっています。
ということで、本記事ではこのダイアログをきちんと設定することはあきらめて、上図のように設定されている前提で進めます。
いずれこのようなときに、どういった処理をするかの単体記事も書きたいと思いますので、お待ちください(RPAを極める題材としては面白いですが、実務上では今回のように、標準設定のまま進めることの方が多くなります)。
では、[Pause]アクションの続きから記述していきます。
If文ボタン(F10キー)を押して、「ウィンドウがアクティブな場合」のアクションを記載していきます。
「…」を使って、LibreOfficeの「テキストファイルのエクスポート」ダイアログ(CSVファイルの設定を行うダイアログですね)を指定します。ここでは、WinTitleの設定を「Title, Class, Process」にチェックがついた状態で行っています。しかし、「テキストファイルのエクスポート」というウィンドウタイトルはそれほど多くないと思いますので、Titleだけの指定でもいいと思います。
さらに、If文と[EndIf]の間に、「OK」ボタンをクリックし、ダイアログが非アクティブになるのを待つ部分を作って行きます。前ページの「名前を付けて保存の確認」ダイアログのときと、使用するアクションは少し異なりますが、ロジック(RPAの大まかな流れ)は全く一緒になります。こういう部分に気づいて、色々なパターンを自分の中に持っておくと、オリジナルの RPA づくりの際に役に立ちます(また、プログラミングを覚えたくなった場合にも有効です)。
まずは、マウスボタン(F2キー)を押して、クリックアクションを作って行きます。
コントロールによるクリックは使用できないため、「…」ボタンを使って、OKボタンの「座標」を求めます。アクションは「移動してクリック」です。特に難しいことのない、最もシンプルな形となります。
さらに、ウィンドウアクションで、「テキストファイルのエクスポート」アクションが非アクティブになるのを待ちます。
ここで追加したアクションは、上図のようになります。
Chrome を利用してWebサービスを利用する
Chromeで指定のページを開く
Chromeで指定ページを開く方法は、URL欄に直接入力したり、ブックマーク(お気に入り)を利用したり、と色々あります。しかし、 RPA から行う場合は、もっと単純に起動時に引数を使う方法が手軽です。LibreOfficeで起動時のファイルを開くのと全く同じですね(その他のブラウザでも同様に使えると思います)。
LibreOfficeの際と同様に、実行/ファイル/文字列/その他ボタン(F8キー)を押して、Run コマンドを追加します。Targetには上記のように、”(ダブルクォーテーション)でくくって、chromeへのパスと、開きたいURLを入力します。
Chrome は起動していても起動していなくても、指定されたページのタブをアクティブにして起動してきますので、WinWait コマンドのターゲットの設定は、指定ページを開いた状態で「…」ボタンを使用して行います。または、今回のRPAの文脈では、Chromeが起動していてもいなくても、勝手にアクティブになることはないはずなので、「WinTitle」の「Title」のチェックを外して、ClassやProcessだけで設定してもいいでしょう。
ただし、ウィンドウがアクティブになっただけでは、Webページのレンダリングが完了していない場合があります。そこで一時停止の[Pause]アクションも追加しましょう。この後である程度幅を持たせた処理をしますので、適当な設定でも大丈夫です。
ボタンが表示されるまで待ってからクリックする
Web ページの操作では、基本的に画像が頼りになります(ブラウザ拡張と連携させれば、もっといろいろなことができます)。
今回はまず、jsonファイルに変換したいCSVファイルを開く必要がありますので、「+Select a File…」ボタンをクリックします。クリックするのは、ボタンの真ん中でいいですね。
Webページの画像はそれほどブレないので、変形は0です。それ以外の設定のポイントは、
- 見つかった場合、Left Clickする
- 見つからなかった場合、何もしないで処理を継続する「Continue」
- クリックするのはボタンの中心のため、「画像の中心に座標を調整」にチェック
- レンダリングを待つために、「繰り返し5」、「500ミリ秒」遅らせる。
- …まで繰り返しにチェックを入れ、見つかるまで繰り返したいので「Found」にします。
また、マウスオーバーで画像が書き換わらないように、スクリーンショットを撮影するときは、ボタンの「外側から」右ドラッグするか、全体をスクリーンショットした後に切り抜くと失敗しにくいです。これを「変形」で対応しようとすると調整が大変になるので、こちらの方が楽だと思います。
Pulover’s Macro Creatorの画像検索における、「見つかった場合」「見つからなかった場合」の自動入力は非常に便利です。
ただし、「繰り返し」を2以上で使った場合、どちらもループ(繰り返し)文の中に埋め込まれてしまうという点が使いづらさにつながっています。
たとえば、上記では、「見つかった場合は、クリックして繰り返し処理を終える」という点はうまくできています。しかし、見つからなかった場合、ユーザーに通知するPromptを選択した場合は「繰り返しの度に見つからなかった場合」のダイアログが表示されてしまい、まったくRPAとして役に立ちません。
そのため、繰り返しを使う場合は、見つかった場合 / 見つからなかった場合どちらについても、Promptを利用するのは控えた方がいいでしょう。そのような処理をしたい場合、ループから抜けたあと、ErrorLevelを改めてチェックする必要があります。
「開く」ダイアログからCSVファイルを開く
さて、今度はLibreOfficeで保存したCSVファイルを、「ファイルを開く」ダイアログで選択する必要があります。ということは、LibreOfficeでやった作業をもう一度やる必要がありますね。
と、面倒に思った方は安心してください。
まずは、WinWaitActiveコマンドを追加します。
ダイアログなので、またTitle, Class, Processにチェックを入れた状態で「…」ボタンを利用して、Chromeの「開く」ダイアログを指定しましょう。
さて、ahk_class が #32770 であることに気づいた方はセンスがあります。というのも、「ファイルを開く」ダイアログも「ファイルを保存する」ダイアログも、使用されているパーツは同じということを意味しているからです。
なので、LibreOfficeで作成した、ファイル名やフォルダを指定する部分は、ほぼそのまま使えるということです。
ということで、フォルダのパスの入力欄を画像検索している部分から、「保存」ボタンを押すところまでをコピーしてきます。
画像をメインにしている部分(37~45)までは完全にいじる必要がありません。
46行目は、LibreOfficeで設定しなかった「ファイル名」を入力する部分となります。ここでは、「テキスト」アクションではなく、「コントロール」アクションとして設定してみましょう。
「コントロール」ボタン(F4キー)を押して「コントロール」ダイアログを表示します。
まずは、「コントロール:」の右側にある「…」ボタンをクリックして、Chromeの「開く」ダイアログにある、ファイル名の入力欄を選択しましょう。ここで、通常であれば下のテキストボックスにも文字列が入力されますが、されない場合は、改めて下の「…」ボタンをクリックしましょう。
そして、「コマンド:」はControlSetText, 「値 / オプション:」に保存したファイル名を入力して、OKボタンをクリックしてダイアログを閉じます。
一時停止はなくても動作しますが、念のために100ミリ秒ほど追加しています。
最後に、「保存」ボタンをクリックしていた部分ですが、ここは「開く」ボタンをクリックするに変更しなくてはいけません。コピーしてきた最後の「LeftClick」をダブルクリックして、マウスダイアログを表示します。
コントロールにはもともとチェックが入っていますので、「…」ボタンをクリックして、「開く」ボタンを再選択すれば修正作業は完了です。OKボタンをクリックしてとじましょう。
基本形を作るときには苦労しましたが、このようにコピー&ペーストできる作業であれば一度作れば楽ができますね。
ダウンロードするファイルを削除しておく
インターネットからダウンロードされるファイルの名前は、基本的に固定です。設定次第で毎回名前をつけることも可能ですが、毎回やるのも面倒……という方も多いと思います。
その場合困るのは、同じ名前のファイルをダウンロードした場合、Chromeの場合は自動で(1), (2)…と連番のファイル名が付けられてしまう点です。これでは、最新のファイルを探すのが面倒です。
そこで今回は、先にCSVJSONからダウンロードされているファイルがあった場合、削除してしまうことにします。
If文ボタン(F10キー)を押して、If文ダイアログを表示します。
- ドロップダウンリストは、「ファイルが存在する場合」
- テキストエリアには、「各自のダウンロードフォルダのパス」+「csvjson.json」
として、OKボタンでアクションを追加します。
追加されたIf文と[EndIf]アクションの間に、今度はファイルを削除するアクションを追加します。
「実行/ファイル/文字列/その他」ボタン(F8キー)を押して、「実行/ファイル/文字列/その他」ダイアログを表示します。「コマンド」から「FileDelete」を選択し、「FilePattern」には先ほどと同様にダウンロードフォルダにあるファイルを設定します。
ここで削除されたファイルは、ゴミ箱に移動されずに直接削除されてしまうので、注意して設定するようにしましょう。
本ブログではこれまでも「名前を付けて保存」の際に上書き保存を自動でしたり、あるいはユーザーに選択させたりといったことをしてきました。
しかし、今回の方法を使えば、そもそも「名前を付けて保存の確認」ダイアログを出さない方向での解決も可能です。誤動作等考える必要がないので、今回の方法の方が優れていると感じる方もいるかもしれません。
ただ、 RPA を人間の操作の代行として考えた場合、目に見えないPC内部の動作となってしまうので、分かりづらいという部分も出て来てしまいます。もちろん、誤動作防止のために、オペレーターに問い合わせをした方がいい場合もあるでしょう。
ですので、 RPA やプログラミングでは、色々なやり方のパターンを知っていることが重要です。
ダイアログが閉じるのを待つ
ここまでは、ダイアログが消えるのを待つのに「非アクティブになるのを待つ」アクションを使っていましたが、今回はウィンドウが閉じるのを待つアクションを利用します。
[EndIf]の後に、ウィンドウボタン(F6キー)を使い、WinWaitClose コマンドを追加します。
使い方は、非アクティブを待つときと変わりません。他のウィンドウを操作できないモーダルダイアログではほぼ同じものとして使えますが、モードレスダイアログでは、ウィンドウの切り替えを行う場合がありますので、その際には意識して使い分けるようにしましょう。