Pythonを使うとパソコン操作を自動化することができます。
たとえば社内のシステムにエクセルデータを入れ込む作業を実行することができるのです。
ここではPython×Excelの仕事をRPA的にパソコンを動かし、システムへデータ登録していきます。
・pyautoguiを使ってPCの動きを再現
・pyperclipでExcelデータを社内システムへ登録
会社でエクセルデータを社内システムへ登録するルーティン作業をしている人には参考になる部分があるかもしれません。
以下で詳しく紹介していきます。
なおあくまでRPA的な動きをするのであって、本記事で紹介している内容は正確なRPAの定義を満たすものではありません。
目次
- 1 Pythonで社内システムにエクセルデータを自動入力
- 2 Pythonプログラムの実行前準備|ライブラリインストール
- 3 Pythonプログラム解説
- 3.1 プログラム1|ライブラリ設定
- 3.2 プログラム2|検索を開く
- 3.3 プログラム3|検索窓に入力
- 3.4 プログラム4|プログラム停止-3
- 3.5 プログラム5|対象のエクセルシートを読み込む
- 3.6 プログラム6|社内システムのURLを設定
- 3.7 プログラム7|データを社内システムへ登録
- 3.8 プログラム8|UserIDを登録
- 3.9 プログラム9|氏名を登録
- 3.10 プログラム10|氏名(カタカナ)を登録
- 3.11 プログラム11|性別を登録
- 3.12 プログラム12|電話番号を登録
- 3.13 プログラム13|メールアドレスを登録
- 3.14 プログラム14|生年月日を登録
- 3.15 プログラム15|サービス種類
- 3.16 プログラム16|パスワードを登録
- 3.17 プログラム17|登録ボタンを押下
- 4 社内システムへの登録をRPAのように処理|欠点やデメリット
- 5 他のライブラリと組み合わせでPC操作させる
- 6 Pythonについて詳しく理解したいなら
Pythonで社内システムにエクセルデータを自動入力
今回は以下の作業をpythonで行います。
1. Excelデータを取得
2. 社内システムに1つずつ入力(Excelデータを登録)
上記の作業をPythonプログラムで実行していきます。
なおこの記事では、スクレイピングのようにウェブページを操作することはしません。
その代わり、PC操作をPythonで自動化する方法を採用します。
社内システム
この記事では、疑似的に準備した社内システムを使用します。
1時間弱で私が作成した超簡素なシステムなので、実際の職場では同様のシステムはないと思います。
しかし社内システムが複雑だと、プログラムがより複雑になる可能性があるため、敢えてカンタンなシステムを事例としています。
Pythonプログラムの実行前準備|ライブラリインストール
1. 必要なライブラリをインストール
準備1|必要なライブラリをインストール
今回は以下のライブラリをインストールします。
pip install pyautogui
PC操作を自動化するためのライブラリです。
pip install pyperclip
クリップボードの操作を可能し、コピペ作業を自動化するためのライブラリです。
pip install openpyxl
Excelの操作を自動化するためのライブラリです。
上記をインストールしておかないと動かないので、注意が必要です。
Pythonプログラム解説
この記事で紹介するプログラムを解説しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 |
# プログラム1|ライブラリ設定 import pyautogui as gui import pyperclip import time from datetime import datetime as dt import openpyxl as px import webbrowser # プログラム2|PC動作の前後でプログラム停止-1 def movemargin(keyboard): time.sleep(0.25) gui.press(keyboard) time.sleep(0.25) # プログラム3|PC動作の前後でプログラム停止-2 def copypaste(item): text = ''.join(item) pyperclip.copy(text) time.sleep(0.25) gui.hotkey('ctrl', 'v') time.sleep(0.25) # プログラム4|プログラム停止-3 def timebreak(): time.sleep(0.3) # プログラム5|対象のエクセルシートを読み込む filepath = 'Book1.xlsx' wb = px.load_workbook(filename=filepath) ws1 = wb['Sheet1'] values = [[cell.value for cell in row1] for row1 in ws1] # プログラム6|社内システムのURLを設定 url = 'file:///D:/DropBox/Dropbox/Python/Program/750_RPA/755_ExcelToSystem/intra_system.htm' # プログラム7|データを社内システムへ登録 for i in range(1, len(values)): data = values[i] webbrowser.open(url) time.sleep(3) # プログラム8|UserIDを登録 movemargin('tab') copypaste(data[0]) # プログラム9|氏名を登録 movemargin('tab') copypaste(data[1]) # プログラム10|氏名(カタカナ)を登録 movemargin('tab') copypaste(data[2]) # プログラム11|性別を登録 movemargin('tab') if data[3] == '女': timebreak gui.press('down') timebreak gui.press('space') # プログラム12|電話番号を登録 movemargin('tab') copypaste(data[4]) # プログラム13|メールアドレスを登録 movemargin('tab') copypaste(data[5]) # プログラム14|生年月日を登録 birthday = data[6].strftime('%Y/%m/%d') movemargin('tab') copypaste(birthday) # プログラム15|サービス種類 movemargin('tab') if data[7] == 'B': gui.hotkey('alt', 'down') timebreak gui.press('down') timebreak gui.press('enter') elif data[7] == 'C': # サービス: gui.hotkey('alt', 'down') timebreak gui.press('down') timebreak gui.press('down') timebreak gui.press('enter') # プログラム16|パスワードを登録 movemargin('tab') copypaste(data[8]) # プログラム17|登録ボタンを押下 movemargin('tab') timebreak gui.press('enter') |
以下で詳しく説明しています。
プログラム1|ライブラリ設定
1 2 3 4 5 6 7 |
# プログラム1|ライブラリ設定 import pyautogui as gui import pyperclip import time from datetime import datetime as dt import openpyxl as px import webbrowser |
以下で一行ずつプログラムを解説します
プログラム解説
2 |
import pyautogui as gui |
pyautoguiでPC操作をpythonプログラムで代替できるようになります。
「pyautogui as gui」とすることで、pyautoguiをguiという変数で扱うようにしています。
3 |
import pyperclip |
pyperclipでコピペ作業を自動化できるようにします。
4 |
import time |
timeでプログラムを止めるときに使用します。
5 |
from datetime import datetime as dt |
日付をdatetime型から文字列型に変換するときに使用します。
6 |
import openpyxl as px |
openpyxlは、Excel操作を行うためのライブラリです。pxとして呼び出せるようにします。
7 |
import webbrowser |
webbrowserは、ウェブサイトを呼び出すためのライブラリです。
社内システム起動に使用します。
プログラム2|検索を開く
1 2 3 4 5 |
# プログラム2|PC動作の前後でプログラム停止-1 def movemargin(keyboard): time.sleep(0.25) gui.press(keyboard) time.sleep(0.25) |
たとえばkeyboardが「tab」の場合、0.25秒停止→tab→0.25秒停止という処理を行います。
以下で一行ずつプログラムを解説します
プログラム解説
2 |
def movemargin(keyboard): |
関数movemarginを設定します。
プログラム5以降、必要なタイミングで呼び出します。
3 |
time.sleep(0.25) |
プログラムの動作時間を0.25秒間停止します。
このプログラムの目的は、PC動作を待ってから次のプログラムを実行させるためです。
たとえばPC画面のなかで、所定の箇所を選択する前に、次の動作を移行してしまうと正しく処理がされません。
よって、プログラム停止時間として0.25秒間を止めるようにしています。
0.25秒が短い場合は、0.5秒と長くしても構いません。
4 |
gui.press(keyboard) |
変数keyboardのキーを押します。
たとえば、keyboardが「’tab’」とすると、tabキーを押します。
社内システムにおいて、次の項目に移動するとき、tabで移動できます。
そこで、このmovemargin(プログラム2)を使って、項目移動を行います。
5 |
time.sleep(0.25) |
プログラムの動作時間を0.25秒間停止します。
プログラム3|検索窓に入力
1 2 3 4 5 6 7 |
# プログラム3|PC動作の前後でプログラム停止-2 def copypaste(item): text = ''.join(item) pyperclip.copy(text) time.sleep(0.25) gui.hotkey('ctrl', 'v') time.sleep(0.25) |
プログラム5以降、このcopypaste関数を呼び出し、システムの各項目へ貼り付けを行います。
以下で一行ずつプログラムを解説します
プログラム解説
2 |
def copypaste(item): |
copypasteという関数を作成します。
引数をitemとして取り扱います。
3 |
text = ''.join(item) |
itemを結合して、textとして取り扱います。
「”.join()」を使ってitemを結合しています。
理由はリストはpyperclipで取得できないからです。
そこで「”.join()」によって、pyperclipで値を取得できるようにしています。
1秒間止める理由は既に説明済みなので、詳細は省略します。
4 |
pyperclip.copy(text) |
「text」という変数をpyperclipで取得します。
こうすることで、textを2つ下のプログラムで貼り付けします。
5 |
time.sleep(0.25) |
プログラムの動作時間を0.25秒間停止します。
6 |
gui.hotkey('ctrl', 'v') |
hotkeyを使うことで()内のキーをショートカットキーとして操作します。
ここでは(‘ctrl’,’v’)とすることで、クリップボードを貼り付け([ctrl]キーと[v]キーを同時に押したときの操作)を実行します。
7 |
time.sleep(0.25) |
プログラムの動作時間を0.25秒間停止します。
プログラム4|プログラム停止-3
1 2 3 |
# プログラム4|プログラム停止-3 def timebreak(): time.sleep(0.3) |
以下で一行ずつプログラムを解説します
プログラム解説
2 |
def timebreak(): |
timebreakという関数を作成します。
引数はなしです。
3 |
time.sleep(0.3) |
プログラムを0.3秒停止します。
プログラム5|対象のエクセルシートを読み込む
1 2 3 4 5 |
# プログラム5|対象のエクセルシートを読み込む filepath = 'Book1.xlsx' wb = px.load_workbook(filename=filepath) ws1 = wb['Sheet1'] values = [[cell.value for cell in row1] for row1 in ws1] |
以下で一行ずつプログラムを解説します
プログラム解説
2 |
filepath = 'Book1.xlsx' |
「filepath」を「Book1.xlsx」とします。
次のプログラムで「Book1.xlsx」を読み込みます。
3 |
wb = px.load_workbook(filename=filepath) |
「filepath」で指定したExcelファイルをwbとして取り扱うようにします。
4 |
ws1 = wb['Sheet1'] |
「Sheet1」をws1として取り扱うようにします。
5 |
values = [[cell.value for cell in row1] for row1 in ws1] |
Sheet1の全データを取得してvalues1とします。
ここで取得したデータをプログラム7以降で社内システムへ登録していきます。
プログラム6|社内システムのURLを設定
1 2 |
# プログラム6|社内システムのURLを設定 url = 'file:///D:/DropBox/Dropbox/Python/Program/750_RPA/755_ExcelToSystem/intra_system.htm' |
社内システムのリンクをurlとして取り扱います。
ここではローカルのurlを取得していますが、社内のイントラシステムであれば、イントラシステムのURLを入れれば動くはずです。
ちなみにここでは、以下のような社内システムを取り扱います。
プログラム7|データを社内システムへ登録
1 2 3 4 5 |
# プログラム7|データを社内システムへ登録 for i in range(1, len(values)): data = values[i] webbrowser.open(url) time.sleep(3) |
以下で一行ずつプログラムを解説します
プログラム解説
2 |
for i in range(1, len(values)): |
「i=1,2,3,・・・,len(values)-1」でfor文の繰り返し処理を行います。
今回の事例は、Excelは11行なので、len(values)=11となります。
3 |
data = values[i] |
変数dataにvalues[i](プログラム5)とします。
dataは1次元リストとして、Excelを行ごとに取得していきます。
4 |
webbrowser.open(url) |
プログラム6で設定したurlを開きます。
5 |
time.sleep(3) |
プログラムを3秒停止します。
ウェブサイトを開くためのロード時間として、3秒間停止します。
プログラム8|UserIDを登録
1 2 3 |
# プログラム8|UserIDを登録 movemargin('tab') copypaste(data[0]) |
以下で一行ずつプログラムを解説します
プログラム解説
2 |
movemargin('tab') |
「tab」を引数として、プログラム2を実行します。
3 |
copypaste(data[0]) |
「data[0]」を引数として、プログラム3を実行します。
data0は、UserIDを指します。
プログラム9|氏名を登録
1 2 3 |
# プログラム9|氏名を登録 movemargin('tab') copypaste(data[1]) |
以下で一行ずつプログラムを解説します
プログラム解説
2 |
movemargin('tab') |
「tab」を引数として、プログラム2を実行します。
3 |
copypaste(data[1]) |
「data[1]」を引数として、プログラム3を実行します。
data1は、氏名を指します。
プログラム10|氏名(カタカナ)を登録
1 2 3 |
# プログラム10|氏名(カタカナ)を登録 movemargin('tab') copypaste(data[2]) |
以下で一行ずつプログラムを解説します
プログラム解説
2 |
movemargin('tab') |
「tab」を引数として、プログラム2を実行します。
3 |
copypaste(data[2]) |
「data[2]」を引数として、プログラム3を実行します。
data2は、氏名(カタカナ)を指します。
プログラム11|性別を登録
1 2 3 4 5 6 7 |
# プログラム11|性別を登録 movemargin('tab') if data[3] == '女': timebreak gui.press('down') timebreak gui.press('space') |
以下で一行ずつプログラムを解説します
プログラム解説
2 |
movemargin('tab') |
「tab」を引数として、プログラム2を実行します。
3 |
if data[3] == '女': |
data[3]が女だったら、以下の処理を実行します。
4 |
timebreak |
timebreak(プログラム4)を呼び出して、プログラム処理を止めます。
5 |
gui.press('down') |
[↓]キーを押します。
ラジオボタンの場合、[↓]キーを押すと次の内容を選択します。
6 |
timebreak |
timebreak(プログラム4)を呼び出して、プログラム処理を止めます。
7 |
gui.press('space') |
[space]キーを押します。
[space]キーを押すことで、ラジオボタンを選択します。
プログラム12|電話番号を登録
1 2 3 |
# プログラム12|電話番号を登録 movemargin('tab') copypaste(data[4]) |
以下で一行ずつプログラムを解説します
プログラム解説
2 |
movemargin('tab') |
「tab」を引数として、プログラム2を実行します。
3 |
copypaste(data[4]) |
「data[4]」を引数として、プログラム3を実行します。
data4は、電話番号を指します。
プログラム13|メールアドレスを登録
1 2 3 |
# プログラム13|メールアドレスを登録 movemargin('tab') copypaste(data[5]) |
以下で一行ずつプログラムを解説します
プログラム解説
2 |
movemargin('tab') |
「tab」を引数として、プログラム2を実行します。
3 |
copypaste(data[5]) |
「data[5]」を引数として、プログラム3を実行します。
data5は、メールアドレスを指します。
プログラム14|生年月日を登録
1 2 3 4 |
# プログラム14|生年月日を登録 birthday = data[6].strftime('%Y/%m/%d') movemargin('tab') copypaste(birthday) |
以下で一行ずつプログラムを解説します
プログラム解説
2 |
birthday = data[6].strftime('%Y/%m/%d') |
data[6]の日付を文字列型に変換します。
openpyxlの場合、Excelデータを日付として取得するとdatetime型になってしまいます。
そして、datetime型では、pyperclip.paste()で貼り付けできません。
そこで、この処理を行うことで、str型(文字列型)に変換します。
3 |
movemargin('tab') |
「tab」を引数として、プログラム2を実行します。
4 |
copypaste(birthday) |
「birthday」を引数として、プログラム3を実行します。
birthdayは、生年月日(str型)を指します。
プログラム15|サービス種類
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# プログラム15|サービス種類 movemargin('tab') if data[7] == 'B': gui.hotkey('alt', 'down') timebreak gui.press('down') timebreak gui.press('enter') elif data[7] == 'C': # サービス: gui.hotkey('alt', 'down') timebreak gui.press('down') timebreak gui.press('down') timebreak gui.press('enter') |
以下で一行ずつプログラムを解説します
プログラム解説
2 |
movemargin('tab') |
「tab」を引数として、プログラム2を実行します。
3 |
if data[7] == 'B': |
data[7]はサービス種類なのですが、A,B,Cの3種類があります。
data[7]=Aの場合は、初期設定で入っているので、プログラム処理は不要です。
data[7]=Bの場合は、以下のとおり、プルダウンメニューを開いてBを選択します。
4 |
gui.hotkey('alt', 'down') |
[Alt] + [↓]を同時に押すことで、プルダウンメニューを開きます。
5 |
timebreak |
timebreak(プログラム4)を呼び出して、プログラム処理を止めます。
6 |
gui.press('down') |
[↓]キーを押します。
7 |
timebreak |
timebreak(プログラム4)を呼び出して、プログラム処理を止めます。
8 |
gui.press('enter') |
[Enter]キーを押して、サービス種類を決定します。
9 |
elif data[7] == 'C': # サービス: |
data[7](サービス種類)=Cであれば、以下の処理を実行します。
10 |
gui.hotkey('alt', 'down') |
[Alt] + [↓]を同時に押すことで、プルダウンメニューを開きます。
11 |
timebreak |
timebreak(プログラム4)を呼び出して、プログラム処理を止めます。
12 |
gui.press('down') |
[↓]キーを押します。
13 |
timebreak |
timebreak(プログラム4)を呼び出して、プログラム処理を止めます。
14 |
gui.press('down') |
[↓]キーを押します。
15 |
timebreak |
timebreak(プログラム4)を呼び出して、プログラム処理を止めます。
16 |
gui.press('enter') |
[Enter]キーを押して、サービス種類を決定します。
プログラム16|パスワードを登録
1 2 3 |
# プログラム16|パスワードを登録 movemargin('tab') copypaste(data[8]) |
以下で一行ずつプログラムを解説します
プログラム解説
2 |
movemargin('tab') |
「tab」を引数として、プログラム2を実行します。
3 |
copypaste(data[8]) |
「data[8]」を引数として、プログラム3を実行します。
data8は、パスワードを指します。
プログラム17|登録ボタンを押下
1 2 3 4 |
# プログラム17|登録ボタンを押下 movemargin('tab') timebreak gui.press('enter') |
以下で一行ずつプログラムを解説します
プログラム解説
2 |
movemargin('tab') |
「tab」を引数として、プログラム2を実行します。
3 |
timebreak |
timebreak(プログラム4)を実行して、プログラム処理を停止します。
4 |
gui.press('enter') |
[Enter]キーを押す動作を実行します。
プログラム8に戻って、Excelの次の行を登録します。
社内システムへの登録をRPAのように処理|欠点やデメリット
この記事ではPyautoguiやPyperclipを使って、社内システムへの登録作業を試してみました。
今回の作業は、PC操作をPythonで代替しています。
しかしながら、このプログラムには以下の欠点があります。
2. 本プログラム実行中は、他の作業ができない
3. 本プログラムは安定しないことがある
1. 本プログラムで、エクセル10行分のデータを入力し終えるまでに3分かかる
本プログラムでは、time.sleep()を多用しています。(PC作業を安定させるため)
そのためプログラム完了まで時間がかかります。
実際に検証しましたが、エクセル10行分に対して3分かかりました。
したがって、エクセル100行分のデータには30分かかりますし、エクセル1000行分のデータには300分(5時間)かかります。
このように時間がかかることは、本プログラムのデメリットと言えます。
2. 本プログラム実行中は、他の作業ができない
本プログラムは、PC操作をPythonで代替しています。
したがって途中でキーボードを触ると、それによって正しい作業ができなくなります。
よって昼休みなどのPC作業をしない時間に本プログラムを実行するなどの対策が必要になります。
3. 本プログラムは安定しないことがある
本プログラムはPC作業をPythonで動かしています。
そのため、Python実行中にPC作業をしたり、何かしらのエラーが出たりすると、プログラムで想定した挙動を得られない可能性があります。
もし安定した挙動を得たいなら、ウェブスクレイピングなど(seleniumなど)で対応する方法があります。
他の対処法も含めて総合的に、プログラムで設計する必要があります。
ただしPyautoguiやPyperclipはウェブスクレイピングの知識はほぼ不要で作成可能です。
そのため、初心者には本プログラムは適した内容と言えるかもしれません。
他のライブラリと組み合わせでPC操作させる
この記事ではPyautoguiやPyperclipを使用して、社内システムへの登録作業を自動化しました。
しかしpythonを使うメリットは、他のライブラリとの組み合わせにあります。
たとえばPDFのデータを取得したり、ウェブスクレイピングをしたりすれば、大幅な効率化できる可能性があります。
このような作業の効率化については別記事で紹介していきます。
Pythonについて詳しく理解したいなら
Pythonを活用すると、仕事を効率化できる幅を広げることができます。
たとえば私が実際にPythonを活用して効率化してきた作業は以下の記事で紹介しています。
興味がある人は以下の記事もご覧ください。
Python×効率化のサンプル
Pythonで効率化できる事例をサンプルコード付きで紹介しています。
Python×Excel
PythonとExcelで自動化できることを紹介しています。
事例も数多く紹介しているので、ぜひ参考にしてみてください。
Python×PDF
PythonとPDFで自動化できることを紹介しています。
Pythonって難しい?
Pythonの難易度などについては、以下で紹介しています。
勉強の参考になれば幸いです。