こんにちは。完全自動化研究所の小佐井です。
RPAとプログラミングの基礎を身に付ける連載の第5回です。
今回は「関数」です。
この記事は第4回目の続きとなっています。第4回目を実践していない方は次の記事をお読みください。
このページからは少し本格的なプログラミングの知識になりますよ。前回までロボに英語であいさつを書かせていました。今回はロボに書かせる部分を部品化して、パラメータを引き渡すことで内容を変更させる方法を知りましょう。
それでは、どうぞ!
関数を学ぼう
さっそく開発を始めていきましょう!
まずは準備です。
まず準備をしましょう
準備1:別名で保存しましょう
今回は少し難しい内容になりますので、なるべくシンプルなプログラムで動くように、一番最初の回のプログラムを再利用します。
「【第1回】Sikuliで学ぶRPA超入門:順次処理でRPAの威力を実感しよう」で使ったプログラムを変更して使います。まず、「C:\RPA\JB1001\JB100101.sikuli」を開いてください。SikuliX開発画面のメニュー「ファイル」をクリックし、「開く」をクリックします(図1)。
図1 メニュー「開く」をクリック
「Open a Sikuli Script」ダイアログが開きますので(図2)、「JB100101.sikuli」をクリックします❶。ファイル名に「JB100101.sikuli」と表示されますので❷、「Select」をクリックします❸。
図2 「Open a Sikuli Script」ダイアログ
JB100101.sikuliが開きます。他のプログラムが開いているときは「×」をクリックして閉じてください。間違えて、他のプログラムを変更してしまうことがありますから(図3)。ソースコードウィンドウには「JB100101」だけになりましたね!?
図3 ソースコードウィンドウ
では、別名で保存します。SikuliX開発画面のメニュー「ファイル」をクリックし(図4➊)、「名前を付けて保存」をクリックします(図4❷)。
図4 名前を付けて保存
図5のポップアップが出るはずです。
図5 保存ダイアログ(1)
フォルダ名に「JB100105」と書き加えて(図6➊)、「Save」をクリックしてください(図6➋)。
図6 保存ダイアログ(2)
準備2:余計なファイルを削除しましょう
前回、日時を付けてファイルを保存したので、いくつかファイルがデスクトップ上にできているはずです。今回のプログラムにとっては邪魔なので「Hello.txt」以外のSikuliXが作ったテキストファイルは削除してください(図7)。
図7 デスクトップ上のファイル
準備3:すべての画面を最小化するコマンドを追加しましょう
【第3回】Sikuliで学ぶRPA超入門:変数を学ぼうでプログラムしたように、今保存したJB100105.sikuliのソースコードウィンドウの1行目にリスト1のコメントとプログラムを入力してください。
これは、キーボードにあるWindowsキーとMキーを同時に押すと、すべての画面が最小化されてデスクトップ画面が見えるようになるというWindowsの機能を利用するためのプログラムです。
#すべての画面を最小化する
type("m",KEY_WIN)
sleep(2)
リスト1 画面を最小化するプログラム
ロボの開発を始めます
日本語であいさつさせてみよう
いま、SikuliX開発画面のソースコードウィンドウで見てみるとリスト2のようになっているはずです。
リスト2 現在のプログラム
11行目の「type(“Hello”)」をコメントアウトし、下の行にリスト3のプログラムを記述してください。記述できたら、保存しておきましょう。
#メモ帳に日本語であいさつを書き込む
paste(u"こんにちは")
リスト3 日本語であいさつを書き込むプログラム
SikuliXでは日本語はtypeコマンドでタイプすることができません。必ずpasteコマンドを使いましょう。そして、”こんにちは”などの日本語の前には『u』を付けてください。深く追求すると難しくなるので、ここではそういう決まりだと考えてください。詳しく知りたい方は以下のページを参照してください。
一度、実行しよう
プログラムを実行してみましょう。実行するとすべての画面が最小化されたあと、Hello.txtのアイコンがダブルクリックされて、メモ帳が開きます。そこに「こんにちは」と書き込まれたはずです(図8)。
図8 メモ帳にタイプされた状態
関数を作ろう
さて、ここからが本番ですよ!意味はわからないと思いますが。まず最初に動かしてしまおう!というのが当コーナーです。ガリガリ、プログラムを書いていきましょう。5行目の最初でEnterキーを押して段落を作ってください。そこにリスト4のプログラムを記述して、Enterキーを押してください。
def MessageText():
リスト4 プログラム
現在のソースコードウィンドウはリスト5のように、カーソルがインデントした状態になっています。
リスト5 現在のプログラム
5行目のdef MessageText():の下のすべてのプログラムを選択してリスト6❶、Tabキーを押して下さい。選択された部分がインデントされています➋。
リスト6 インデントする
このMessageTextは「関数」と呼ばれています。6行目から18行目まではこのMessageText関数の中身です。
関数はプログラムをまとめて一つの機能として扱えるようにしたもので、いわば機械のようなものです。【第3回】Sikuliで学ぶRPA超入門:変数を学ぼうでstrftime関数について説明していますので、わからない方はもう一度読み直してみてくださいね。strftime関数は「datetimeモジュール」に入っていたものを利用したパターンですが、今回は新しい関数を自分の手で作ったわけです。
関数を呼び出すところを作ろう
ここから、MessageText関数を呼び出すプログラムを記述していきます。19行目に1行段落を入れて、20行目からリスト7のプログラムを記述してください。
if __name__ == "__main__":
#すべての画面を最小化する
type("d",KEY_WIN)
sleep(2)
MessageText()
リスト7 関数を呼び出すプログラム
「if __name__ == “__main__”:」はこのプログラム(JB100105.sikuli)が直接実行されたら、これから下のプログラムを実行しますよ、というときに書く決まり文句です。他のプログラムから呼び出されることで、直接実行されないパターンもあるから、このようなプログラムがあるのです。他のプログラムから呼び出されたときは、下のプログラムは実行されません。
1~4行目を削除しよう
20行目以降にすべての画面を最小化するプログラムを移動させたので、1行目から4行目までを削除してください(リスト8)。
リスト8 削除するプログラム
もう一度、実行しましょう
ここまで記述できたら、保存して実行してみてください。リスト4以降のプログラムを記述する前と同じように動きますね。
さらに変更して実行しましょう
ここから、さらに変更を加えていきます。リスト9のように変更してください。これで完成です!保存して実行してください。ちゃんとメモ帳に「こんにちは」と書かれましたか?
リスト9 変更後のプログラム
リスト9で変更したのは「prm1」という変数の部分です。prmはパラメータのことで、これはわかりやすい名前を付けてかまいません。関数に渡す変数のことを「引数(ひきすう)」といいます。リスト9の21行目でMessageText関数を呼び出すとき、引数に「u”こんにちは”」を設定しています。この引数は1行目の「def MessageText(prm1):」のprm1に渡されます。そして、11行目のpaste(prm1)に渡されて、メモ帳に「こんにちは」と書かれるのです(図9)。
図9 関数のイメージ
プログラム全体とその実行順番について解説します。
1行目から14行目までは関数なので、16行目の「if __name__ == “__main__”:」から実行されます図10➊。下に向かって順次実行されて➋、21行目でMessageText関数を呼び出します。そのとき引数として文字列が渡されます。1行目のMessageText関数が引数付きで実行され➌、関数の中身が順次実行されていきます➍。
図10 プログラムの実行順
試しにリスト9の21行目のMessageText(u”こんにちは”)の引数を変えてみましょう(リスト10)。今度はメモ帳に「こんばんわ」と書かれたはずです。このように、引数を変えるだけで関数の動作が変わるのです。MessageText関数の中身がどうなっているか知らなくても、メモ帳に何からの文字を書きこめるということでもあります。また、プログラム中で文字列を変えて、何度もMessageText関数を呼び出すことで、同じプログラムを何度も記述する工数を削減することになります。
MessageText(u"こんばんわ")
リスト10 引数の変更
まとめ
このページでは関数を自分で作る方法を学びました。引数を変えて動作させてみることで、なぜ関数を作るのかわかってきたのではないでしょうか。
プログラムの基本構造と関数を組み合わせることで、複雑な処理をシンプルに記述できるようになるのです。難しかった、という方もプログラムを続けていくことで、絶対に理解できるときがきます。
今回は引数を渡すだけの関数を作りましたが、関数から何らかの値を戻してもらうことが多いです。この値のことを「戻り値(もどりち)」と呼びます。引数と戻り値はセットです。少し頭の片隅に入れておいてください。戻り値は【第3回】Sikuliで学ぶRPA超入門:変数を学ぼうでstrftime関数でも使われています。もう一度、読み直して確認してください。