毎月のシフト表をExcelで手作りしていた店長が、PythonとopenpyxlでPDF一括出力できるようにした話

シフト公開後の無限ループ作業

シフトを組む作業は、パズルそのものだ。誰がどの時間帯に入れるのか、人件費の予算内に収まるか。休日の希望が被っていないか。頭を抱えながらExcelのセルを埋め。ようやく完成の文字が見えたときにはどっと疲労が押し寄せる。

しかし、店長の仕事はここで終わらない。むしろここからが地味で苦痛な単純作業の始まりとなる。完成した全体シフト表から、スタッフ一人ひとりの個別シフトを切り出し。見やすいように整えてPDF化し、個別のLINEやメールで送付しなければならない。15名のスタッフがいるなら、同じ作業を15回繰り返すことになる。シートをコピーし、不要な行を削除して印刷範囲を調整する。

ファイル名を「2026年05月_山田.pdf」のようにいちいち手入力して保存し。それぞれの連絡先へ添付して送る。

深夜のPDF化と修正の無限ループ

まず、毎月25日の深夜、誰もいないバックオフィスで。PCの画面を睨みつけながら15人分のExcelシートをひたすら「名前をつけて保存」でPDF化していた。「Aさん……保存、Bさん……保存」とつぶやきながら単調な作業を繰り返していると。だんだん意識が遠のき、今誰の分を保存したのか分からなくなる。シフトを完成させた達成感は。この無機質なクリック作業によって完全にすり減っていくのだった。

さらに残酷なのは、シフトは「一度完成したら終わり」ではないという事実だ。公開した直後に変更の申し出が容赦なく飛んでくる。そのたびに元のExcelを修正し、該当スタッフのPDFを再出力し。もう一度送り直す。二重手間、三重手間の無限ループが毎月待っている。

手作業コピペの個人情報漏洩

手作業の最大の敵は、疲労による集中力の低下だ。毎月新しいExcelファイルを一から作るのは面倒なので。ほとんどの人が「前月のファイルをコピーして使い回す」という手法をとる。この使い回しが、最悪のヒューマンエラーを引き起こす。ファイルの中身を最新のシフトに書き換える際。名前や時給といった固定情報の更新を忘れてしまうのです。

次に、ある朝出勤すると、アルバイトの学生から「送られてきたシフト。時給も名前も別の人になってます」とLINEが来ていた。血の気が引いた。前月のファイルを使い回した際、名前と時給欄を上書きし忘れていたのだ。他人の勤務日数と時給が丸見えという最悪の個人情報漏洩。急いで全員に「先ほどのファイルは破棄してください」と土下座する勢いでメッセージを送り。胃をキリキリさせながら全ファイルを1から作り直した。

手作業シフト表の個人情報リスク

シフト表には単なる出勤日だけでなく、勤務時間数や時給。そこから計算される見込み給与が記載されていることが多い。これらは完全な個人情報だ。「他人の給与事情が丸見えになる」という状況は。スタッフ間の人間関係を容易に破壊する。この出来事をきっかけに、精神論でミスを防ぐことの限界を悟った。人が手で触る回数が増えれば増えるほど、事故の確率は跳ね上がる。

Excelをコピーして名前を打ち換える作業を根絶しなければ。また同じミスを繰り返すのは目に見えていた。

openpyxlでExcel自動化:データと色設定

手作業を撲滅するための第一歩は、データの管理と出力の分離だ。まずはスタッフID、氏名、各日の出勤時間、退勤時間。シフト区分をまとめた「シフトマスタ」をCSV形式で整備する。そして、デザインが整った空のExcelテンプレートを用意し。Pythonを使ってマスタのデータを自動で流し込む仕組みを構築する。

一方で、ここで活躍するのが。Excelファイルを直接操作できるPythonライブラリのopenpyxlだ。プログラムの動きは非常にシンプルで、CSVの行を1行ずつ読み込み。テンプレートのコピーを開いて特定のセルに値を書き込んでいく。スタッフの名前をB3セルに入れたいなら。「ws[‘B3’].value = staff_name」のように書くだけだ。

最初はCSVのデータをどうやってExcelの狙ったセルに入れるのか見当もつかなかったが。実行後にExcelを開いて本当にB3に名前が入っていたときの感動は大きい。まるで目に見えないアシスタントが勝手に入力してくれたような錯覚に陥った。

openpyxlセル色分けの落とし穴

