こんにちは。完全自動化研究所の小佐井です。
RPAとプログラミングの基礎を身に付ける連載の第3回です。
この記事は第2回目の続きとなっています。第2回目を実践していない方は次の記事をお読みください。
1) IT歴20年。開発から業務改善まで幅広く経験してきました
2) 複数の企業において2016年からRPA内製化をサポートしています
3) RPA関連の書籍を5冊出版しています
今回は業務でよく使うことを自動化してみましょう!
テキストやExcelなどのファイル名に日付や時間を入れて保存することってありますよね?
このように毎回変化するものをプログラムするには『変数』を使います。
実際に手を動かしてSikuliXを操作しながら、お読みください。
それでは、どうぞ!
変数を学ぼう
さっそく開発を始めていきましょう!
まずは準備です。
まず準備をしましょう
準備1:別名で保存しよう
「【第2回】Sikuliで学ぶRPA超入門:条件分岐を学ぼう」で使ったプログラムを使いますが、区別するために別名で保存します。
SikuliX開発画面のメニュー「ファイル」をクリックし(図1➊)、「名前を付けて保存」をクリックします(図1❷)。
図1 名前を付けて保存
前ページのプログラム作成のあと、SikuliX開発画面を終了した方は、「【第1回】Sikuliで学ぶRPA超入門:順次処理でRPAの威力を実感しよう」のおまけ3(ページの一番下の方)にプログラムの開き方を載せていますので、参考にして「JB100102.sikuli」を開いてから、この処理を行ってください。
図2のポップアップが出るはずです。
図2 保存ダイアログ(1)
フォルダ名に「JB100103」と書き加えて(図3➊)、「Save」をクリックしてください(図3➋)。
図3 保存ダイアログ(2)
準備2:すべての画面を最小化するコマンドを追加しましょう
では、今保存したJB100103.sikuliのソースコードウィンドウの1行目にリスト1のコメントとプログラムを入力してください。
#すべての画面を最小化する
type("m",KEY_WIN)
sleep(2)
リスト1 画面を最小化するプログラム
キーボードにあるWindowsキーとMキーを同時に押すと、すべての画面が最小化されてデスクトップ画面が見えるようになるというWindowsの機能を利用するためのプログラムです。
「KEY_WIN」というのが、Windowsキーを対応するときに使う表記方法です。これで、プログラム実行前にSikuliX開発画面以外のすべての画面を閉じる、という作業をしなくてよくなりますよ。詳しくは次の記事をお読みください。
ロボの開発を始めます
日時モジュールを取り込みます
今回は少し頭を使うことになりますよ。でも、書くプログラムは短いですから、ゆっくりやっていきましょう。
まず、1行目にリスト2を記述してください。
import datetime
リスト2 datetimeモジュールのインポート
これは、「datetimeモジュール」というものを「インポート」するというプログラムです。
datetimeモジュールとは、日付や時刻などを操作するプログラムがたくさん集まったものです。これをインポートする(取り入れる)と自分でプログラムを書かなくても、日付や時刻を操作するプログラムが利用できるわけなんです。便利ですね。
といっても、いきなり便利さがわかるわけではないので、プログラムを書いて動かしながら体感してください。
「datetimeモジュール」というものを「インポート」と言われてもピンとはきませんよね。
このように、プログラムを勉強するとき、いろいろとわからないことが出てきますが、「わからないままでも、とにかく動かしてみる」というのが一番早くプログラムを身に付ける方法です。一つひとつ詳しく理解しようとしていては、いたるところでつまずいてしまい、なかなか先に進みません。
でも、いずれは「だいたい」理解しないとプログラムが動かなかったときに対応できません。ここのさじ加減を自分のなかで調整しながら身に付けていってください。そのうち、感覚がわかるようになります。
今の日時を変数に入れるプログラムを書こう
プログラムを書く前に今のプログラムを確認しましょう(リスト3)。リスト1とリスト2で追加したプログラムは➊です。そして、➋に日付、時刻を使ったプログラムを書いていきます。
リスト3 現在のプログラム
書くプログラムはリスト4です。22行目(sleep(2)の下の行)は改行して見やすくしてください。すこし難しいので丁寧に入力するか、コピーペーストしてください。
#現在の日時を変数に入れる
dt_now = datetime.datetime.now()
#日時を文字列に変換する
tx_now = dt_now.strftime('%Y%m%d%H%M%S')
リスト4 現在の日付を変数に入れる
リスト4に出てくる「dt_now」と「tx_now」は『変数』です。まず変数について知りましょう。変数は「箱」に例えられます。一つの箱を用意し、そこに毎回実行する度に変わる値を入れるイメージです。
例えば1回目の実行時は、その時点の日付と時刻が箱に入ります(図4➊)。約5分後に実行するした時は同じ箱に、先ほどの5分後の時間が入ります(図4➋)。
図4 変数のイメージ
リスト4の「dt_now = datetime.datetime.now()」は、「dt_now」という変数に現在の日付と時刻を入れる(格納すると言う)という意味です。nowはナウ、いま現在ということですね。
実際にはdt_nowには「2019/4/1 10:05:50」といった現在時刻が入ります。
では、「tx_now = dt_now.strftime(‘%Y%m%d%H%M%S’)」はなんでしょう?
答えは、tx_nowという変数に「20190401100550」という文字列が入るんです。tx_nowの「tx」はテキスト(文字列)の略です。型はなんなのかを後から読んでもわかるようにするために、このような型を示す名前を付けておくんですね。
どうやって、dt_nowに入った「2019/4/1 10:05:50」が、「20190401100550」という文字列に変わるのか?そこには「関数」の知識が必要になってきます。
strftime(‘%Y%m%d%H%M%S’)というのは、日付型を入れると’%Y%m%d%H%M%S’という形で文字列を吐き出す「関数」です。関数は何かを入れたら、中で何かを処理して、何かを出すという機械のようなものです(図5)。
図5 関数strftimeのイメージ
通して理解すると、「tx_now = dt_now.strftime(‘%Y%m%d%H%M%S’)」は、dt_nowに入った「2019/4/1 10:05:50」が関数「strftime」を通して、「20190401100550」という文字列に変換されて、tx_nowという変数に格納されるというプログラムなんです。
では、この「strftime」という関数はどこから来たのでしょう?これは、このページの最初で「datetimeモジュール」というものを「インポート」したから現れたんです。「datetimeモジュール」の中に「strftime」という関数が含まれていたので、ここで利用することができる、というわけです。ちょっと難しいですが、カンタンにあなたのプログラムがパワーアップされた、ということなんです。
今回、理解しきれなかった方は、あまり難しく考えず「こう書くんだな~」くらいに考えておけばいいです。
このページのプログラムでは、ここまで知らなくても動きますが、頭の片隅に置いておいてほしいポイントです。箱(変数)にはいろいろな種類があるということです(図6)。
日付と時刻を入れる箱には日付と時刻だけが入ります。「あいうえお」といった文字列を入れたいときは別の箱を用意します。また、123のような数値を入れたいときも別の箱を用意します。
別の種類の値を同じ箱に入れることはできません(厳密には別の種類の値を入れられる特殊な箱もありますが、混乱するので同じ種類だけが入ると覚えておいてください)。この値の種類のことを「型」と呼びます。文字列だけが入る箱は文字列型というわけです。
この「型」は厳密に決まっているので、別の型の値を入れようとするとエラーが起きますよ!例えば、数値型の箱(変数)に文字列を入れることはできません。
でも、文字列型の箱(変数)に数値を入れると、勝手に「1という文字だな」と判断されてエラーが発生しないので、最初は混乱するかもしれません(-_-;)。。ともかく、型を意識してプログラムすることがエラーを起こさないコツですね。
図6 変数の型のイメージ
いきなり難しくなり、英語の羅列がたくさん出てきました。「これ全部覚えないといけないの?」不安になった方もいるのではないでしょうか?
でも安心してください。全部を記憶する必要はありません。わからなくなったらネットで調べてコピーすればいいからです。Googleで「Python 日付」などと検索すれば、多くの情報が出てきます。
SikuliXはPythonを使って記述しているので、多くの情報はPythonを調べれば出てきます。
保存するファイル名に変数を使おう
ここまでのプログラムでtx_nowには現在時刻を文字列に変換した値が入っていることになっています。この値をファイル名に組み込んで、毎回違う名前で保存されるようにしましょう!
リスト5を参考にして、ファイル名を記述したプログラムを変更してください。type(“Hello2.txt”)には#を付けて、コメントアウトして、その下に日時が入ったtx_nowを組み込んだプログラムを書きます。
”[ダブルクォーテーション]で囲んだ文字は文字列として認識されます。tx_nowも文字列なので、「Hello」とtx_nowと「.txt」を「+」でつなげることができます。
#type("Hello2.txt")
type("Hello" + tx_now + ".txt")
リスト5 ファイル名に日時を入れる
実行してみよう
ここまでのプログラムを振り返ってみましょう(リスト6)。そして、SikuliXのプログラムを上書き保存して(Ctlキー+Sキーで保存できます)、実行しましょう。
リスト6 現在のプログラム
SikuliXが動いて、結果としてデスクトップ上に日時の付いたテキストファイルが作成されます(図7)。そして、メモ帳はちゃんと閉じられます。うまく動きましたか?
図7 デスクトップ上にテキストファイルが保存された状態
このあと、何度実行しても日時の付いた違うテキストが作成されますね。これで、ファイルが上書きされてしまうことが無くなります。
まとめ
このページでは業務でよく使う「ファイルに日時を入れて保存することを自動化する方法」を取り上げました。毎回、違う日時を扱うために変数を使いました。関数についても少し触りました。
難しかったかもしれませんが、すべてを理解しようとせず、まず動くことを楽しんでください。
今回はプログラムの基本構造の話ではありませんでした。次の回に最後の基本構造の話をします。
次回をお楽しみに!