Webサイトに入力する作業は結構手間です。
例えば交通費精算は月一でまとめて処理をしたりする方もいると思いますが、日付や駅や料金を何回も登録していくのは面倒だったりします。
そのような単純作業はプログラムに任せるといいと思います。
ここではExcelに登録された交通費精算の帳簿をWebサイトに自動的に入力するプログラムを紹介します。
使用するプログラム
Python(パイソン)を使用します。
事前にPythonをインストールする必要があります。
詳しくは本の178ページの「Pythonの導入」をご覧ください。
プログラムのダウンロード
プログラムファイルをダウンロードしてください。
ダウンロードしたファイルを実行してください。メモ帳などでテキストが表示されます。
解説はこれを見ながら行います。
この時点でプログラムは起動しないので大丈夫です。
プログラムを実行したい場合は拡張子をtxtからpyに変えからダブルクリックしてください。
例) 80-python-payoff-1.txt → 80-python-payoff-1.py
プログラムの流れ
プログラムの解説
ここからは先ほどダウンロードしたプログラムを、1行ずつ解説していきます。
モジュールのimport
まずは使うモジュール(プログラム)をimportします。
import pyautogui
import pyperclip
import sys
pyautoguiはキーを押したりマウスを動かしたりする関数が詰まったモジュールです。
pyperclipはコピーしたテキストデータを取り込むモジュールです。
sysはプログラムを終了したいときなどに使うモジュールです。
pyautoguiの処理速度の設定
pyautoguiの処理速度を1秒に設定します。
pyautogui.PAUSE = 1
これで1秒ごとに1つのプログラムが動作します。
例えば、1秒経ったらwindowsキーを押し、その1秒後に上方向を押す、という感じです。
動きが遅い、0.5秒ごとにしたいのであれば秒数を1から0.5に変更すればできます。
ただし、早すぎるとキーが処理速度についてこれなくなるので、せいぜい0.5から1の間で行うとよいでしょう。
以下はプログラムの作りです。
PAUSEはすべて大文字ですので注意してください。
関数でメッセージボックスの使いまわし
関数とは何度も使いまわせるプログラムととらえてください。
予め関数を作っておき、あとでその関数を使いたいときに呼び出して使う流れです。
これによって何度も同じプログラムを書く必要がなくなり、呼び出すだけでプログラムを使いまわすことができるので非常に便利です。
今回はプログラム実行中に何度もメッセージボックスを表示させるようにするので、関数を使います。
以下プログラムです。
def kakunin_kansuu(bunsyou):
kaitou = pyautogui.confirm(bunsyou)
if kaitou == 'Cancel':
pyautogui.alert('プログラムを中断します。')
sys.exit()
以下プログラムの作りです。
最初の行で関数の名前を書き、その下に関数の中身のプログラムを字下げして書きます。
関数は呼び出されないとプログラムが実行しない仕組みなので、これを書いただけでは何も実行されません。
それぞれ解説をしていきます。
関数の名前
関数の名前を付ける行は以下のような作りです。
defは最初に必ず書きます。これでここから関数が始まることを示しています。
kakunin_kansuuは関数名です。名前は好きにつけてよく、アンダースコア「_」をつかわなくても大丈夫です。
( )は関数名の後に必ず付けます。ここでは( )内にbunsyouといれていますがこれは変数です。これはあとで解説します。
最後はコロン「:」で閉じます。これがないと機能しません。
関数の中身
次に関数の中身ですが、ここではメッセージボックスを表示して、そこでキャンセルが押されたらプログラムを中断して終了するプログラムを書きます。
以下メッセージボックスのイメージです。
以下プログラムの作りです。
メッセージを表示
ここではメッセージボックスを表示して、そのあとOKボタンが押されたかキャンセルボタンが押されたかの結果を得るようにします。
プログラムの作りは以下のとおりです。
kaitouは結果を保管するための変数です。ここではOKかCancelが入るようになります。
pyautogui.confirm( )はメッセージボックスを表示する関数です。
このメッセージボックス表示後にOKボタンかキャンセルのボタンが押されますが、OKボタンならOKの文字列が、キャンセルボタンならCancelの文字列が返ってきます。
つまりその返ってきた文字列が変数のkaitouの中に入る仕組みです。
( )内には表示したいメッセージを入れます。ここでは変数のbunsyouとしており、bunsyouの中に入っているメッセージが表示されます。
メッセージは関数を呼び出す時に入れますので、その時にまた解説します。
以下pyautogui.confirm()のプログラムの作りです。
回答がキャンセルかチェック
ここでは変数のkaitouがCancelかどうかをチェックしています。
以下プログラムの作りです。
最初にifを書きます。
条件式にはkaitou == ‘Cancel’ と書き、変数のkaitouの中身がCancelかどうかをチェックします。
注意として、=は2つ繋げて==と書きます。
最後にコロンを書きます。これがないと機能しません。
変数のkaitouの中身がCancelだった場合はその下にある字下げされたプログラムを処理します(次で説明します)。違ってれば字下げされたプログラムを無視して飛ばします。
キャンセルならプログラム中断
キャンセルボタンが押されたときはプログラムの中断メッセージボックスを表示して終了します。
以下プログラムの作りです。
最初に字下げをします。
ifで条件に合った場合はこの字下げされたプログラムを実行します。
条件に合わなかった場合は字下げされていないプログラムのところまでジャンプします。
字下げは半角スペース4回分、もしくはTabを1回押して字下げします。
pyautogui.alert( )はメッセージボックスを表示する関数です。
先ほどのconfirm( )の関数とほとんど同じですが、ボタンがOKしかありません。
sys.exit()はプログラムを終了する関数です。終了する際はこのまま書けばOKです。
プログラム開始
プログラムを開始したら、まずは開始していいかどうかの確認用メッセージボックスを表示させます。
間違えて起動した場合にすぐに終了できるようにするためです。必須のプログラムではないのですが便利なので付けています。
プログラムは以下のとおりです。
kakunin_kansuu('交通費精算システムに登録するプログラムです。起動しますか?')
ここでは前述の関数のkakunin_kansuu( )を呼び出しています。
プログラムの作りは以下のとおりです。
( )の中には表示したいメッセージが入ります。
ここで関数の式のおさらいです。
def kakunin_kansuu(bunsyou):
変数のbunsyouに注目です。この変数bunsyouに表示したいメッセージが入ることになります。
このように関数を呼び出すときには関数名と表示したいメッセージを入れて呼び出せばOKで、1行で済むので簡単になります。
Excelからコピー
ExcelからWebサイトに登録するデータをコピーします。
手動でコピーしてもらいますが、その催促のメッセージをします。
プログラムの解説は前述と似ているので割愛します。
コピーデータをmojiretuへ代入
Excelでコピーしたテキストデータを変数のmojiretuへ入力します。
mojiretu = pyperclip.paste()
mojiretuは変数で、コピーした内容を取り込みます。
pyperclip.paste()はコピーした内容を出力する関数です。
つまりここではコピーした文字列を変数mojiretuに代入しているということです。
mojiretuを分解してrisutoに代入
変数のmojiretuの中にある文字列をTabごとに分解してリスト化します。
そうすると後の処理が楽になるからです。
risuto = mojiretu.split('\t')
risutoは1つずつ文字列が入る変数です。
mojiretu.split()は文字列を分割する関数で、()内の文字により分割します。()内は「\t」Tabとしています。
つまり先ほどの変数mojiretuの中身をsplit()関数でTabごとに分解してリスト化し、それを変数のrisutoに入れています。
イメージでいうと、変数mojiretuの中身は1つの枠の中に複数行の文字列が入っているイメージです。
そして変数のrisutoは関数のsplit()関数によって複数の枠が作られて、それぞれ1つずつ文字列が代入され、それを一つの変数でまとめているイメージです。
こうすることによって必要なデータのみを抽出しやすくなります。その理由は後述します。
Webサイトの準備
今回交通費精算システムは以下のデモ機を使いますので、以下のリンクをクリックしてください。
ここではWebサイトの起動を促し、「OK」を押したら10秒後にプログラムが開始するというメッセージボックスを表示します。
10秒停止するプログラムは以下のとおりです。
pyautogui.sleep(10)
pyautoguiのsleep()関数を使います。
()内には停止したい秒数を書きますが、ここでは10秒停止なので10と書きます。
Webサイトの開始位置
Webサイトを起動したらまずは乗車日の入力欄にカーソルを移動します。
カーソルとは選択中の位置のことです(狭い意味で)。
プログラムは以下のとおりです。
pyautogui.press('f3')
pyperclip.copy('乗車日')
pyautogui.hotkey('ctrl','v')
pyautogui.press('enter')
pyautogui.press('esc')
pyautogui.press('\t')
プログラムの作りは以下のとおりです。
まずpyautogui.press(‘f3’)はf3キーを押す関数ですが、Webサイト上でf3キーを押すと検索機能が起動します。
次にpyperclip.copy(’乗車日’)は「乗車日」の文字列をコピーする関数です。
そのあとのpyautogui.hotkey(‘ctrl’,’v’)はCtrlキーを押しながらVキーを押すいわゆる貼り付けのショートカットキーをする関数です。
この時点でWebサイト上では以下のように検索機能の中に「乗車日」が貼り付けられ、Webサイトの上の「乗車日」がオレンジ色に色づけられています。
このあとpyautogui.press(‘enter’)でカーソルを「乗車日」に移動します。
pyautogui.press(‘esc’)で検索機能を閉じます。
pyautogui.press(‘\t’)でTabキーを押し、カーソルを入力欄に移動します。以下のようになります。
これで入力準備が整いました。
Webサイトに入力開始
この後はExcelからコピーして分解した文字列をWebサイトに一つずつ入力していきます。
プログラムは以下のとおりです。
pyperclip.copy(risuto[0]) #乗車日
pyautogui.hotkey('ctrl', 'v')
pyautogui.press('tab')
ここでpyperclip.copy(risuto[0])のrisuto[0]に注目です。
[]内の0リスト番号で0番目の文字列を表しています。
先ほどの変数risutoを番号にすると以下のようなイメージです。
Pythonではリスト番号を1番から数えるのではなく0番から数えます。そのため最初の番号は0番になります。
つまりrisuto[0]の中身は「4月20日」の文字列が入っているということで、ここではそれをコピーしています。
あとはそれを貼り付け、Tabキーで次の入力欄(出発駅)にカーソルを移動しています。
あとはこの処理を各入力欄に行っていき、最終的には以下のようなイメージになります。
プログラムの終了
最後に「プログラムを終了します」とメッセージボックスで表示してプログラムを終了します。
サンプル動画
まとめ
ExcelからWebサイトのフォームに自動で登録するプログラムを紹介しました。
そのプログラムの作りや機能についても説明しました。
もしわからないことがあればお問い合わせからご連絡ください。