🏖️

絶望的な手作業を自動化!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()

※実際の業務システムで使う場合は、pandasopenpyxl等でExcelファイルから値を取得してください。

工夫したポイントと小ワザ

ツールを作るとき、「動けばそれでOK」と思いきや、実際に使うとなるといろいろ気になる点も出てきました。
なので、使いやすさや手間の削減、安全面も少しだけ工夫しています。

  • IDやパスワードはiniファイルで管理

    ソースコードに直書きしないので、部内で配布しやすい

  • ExcelとWebシステムの業務名の整合性に注意

    プルダウンの選択肢が微妙に違うと自動入力で失敗しがち。表記を揃えるようにした

  • 「入力する行だけ」を選んで自動化できるようにした

    Excel側で「この行は入力する/しない」をあらかじめ分けておける

    たとえば、ある週は複数プロジェクトに関わるけど、別の週は一つのプロジェクトだけ、ということもある。必要な行だけを自動入力の対象にできるようにした

    これがないと、Seleniumが全部の行を無駄に巡回してしまい、「使わない行」もカーソル移動・選択が発生して時間がかかる(行数が多いと絶望的…)

  • 一部だけ手入力したい場合にも対応

    この行だけ後で直したい、という場合も柔軟に使える設計にしている

他にも、Web画面の仕様が変わったときすぐ直せるよう、ロジックはできるだけシンプルに保つなど、
細かい工夫や地味なテクニックもいろいろ試しました。

自動化で得られたもの

Excelにまとめておいたとしても、工数入力をWebに転記する作業は、
1週間分で5〜10分かかり、月末に4〜5週分まとめてやると20〜50分ほどかかっていました
今は、Excelにまとめておいてスクリプトを実行するだけなので、作業はほぼ1分もかかりません
ミスも減り、手入力のストレスからも解放されています。

おわりに

今回は、日々の「地味にめんどくさい作業」を自動化した話を書きました。
手入力のような単純作業でも、回数が多いとそれだけで負担になります。
ちょっとした自動化でも、積み重ねれば大きな時短・ストレス削減につながると実感しました。
もしWebページへの入力作業で困っている方がいれば、
Seleniumも選択肢の一つとしてどうでしょうか。
自分用に「ちょっとだけ自動化」でも十分効果があるので、試してみるのもアリだと思います。

Discussion