さらに視認性を上げるため、シフト区分に応じてセルの色を変える処理も追加できる。openpyxlのPatternFill機能を使えば、早番なら青。遅番ならオレンジ、休日はグレーといったカラーコーディングが自動化できる。ただし、ここには非エンジニアが必ずつまずく落とし穴がある。色の指定方法だ。直感的に「red」や「blue」と書きたくなるが。

openpyxlではaRGB(アルファ値+RGB)の16進数文字列を要求される。単なる赤色を指定するだけでも「FFFF0000」と記述しなければならない。先頭の「FF」は透明度を示しており、これを忘れて「FF0000」とだけ書くと。エラーを吐くか色が全く反映されない現象に悩まされることになる。

openpyxlを体系的に学びたい場合は。Amazonで実務向けのPython解説書を一冊手元に置いておくのが早道だ。さらに確実なスキル習得を目指すなら。侍エンジニアのようなマンツーマン指導型スクールで実践形式で身につける方法も選択肢に挙げられる。

ここで一度立ち止まって考えてみてください

Pythonや自動化スキルを体系的に習得して、ITエンジニアとしてのキャリアを切り開きたい方には「Enjoy Tech!(エンジョイテック)」が選択肢のひとつです。

プログラミングスクール Enjoy Tech!(エ…

プログラミングスクール Enjoy Tech!(エンジョイテック) →

win32comでのExcel PDF化と安全保存

そのため、openpyxlを使えば。個別スタッフのデータが入ったExcelファイルが瞬時に15個生成される。しかし、これをそのままスタッフに送るわけにはいかない。レイアウト崩れを防ぎ、勝手に内容を書き換えられないようにするためには。PDF化が必須となる。

残念ながら。openpyxl単体にはExcelをPDFとして出力する機能が備わっていない。そこで登場するのが。WindowsのCOM(Component Object Model)という仕組みを利用して。外部からExcelアプリそのものを遠隔操作するwin32comライブラリだ。「win32com.client.Dispatch(‘Excel.Application’)」と記述することで。

Pythonからバックグラウンドで本物のExcelが立ち上がる。生成した個別Excelファイルを一つずつ開き。「ExportAsFixedFormat」というメソッドを呼び出してPDFとして保存していく。

誤送付・上書きを防ぐファイル保存ルール

保存先のフォルダ構成にも工夫が必要だ。出力したPDFがひとつのフォルダに散乱すると。送付時に相手を間違えるリスクが残る。スタッフIDと氏名を組み合わせた専用フォルダ(例:0001_山田太郎)をos.makedirsで自動作成させ。その中に「2026年05月_0003_田中花子_シフト表.pdf」という年月付きのファイル名で保存する。

保存前に同名ファイルが存在するかどうかをos.path.existsでチェックし。意図しない上書きを防ぐ一手間も欠かせない。この一手間を惜しむと、過去のシフトデータを一瞬で吹き飛ばす事故につながる。

PDF再生成、差分チェックで効率化

しかし、PDFの一括出力が完成し、数日間の平穏が訪れた。しかし、公開から3日後、お決まりのシフト変更依頼が舞い込んできた。CSVマスタの一部を書き換えてスクリプトを実行したところ。変更があったのはたった2人なのに。スクリプトは変更が一切ない残り13人分のPDFまで全て再生成してしまった。ファイル更新日時が全員分同じになってしまい。どれが新しくなったPDFなのか一目で判別できなくなった。

「違う、俺が欲しいのは変わった人の分だけだ」と頭を抱えながら。15個の新しいPDFを一つずつ開いて古いシフト表と見比べる羽目になった。自動化したはずなのに、確認作業が増えるという本末転倒な状況だった。

差分チェック安全更新

この悲劇を二度と起こさないために。スクリプトに「差分チェック(diff)機能」を組み込んだ。仕組みはこうだ。Pythonのcsvモジュールを使って。変更前の古いCSVと変更後の新しいCSVを読み込む。それぞれのデータをスタッフIDをキーとした辞書型(dict)に格納し。行ごとに内容を比較するロジックを書く。データに差異が見つかったスタッフだけをリストアップし。

まずはターミナル画面に変更内容を表示させる。誰のシフトが何日から何日に変わったのかを画面上で確認し。「Y」キーを押したときだけ、該当するスタッフのPDFのみを再生成する。このドライラン形式の安全網を設けたことで。誤ったデータを無自覚に出力するリスクが完全に消滅した。

Pythonによるシフト表自動化

毎月膨大な時間を奪っていたシフト表の切り出しとPDF化作業は。Pythonの力を借りることで完全に仕組み化できる。実現のための道のりは、大きく分けて3つのステップに集約される。

さらに、ステップ1は、データの分離と流し込みだ。複雑なExcelを直接いじるのをやめ、シフト情報をCSVのマスタとして整備する。そのデータをopenpyxlを使って。関数やデザインが整ったExcelテンプレートに自動でマッピングしていく。ステップ2は、PDFへの変換と整理。win32comでバックグラウンドのExcelを動かしてPDF化し。スタッフIDフォルダに年月付きのファイル名で振り分ける。

ステップ3は現場の運用に耐えうる安全網の構築だ。変更前後のマスタをdictで比較し。差分が生じたスタッフのファイルだけを選択的に再出力する。変更内容を事前に画面で確認してから実行するドライラン設計で。盲目的なシステム実行による二次災害を防ぐ。

月末シフト配布とバックオフィス業務の自動化

この3つの仕組みが噛み合うことで。かつては深夜残業を強いられていた月末のシフト配布作業が。今では数分の確認とエンターキーの一押しで完結するようになる。同じopenpyxlとwin32comの組み合わせは

請求書のPDF一括出力

給与明細のPDF一括出力

まず、でも威力を発揮する。また、バックオフィス業務の自動化という観点では、

経費精算のGAS自動化

有給残日数の自動管理

も組み合わせることで、月末の事務作業を一気に圧縮できるはずだ。手作業のコピペで消耗している時間があるなら。まずシフトマスタのCSV整備から始めてほしい。

関連リンクとチェックリスト

私はopenpyxlの便利さに感動しつつも、この16進数カラーコードの壁にぶつかり、何度か心が折れそうになりました。たかが色、されど色。見た目の分かりやすさは、シフト表の使い勝手を大きく左右します。エラーメッセージとにらめっこしながら、インターネットで「openpyxl カラーコード 16進数」と検索しまくった記憶があります。その甲斐あって、無事にカラフルなシフト表を自動生成できるようになった時は、小さな勝利を重ねたような達成感がありました。最初は意味不明だった「FFFF0000」という文字列が、今ではちゃんと「赤色」に見えるから不思議なものです。

この経験を通じて、プログラミングの世界では、直感とは異なるルールや記法が山ほどあることを痛感しました。Excelのセルを直接操作する感覚とは全く違う、一つ一つの命令に正確な記述が求められる世界です。しかし、その厳密さがあるからこそ、一度正しく組んでしまえば、どんなに複雑な作業もミスなく自動でこなしてくれるのだと理解できました。人間が手作業で色を塗る場合、うっかり違う色を塗ってしまったり、塗り忘れがあったりしますが、プログラムは決してそんなミスをしません。

そして、このopenpyxlを使った自動化は

そして、このopenpyxlを使った自動化は、単なる作業効率の向上に留まりませんでした。何より大きかったのは、私の精神的な負担が劇的に軽減されたことです。毎月25日深夜の「PDF化と修正の無限ループ」から解放されただけでなく、「個人情報漏洩」という最悪のミスを二度と起こさないという安心感を得られました。プログラムが自動で個人別のシフト表を作成・出力してくれるため、ファイル名の付け間違いや、過去のデータを上書きし忘れるといったヒューマンエラーのリスクがゼロになったのです。

この安心感は、何物にも代えがたいものでした。以前はシフト公開のたびに胃がキリキリしていましたが、今では余裕を持って次の業務に取り掛かることができます。プログラミングの「プの字」も知らなかった私にとって、これはまさに革命でした。たった一つのライブラリ、たった数十行のコードが、私の働き方をこれほどまでに変えてくれるとは夢にも思っていませんでした。手作業の苦痛から解放され、より創造的な仕事に時間を使えるようになったことは、私のキャリアにおいても大きな転機になったと感じています。

もちろん、最初からすべてがスムーズに進んだわけではありません

もちろん、最初からすべてがスムーズに進んだわけではありません。openpyxlのインストールで躓いたり、CSVファイルのエンコーディングで文字化けしたり、思い通りにセルに値が入らなかったり。その都度、エラーメッセージを読み解き、インターネットで解決策を探し、試行錯誤を繰り返しました。しかし、その一つ一つの「できない」を「できた」に変えていく過程が、私をプログラミングの面白さに引き込んでいったのだと思います。そして、この経験は、他の事務作業を自動化するアイデアへと繋がっていきました。

学習サービスとアンケート

このスキルを活かしてさらに前へ進むなら

Pythonや自動化スキルを体系的に習得して、ITエンジニアとしてのキャリアを切り開きたい方には「Enjoy Tech!(エンジョイテック)」が選択肢のひとつです。

プログラミングスクール Enjoy Tech!(エンジョイテック) →