経理による、退屈なことはPythonにやらせよう
この書籍はPythonによるファイル操作などの自動化を説明している本で、タイトルが個人的に好きです。本noteでは私が取り組んでいる経理業務の自動化について紹介します。
初めまして、エンジニアから経理に転職して4年ほど経ちました、あらいと申します。
どんなキャリアやねんってところですが、大学から独学で勉強してきたプログラミングを別の領域で活かしたい、かつ商学部で会計勉強していたのと経理は比較的ルーティン業務多いのでプログラミングとの相性良いのでは?と思ったことがきっかけです。
何を自動化する?
経理は決算書を作るのが仕事です。決算書は事業を行う上での各取引の仕訳の集合体です。各取引のデータを効率良く収集するために企業はシステムをいれます。ただそのシステムと会計ソフトの連携性はないことが多いので経理は間にエクセルを挟んで会計ソフトにいれるようにします。
つまり、大体の仕事が以下の流れになります。
システムから元データをダウンロード ⇒ エクセルで集計・加工して仕訳を作成 ⇒ CSVで保存して会計ソフトにインポート
売上だったらSalesforceなどから、経費精算だったらMF経費などからデータを落としてきて、ただそれだけだと仕訳になっていないのでExcelやスプシで集計加工すると。
つまりエクセルを最初にバチっと作ってしまえば元データ貼付すれば仕事は終わるわけですね。(極論)
あとは毎月画面ポチポチしてシステムにログインして元データ落としてそれを開いてコピーして作業エクセルに貼り付けして出来上がった仕訳シートをコピーして新しいエクセル開いてそこに貼付してCSV保存してまたブラウザ開いて会計ソフトにログインしてインポートする・・・
このブラウザ操作とエクセル操作って自動化できるくね?
このような作業は毎月発生する業務なので自動化できればかなりの工数削減につながるなと。
どうやって自動化する?(無料で)
ここからがエンジニアの腕の見せ所。
結論、ブラウザ操作はPlaywright for Python、エクセル操作はopenpyxl、CSV読み込みはpandasを使うと自動化できます。
すべてPythonのライブラリで、ドキュメントも見やすくエラーに困っても調べやすいのと、playwrightはコードを書き起こしてくれる機能があるので楽に作ることができます。
ブラウザ操作はSeleniumも有名ですね。個人的にはplaywrightの方が使いやすそうだと思いました。
例えば、郵便局のサイトから郵便番号データをダウンロードすることができるのですが、東京都のものをダウンロードして港区でフィルタしてそれを新たなCSVにする、というコードを書いてみます。
import re
from playwright.sync_api import Playwright, sync_playwright, expect
import os
from dotenv import load_dotenv
import zipfile
import pandas as pd
import subprocess
load_dotenv(".env")
download_folder = os.getenv("DOWNLOAD_FOLDER")
def run(playwright: Playwright) -> None:
# ブラウザを立ち上げサイトにアクセス
# 東京都の郵便番号CSVをダウンロードする
browser = playwright.chromium.launch(headless=False)
context = browser.new_context()
page = context.new_page()
page.goto("https://www.post.japanpost.jp/zipcode/download.html")
page.get_by_role("link", name="読み仮名データの促音・拗音を小書きで表記しないもの").click()
with page.expect_download() as download_info:
page.get_by_role("link", name="東京都").click()
download = download_info.value
download_path = download_folder + download.suggested_filename
# ダウンロードフォルダに保存
download.save_as(download_path)
# ダウンロードされたものはZipファイルの中にある
# 中にあるCSVファイルをpandasで読み込む
with zipfile.ZipFile(download_path, 'r') as z:
csv_file = z.namelist()[0]
with z.open(csv_file) as tokyo_post_numbers:
df = pd.read_csv(tokyo_post_numbers, encoding="shift-jis")
# CSVファイルにはヘッダーがないのでヘッダーを0からの連番にする
df.columns = range(df.shape[1])
# H列が区の情報なので、H列(0から数えると7番目)でフィルタする
filtered_df = df[df.iloc[:, 7] == "港区"]
# フィルタしたものでCSVにアウトプットする
output_file_path = download_folder + "\\港区郵便番号.csv"
filtered_df.to_csv(output_file_path, index=False, encoding="shift-jis")
# アウトプットされたCSVファイルを開く
# 港区だけにフィルタされたデータになっている
subprocess.Popen(["start", "", output_file_path], shell=True)
# ---------------------
context.close()
browser.close()
with sync_playwright() as playwright:
run(playwright)
仮にこの作業が毎月発生するとすれば、次回以降はブラウザに触れることなく業務を終えることができます。
結果どうなった?そして今後の展望
上記はサンプルですが、本業でもこのようなブラウザ操作やエクセル操作をプログラムし、定型業務を自動化することができました!
もちろんプログラム組むのにどうしても時間がかかってしまい全てはできていないのですが、どんどん自動化していって効率良く業務を回せるようにしてきたいです。
また、今後の展望としてこのエンジニアスキルを活かした経理業務の自動化で個人として仕事をできないかなと考えていて、副業にチャレンジしていこうと思っています。
もし気になる方(仕事依頼だけでなくプログラミングについても話すことできます)がいらっしゃれば、ぜひクリエイターへの問い合わせから、もしくは下記メールアドレスへご連絡をお願いいたします。
次回以降の記事では、より詳細の部分やPythonの環境構築、その他自動化する中で記録に残したいものを書いていくつもりです!
少しでも良いなと思ったらスキお願いします!励みになりますので!!
この記事が気に入ったらサポートをしてみませんか?