絶望的な手作業を自動化!Selenium+Excelで工数入力をラクにした話
はじめに
みなさんの職場では、ルーチンワーク的な入力作業、ありますか?
私の職場では「毎日、工数をWebシステムに入力してください」という運用がありました。
面倒なので自分用にExcelで溜めておいて、まとめて転記していたのですが、
結局それも手間がかかる…。
そこで、Seleniumで自動転記するツールを作成し、最終的には部内でも使ってもらうようになりました。
この記事は、その振り返りメモです。
工数入力フォーム、ここがつらい
「工数入力してください」と言われるだけならまだしも、
その実態は、思った以上に地味にしんどい作業でした。
うちのWebシステムには、こんな感じのフォームがあります。
※実際の画面は出せないので、イメージサンプルです
見ての通り、
- プロジェクトごとに1行ずつ、
- 各曜日ごとに細かくテキストボックス、
- 業務名はプルダウンでいちいち選択
「コピペできないし、行数も多いし、
いったい何回同じ入力を繰り返すんだ……」と、
ただでさえ単調な作業が何倍にも感じられる画面でした。
解決策:SeleniumとExcel自動化
あまりにも面倒だったので、「この作業、人間がやる必要ある?」と思い、
自動化することにしました。
やったことはシンプルで、
- 自分用に「1週間ごとに1シート」のExcelで工数を溜めておいて、
- それをPython+SeleniumでWebフォームに自動入力する
Pythonのスクリプトに、ログイン情報(ID・パスワード)はiniファイルで管理できるようにし、
部内の人も使いやすい形でツール化しました。
実際に自動で入力している様子
下のアニメーションはイメージですが、
こんな感じで1セルずつ自動で埋まっていきます。
Pythonでサンプル画面に自動入力する例
この記事用に用意したサンプルの工数入力画面(HTML)に、
Seleniumを使って自動入力するPythonスクリプト例です。
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
driver = webdriver.Chrome()
# サンプルHTMLの場合
driver.get('file:///PATH/TO/index.html')
# 実際の業務システムの場合
# driver.get('https://INTRANET_URL/工数入力ページ')
# 本来はここでExcelから「業務名」や「工数データ」を読み込みます
# この記事のサンプルでは、固定値(10, 20, ..., 70)を使っています
project_list = [
"プロジェクトA", "プロジェクトB", "プロジェクトC", "プロジェクトD", "プロジェクトE",
"プロジェクトF", "間接作業", "打ち合わせ", "資料作成", "その他"
]
# 全セルに10,20,30,40,50,60,70(=月〜日)のサンプル値を入れる
work_time = [[(j+1)*10 for j in range(7)] for i in range(10)]
for i in range(10): # 10行分
# 業務名を選択
select = driver.find_element(By.XPATH, f'//table/tbody/tr[{i+2}]/td[1]/select')
select.find_elements(By.TAG_NAME, 'option')[i % len(project_list)].click()
time.sleep(0.05)
# 各日付欄に工数を入力
for j in range(7):
input_box = driver.find_element(By.XPATH, f'//table/tbody/tr[{i+2}]/td[{j+2}]/input')
input_box.clear()
input_box.send_keys(str(work_time[i][j]))
time.sleep(0.05)
# driver.quit()
※実際の業務システムで使う場合は、pandas
やopenpyxl
等でExcelファイルから値を取得してください。
工夫したポイントと小ワザ
ツールを作るとき、「動けばそれでOK」と思いきや、実際に使うとなるといろいろ気になる点も出てきました。
なので、使いやすさや手間の削減、安全面も少しだけ工夫しています。
-
IDやパスワードはiniファイルで管理
ソースコードに直書きしないので、部内で配布しやすい
-
ExcelとWebシステムの業務名の整合性に注意
プルダウンの選択肢が微妙に違うと自動入力で失敗しがち。表記を揃えるようにした
-
「入力する行だけ」を選んで自動化できるようにした
Excel側で「この行は入力する/しない」をあらかじめ分けておける
たとえば、ある週は複数プロジェクトに関わるけど、別の週は一つのプロジェクトだけ、ということもある。必要な行だけを自動入力の対象にできるようにした
これがないと、Seleniumが全部の行を無駄に巡回してしまい、「使わない行」もカーソル移動・選択が発生して時間がかかる(行数が多いと絶望的…)
-
一部だけ手入力したい場合にも対応
この行だけ後で直したい、という場合も柔軟に使える設計にしている
他にも、Web画面の仕様が変わったときすぐ直せるよう、ロジックはできるだけシンプルに保つなど、
細かい工夫や地味なテクニックもいろいろ試しました。
自動化で得られたもの
Excelにまとめておいたとしても、工数入力をWebに転記する作業は、
1週間分で5〜10分かかり、月末に4〜5週分まとめてやると20〜50分ほどかかっていました。
今は、Excelにまとめておいてスクリプトを実行するだけなので、作業はほぼ1分もかかりません。
ミスも減り、手入力のストレスからも解放されています。
おわりに
今回は、日々の「地味にめんどくさい作業」を自動化した話を書きました。
手入力のような単純作業でも、回数が多いとそれだけで負担になります。
ちょっとした自動化でも、積み重ねれば大きな時短・ストレス削減につながると実感しました。
もしWebページへの入力作業で困っている方がいれば、
Seleniumも選択肢の一つとしてどうでしょうか。
自分用に「ちょっとだけ自動化」でも十分効果があるので、試してみるのもアリだと思います。
Discussion