Python 初心者から始める RPA。今回は、RPA でよく使う「名前を付けて保存」の攻略します。また、プログラミングで非常に重要な 条件判断と分岐、略して条件分岐を Python で記述できるように学習します。
この記事は、RPA で今の仕事を楽に・効率的にしたい、人気のプログラミング言語 Python を学習して副業や転職に繋げる連載企画の一部です。有料・ノーコード RPA よりも当然、難易度は高くなっていますが、その分学習すると色々なことに応用が利きますよ。
- PyAutoGUI でアクティブなウィンドウの名前を取得する方法
- Python で条件分岐を行う方法
- RPA でアクティブなウィンドウによって実行する内容を切り替える方法
- 「名前を付けて保存の確認」ダイアログを攻略する
Pythonのインストールから学習したい場合は、本連載第一回を参照してください。
Python でアクティブなウィンドウを取得する
RPA で「名前を付けて保存の確認」の何が厄介か? というと、出たり出なかったりすることですね。もちろん、上書き保存の活用や絶対に重複しないファイル名といった対応方法もありますが、そういった対処ができない場合もあります。また、「名前を付けて保存の確認」に限らず、Windows, アプリの状態で処理を切り替えたくなる状況は、いずれ発生します。
ということで、名前を付けて保存の確認ダイアログが出てしまったか? を確認するにはどうするか。まずはアクティブなウィンドウを取得することですね。アクティブなウィンドウを取得するには、PyGetWindow が手軽です。
使用する関数は、getActiveWindowとなります。
import pygetwindow as gw
import time
time.sleep(1.5)
active_window = gw.getActiveWindow()
print(active_window.title)
上記のスクリプトを、pythonファイルとして保存します。コピー&ペーストでもいいですが、できれば手で入力してくださいね。簡単なスクリプトでも、1文字1文字手打ちすると学習効果が高まります。プログラミングの世界では、これを仏教になぞらえて写経といったりします。
実行は、スクリプトファイルをダブルクリックではなく、コマンドプロンプトから
py .\chapter-8-1.py
のようにして実行してください。そうしないと、最後のprint関数の結果を確認するまえに、PowerShell(コマンドプロンプト)のウィンドウが閉じてしまいます。
コマンドをEnterキーで確定してそのまま放っておくと、PowerShellのウィンドウのタイトルが表示されます。しかし、表示前にアクティブなウィンドウを切り替えると上図のように結果が変わるので、何度か実行して試してください。
さて、このスクリプトですが、アクティブなウィンドウを取得しているのは
active_window = gw.getActiveWindow()
の部分です。ここまでの連載では、ウィンドウタイトルを指定して取得する、getWindowsWithTitle()を使用していましたが、今回は「アクティブなウィンドウ」を取得しています。アクティブなウィンドウは、常に1つだけ、なので[0]も必要ないところに注意してください。
そして、取得したアクティブなウィンドウを active_window 変数に保存しています。変数名が長くて面倒な場合は、a_win などお好みで短くしても大丈夫です。
ウィンドウのタイトルを取得するのは、active_window.title です。
少し難しい話になりますが、.(ドット、ピリオド)の後に続く変数はクラス変数またはインスタンス変数と言います。
前回のウィンドウのサイズやウィンドウの座標などはインスタンス変数となっています。今は、色々な変数・情報を分かりやすく整理するために設定されている、変数のテンプレートやフォーマットのようなものと考えておいてください。
この.titleをprintしているので、ウィンドウのタイトルがPowerShell上に表示されたというわけです。さて、表示までに時間がかかるのは、time.sleep()関数のせいですが、これの位置を変えたらどうでしょうか?
active_window = gw.getActiveWindow()
time.sleep(1.5)
print(active_window.title)
このようにして実行して、ウィンドウタイトルが表示される前に、ウィンドウを切り替えてみてください。
それでも、printの結果は常に、PowerShellになってしまいます。
何故なら、active_window 変数には、Pythonが実行されたときにアクティブなウィンドウが保存されているので、そのウィンドウがアクティブでなくなったからといって、変数の中身は変わらないからです。
通常はあまり問題になりませんが、複雑な RPA やプログラムになってくると、変数に保存したタイミングが重要になる場合もあるので、覚えておいて下さいね。
メモ帳で名前をつけて保存する RPA をつくる
今作っていたPython ファイルは一旦閉じて、chapter-8-2.py などとして、新しい Python ファイルを作成します。「名前を付けて保存の確認」に対処するためには、まず名前をつけて保存をする Python スクリプトが必要なので、メモ帳で名前を付けて保存をする RPA を作成しましょう(ややこしいですね)。
import pyautogui as ag
import pygetwindow as gw
import time
import pyperclip as cb
memo = gw.getWindowsWithTitle('メモ帳')[0]
memo.activate()
ag.hotkey('ctrl', 'shift', 's')
time.sleep(0.3)
ag.press('backspace')
cb.copy('test.txt')
time.sleep(0.1)
ag.hotkey('ctrl', 'v')
time.sleep(0.3)
ag.press('enter')
time.sleep(0.5)
cb.copy('保存しました\n')
ag.hotkey('ctrl', 'v')
このような、メモ帳をアクティブにして「名前を付けて保存」をするだけの RPA を作成します。メモ帳は先に起動しておいてください。Pythonを実行すると、1度目は、
上図のようにファイル名を付けた後に、更にテキストを貼り付ける動きまでが問題なく動作します。もしうまく動かない場合は、sleepの値などを調整してみてくださいね。
しかし、2回目以降は、
このように、「名前を付けて保存の確認」ダイアログが邪魔をしてしまい、 RPA は期待した動作をしません。
ここまでの Python での RPA の書き方、それぞれの関数の意味を忘れてしまったら、過去の記事にまとまっているので復習してみてください。
If 文で「名前を付けて保存の確認」に対処する
では今回の本題、if文を使って名前を付けて保存の確認に対処していきます。先に、完成版の Python スクリプトを見てみます。
import pyautogui as ag
import pygetwindow as gw
import time
import pyperclip as cb
memo = gw.getWindowsWithTitle('メモ帳')[0]
memo.activate()
ag.hotkey('ctrl', 'shift', 's')
time.sleep(0.3)
ag.press('backspace')
cb.copy('test.txt')
time.sleep(0.1)
ag.hotkey('ctrl', 'v')
time.sleep(0.3)
ag.press('enter')
time.sleep(0.5)
#追加ここから
a_win = gw.getActiveWindow()
if a_win.title == '名前を付けて保存の確認':
ag.press('y')
time.sleep(0.5)
#追加ここまで
cb.copy('保存しました\n')
ag.hotkey('ctrl', 'v')
#でのコメントで挟んだ部分が追加し、「名前を付けて保存の確認」に対応する部分です。getActiveWindowの説明は本記事でしているので大丈夫ですね。
まずはここで、「名前を付けて保存」ダイアログでEnterキーを押した後に、アクティブになっているウィンドウを取得します。
肝心なのが、次の if…で始まる1行です。
if文の意味
まず、if 文ですが、ifで始まり : (コロン)で終わる1行です(構造というか、効果としてはもっと長くなります)。
意味は、「もし ~ ならば」という、英語とほぼそのままの意味です。しかし、もっと厳密に言うと、「もし ~ が真(しん、と読みます)ならば」という意味になります。真というのは、真偽値と呼ばれ、あっていれば「真」、間違っていれば「偽」という使い方が一般的です。あるいは、スイッチのオンが「真」、オフが「偽」という使い方もされます。
Pythonに戻ると、「a_win.title == ‘名前を付けて保存の確認’」の部分が、「~」の部分となります。
つまり、「a_win.title == ‘名前を付けて保存の確認’」が真ならば、というのが、今回のif 文の意味です。
そして、a_win.title == ‘名前を付けて保存の確認’ という書き方ですが、なんとなく意味は分かると思います。そうです、アクティブなウィンドウのタイトル(a_win.title)が、「名前を付けて保存の確認」と同じ、「イコール」であれば、あっているよ! と if文に伝えることになります。つまり、「名前を付けて保存の確認」ダイアログが表示されていると、if 文で判断できるということになります。
ここで注意してほしいのが、「a_win.title = ‘名前を付けて保存の確認’」としてはいけない、ということです。どこが違うの? という方はもう少しよく見て下さい。
そうです、イコールの記号の数が、1つになっていますね。
Python(や多くのプログラミング言語)では、 = は変数に代入する記号(演算子)、== は左右の値(あたい)が同じ・等しいかを比較する演算子と区別されています。
小学校の算数から、中学校の数学に移行するに従って、多くの人は自然に二種類のイコールの使い方、「計算結果」と、「文字への代入」を使い分けてきたと思います。ここに、さらに「比較」というものが加わったのがプログラミングの世界です。それを分かりやすくするために、==と2個続けています(両方とも、1個でいい言語もあります)。
そして、この比較する演算子こそが、本当の意味で真偽値を判断する役目を果たしています。if 文は、比較する演算子の計算結果を見て、「あっているか」「間違っているか」という処理をしています。
検索エンジンの検索候補を見ると、「if文 実例」などが出てくることがあります。それだけ、if文を適切に使用できるようになるのが難しいということでしょう。
一般的なプログラミングの世界では、多くの変数や条件は、わざわざ表示させないとプログラマーも実際のところは見ることができないため、仕方がないことです。一方で、 RPA では画面の見た目そのままを条件に使えることが多いため、 if 文の練習にも適していると言えるかもしれません。
if文の有効範囲
「名前を付けて保存の確認」ダイアログが表示されているかを判断する if 文は書けましたが、では名前を付けて保存の確認のダイアログが表示されていたら、「どうにかして閉じる」というのはどのように書けばいいでしょうか?
今回の Python プログラムでは、
ag.press('y')
time.sleep(0.5)
と、続く2行がそれを示しています。ただ、今まで通りだとこの部分も順番通りに実行されてしまうのでは? と思うと思います。
実はPython では、プログラム内で同じ数の「半角スペース」や「タブ文字(タブキーで入力される、大きめのスペース)」によって字下げ・インデントされた部分を特別な1グループとして捉えるルールがあります。
if文の直後に続いた場合は、「if文の条件が真の時に実行される処理のグループ」が字下げされている部分となっています。この記事では、半角スペース4つで字下げされています。ですので、半角スペース4つで字下げされた部分が続く限り、そこは「if文が真のとき」、つまり、「名前を付けて保存の確認」ダイアログが表示されたときにのみ実行される部分となります。
実行される内容は簡単で、「yキーを押して、ダイアログにyesと解答」し、0.5秒待つ。となります。
それ以降は字下げが解除されているので、「名前を付けて保存の確認」ダイアログが表示されてもされなくても実行されます。
test.txtファイルを削除してみたりして、名前を付けて保存の確認ダイアログが表示されてもされなくても、「保存しました」とメモ帳に追記されることを確認してください。
おわりに
今回は本格的なプログラミングの第一歩と言うべき、条件分岐の基本、if文を学習しました。if文は2つ続けたり、入れ子(2重構造)にしたりと、応用範囲も広いです。世の中でif文が使われていないソフトウェアはほぼないと言っても過言ではありません。
最初は難しいと思うかもしれませんが、なんども復習したり、応用したりして身につけてください。
- アクティブなウィンドウを取得するのはgetActiveWindow()関数
- タイトルを取得するのは、.title
- アクティブウィンドウを取得して変数に保存した後、ウィンドウを切り替えると自動では反映されない
- 条件分岐には if 文を使う
- 等しいかどうか比較するのは、== 演算子。=演算子とは別物。
- if文の有効範囲は字下げ・インデントで行う
また、この記事を通して、「自分もプログラミングで仕事できるかも!」と思った方は、まずは転職活動を開始してみるのも一つです。Geek Jobでは未経験から「最短22日」で転職できるサービスをしています。
転職は、プログラムの勉強をしているだけでは絶対にできません。転職活動もしないと転職できませんよね。また、転職活動を開始することで、より学習意欲が上がるという面もあります。
Geek Jobについては、以下の記事で詳しく解説していますので、是非参考にしてください。
1件のフィードバック