JIKOKENNJIYOKU-NIKKI【21st Century】

明日から本気出すわ。

プログラミング初心者のおっさんが事務作業をほぼ自動化できた話。

 

昨日、プログラミング初心者のおっさんが事務作業を半自動化できた話を書きました。

 

at251.hatenablog.com

 

で、今日、ほぼ自動化することに成功しました(笑)

 

ほぼ自動化の妨げとなっていたのは、なんだったのか。

 

① 転記元の書類が「派遣リスト(.xlsx)」

② 転記先の書類が「報告書(.xlsx)」

となってまして。

 

具体的に言いますと、①から②にデータを転記するときに、

①の4列目と6列目が②に不要なデータだったんですね~。

 

でも、その不要なデータたちがくっついてきちゃうから、手作業で列を削除しなくちゃだったわけですよ。

かっこわりー。

 

で、頭の中でああでもない、こうでもないって考えていたんですわ。

昨日の日記ではpandas関数のdropを用いれば、、、みたいなことを書いていたんですが、

そもそも、openpyxlでコードが書かれていたので、pandasじゃねーな、と。

 

note.nkmk.me

 

ちょっと調べてみたら、自分がやりたいことは、openpyxlの方が実現できそうなこともわかったので、このまま続行することに。

 

じゃあ、どーすっかなー、とかんがえてみました。

元々のコードが以下になります。


import openpyxl, pprint


file_list = "test_original_list.xlsx" # 転記元の派遣一覧
file_report = "reportlist.xlsx" # 報告書のテンプレート
file_out_report = "out-report.xlsx" # 生成する報告書ファイル

# 転記元の派遣一覧を読み込む
wb = openpyxl.load_workbook(file_list,data_only=True)
ws = wb["schedule"] # scheduleのシートを選択

 

# 報告書のテンプレートを読みこむ
wb_rp = openpyxl.load_workbook(file_report)
ws_rp = wb_rp.active

list_data = ws["C4:M200"] # 任意の範囲を取得

 

# 派遣情報を書き込む
for y, row in enumerate(list_data):
for x, cell in enumerate(row):
if(cell is None) or (cell.value is None):continue
v = cell.value
ws_rp.cell(row=3+y+1, column=0+x+1, value=v)

 

# 新しく保存する
wb_rp.save(file_out_report)
print("ok")

 

以上。

これを実行すると、out-reportという報告書ファイルが作成されるんですが、

さきほど言った通り、列を手作業で削除しなくてはならない。

 

そうだ、転記元の派遣一覧を読み込むときに、不要な列(4列目と6列目)を削除しちゃえばいいんじゃね?

それには繰り返し処理のwhileが使えるんじゃね?

 

で、以下のようにコードを追記してみました(赤字部分)。

※ 転記先の様式「reportlist.xlsx」もあわせて編集したけどそこの作業については省略。


import openpyxl, pprint


file_list = "test_original_list.xlsx" # 転記元の派遣一覧
file_report = "reportlist.xlsx" # 報告書のテンプレート
file_out_report = "out-report.xlsx" # 生成する報告書ファイル

 

# 転記元の派遣一覧を読み込む
wb = openpyxl.load_workbook(file_list,data_only=True)
ws = wb["schedule"] # scheduleのシートを選択

 

# 繰り返し処理で不要な列(元々の4列目(月)と6列目(時間)を削除)
i=4
while i <= 6:
ws.delete_cols(i)
i += 2
list_data = ws["C4:M200"] # 任意の範囲を取得

 

# 報告書のテンプレートを読みこむ
wb_rp = openpyxl.load_workbook(file_report)
ws_rp = wb_rp.active

 

# 派遣情報を書き込む
for y, row in enumerate(list_data):
for x, cell in enumerate(row):
if(cell is None) or (cell.value is None):continue
v = cell.value
ws_rp.cell(row=3+y+1, column=0+x+1, value=v)

 

# 新しく保存する
wb_rp.save(file_out_report)
print("ok")

 

すると、4列目はうまく削除できたのに、6列目は残ってしまい元の7列目が削除されてしまいました。

原因は、繰り返し処理のときの2回目にあるな、と。

【1回目】

i=4        # iを初期化して4を代入
while i <= 6:    # iが6以下であれば、以下の作業を繰り返す
ws.delete_cols(i)    # i列を削除します!
i += 2         # iに2を足してwhile 条件式( i <= 6 )に戻るぜ!

 

【2回目】

i=6        # iは4に2を足して6になたよ~
while i <= 6:    # iが6以下だから、以下の作業を繰り返すよ~
ws.delete_cols(i)    # i列、つまり6列目を削除するよ~!

          # ↑【1回目】で、4列目が削除されたあとなので

          # 元の7列目(現6列目)が削除されてしまった。
i += 2         # iに2を足してwhile 条件式に戻るぜ!

 

→戻ったら i=8だから繰り返し処理を終わるぜ!

 

なので、修正しました。削除したい元の6列目は2回目の処理では5列目になっているはず。

なので、i = 4で繰り返し処理を開始して、i = 5で処理を終えれば良いのでは?

 

繰り返し処理とlist_dateの取得範囲を微調整(2列削除したので範囲も2列分減らした)(赤字部分

import openpyxl, pprint


file_list = "test_original_list.xlsx" # 転記元の派遣一覧
file_report = "reportlist.xlsx" # 報告書のテンプレート
file_out_report = "out-report.xlsx" # 生成する報告書ファイル

 

# 転記元の派遣一覧を読み込む
wb = openpyxl.load_workbook(file_list,data_only=True)
ws = wb["schedule"] # scheduleのシートを選択

 

# 繰り返し処理で不要な列(元々の4列目(月)と6列目(時間)を削除)
i=4
while i <= 5:
ws.delete_cols(i)
i += 1
list_data = ws["C4:K200"] # 任意の範囲を取得

 

# 報告書のテンプレートを読みこむ
wb_rp = openpyxl.load_workbook(file_report)
ws_rp = wb_rp.active

 

# 派遣情報を書き込む
for y, row in enumerate(list_data):
for x, cell in enumerate(row):
if(cell is None) or (cell.value is None):continue
v = cell.value
ws_rp.cell(row=3+y+1, column=0+x+1, value=v)

 

# 新しく保存する
wb_rp.save(file_out_report)
print("ok")

 

そうしたら、ちゃんと動きました!

スッキリしたわ~

プログラミング初心者のおっさんが事務作業を(半)自動化できた話。

プログラミング初心者のおっさんが事務作業を半自動化できた話をします。

 

白衣の土方である理学療法士として業務をしている私ですが、

意外と事務作業が多いんですわ。

運動指導だけやってるわけじゃないのね。

 

事務作業の中で、3か月に1回ルーチンでやってる報告書作成作業(エクセルファイル)があるのね。

これがホントめんどくさい。つか、時間の無駄遣い感がすごかったの。

 

とある事業の調整役を私が担当しているんです。

その事業で人を派遣する調整をして、その仕事の一環で派遣リストをつくってるのね。

派遣リストには、派遣する日時、依頼元、派遣される担当者、場所、住所、実施内容、実施対象とかが記載されてるんす。

それをGoogleスプレッドシートで派遣される人たちにも共有してるんですわ。

 

んで、その報告を3か月に1回、100件は行かないけど、数十件分、上記の項目を報告書に転記して提出するんだよね。

これがチョー面倒。

Googleスプレッドシートみて、報告書に転記して、それとは別に内容に誤りがないか、派遣申し込み書って書類の内容と照らし合わせたりなんかして。

 

まったく生産性がなく、ただただ時間がかかる作業となっており、

正直「これって俺じゃなくてもできるよな、つか時間を無駄にしてる感じすげーな」って感じてました。

 

そんな折、こんな本を見つけまして。

 

退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング

退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング

 

 

なるほど。Pythonってプログラミング言語を使えば、作業を自動化できるんだな、と(←単純)。

 

よし、やろう! となりまして、Pythonで作業を半自動化して今に至ります。

 

おわり。

 

 

 

といわず、ちょっと経過を書かせていただきますと、

まず、プログラミングで作業を自動化するのに必要なことを考えました。

そして、次の作業がおそらく必要だなということになりました。

 

① 報告書のエクセルファイルに転記するPythonのコードを探してくる

② ①のコードを自分の作業用に書き換える

③ ②を実現するためには、派遣リストをGoogleスプレッドシートから.xlsxに変換する必要がありそう

④ ②を実現するため、派遣リストと報告書の記載項目を合わせる必要もありそう

⑤ 報告書に派遣リストの不要な項目も転記されそうだから、それら項目を削除する

 

みたいな。

 

①は注文製品リストから請求書、納品書を作成するコードを見つけたので、

そのコードを改変してみようと。

 

②については、私はプログラミング初心者、ましてやPythonのコードなんて書いたこともないので、ググりながらコードの意味を理解して、変数名を置き換えたり、不要なコードを削除したりしてみました。そしたら、できた(笑)

 

③は、すぐにできた。

 

④は、既存の派遣リスト項目の並び順序とか内容を報告書に倣って整理しました。報告書には記載する必要がないけど、派遣リストには記録しておきたい項目なんかもあったので、それらは残しておきました。

 

⑤が問題で、④で派遣リストには記載があるけど、報告書には不要な項目が2つあったのね。たとえば、派遣リストにはA~Gの7項目の記載があるけど、報告書にはA,C,D,F,Gの5項目しか要らないって感じ。

どちらの項目も内容と並び順序が完全一致していたら②で改変したコードでそのまま転記して作業完了! ってなるところだったんですが……

 

まあ、とりあえず③、④を踏まえて②で書き換えたコードはできまして、作業の半自動化はできました。あとは手動で報告書中のエクセルの2列を削除すればいいだけ。

でも、それは悔しいので、なんとか全自動化させたいね。

さっき調べたら、pandas関数のdrop使えば、全自動化に一歩近づけそうな感じがしました。

 

そんな感じです。

 

コードいじってて感じたこととしては、2つあります。

● プログラミングを覚えるなら、なんか目的ないと俺の場合ムリ。

● コード書けるようになるには、写経しまくらなきゃ俺の場合ムリ。

 

ヒマをみて、少しずつ勉強を続けてみます。

 

あとは、

PythonとRって統計解析にはどっちが有利なの? ってのを調べた話とか、

Pythonの勉強してるとか、何の本読んだとか、どこのサイトで勉強してるとか、

Excelの関数エラー見つけるのとPythonのコードのエラー見つけるのとかめっちゃテンションがあがることとか、って話は今度する。

覚えてたら、というか気分がのったら。

たぶん、のらないな(笑)

買って良かったノートPC

thinkpad x1 carbon を購入した。

自宅で仕事や研究の作業をするために。

 

本当はMacBook Airを買おうと思ってたんだけど、リサーチの結果、MacのOffice製品はうんこという結論に至りまして、windows PCに絞りました。

Officeでの作業ばっかだしね。

 

で、どんなノート買おうかなー、と迷うこともできないくらい知らなかったのよね。Windowsのこと。

 

そんなとき、飛行機に乗りまして。

隣に座ったビジネスマンらしき男性がおもむろにカバンからノートPCを取り出して作業を始めたのね。

 

フォルムがかっこよさげだったので、横目でチラチラ見てたら、ThinkPadのX1 carbonであることが判明。

 

で、迷わず買いました。後悔はありません。

 

結果、自室でデュアルディスプレイにしてどやったり、リビングに持ち出してどやったりして作業してます。快適。

 

買って良かった。

レオンを観た

十数年ぶりにレオンを観ました。

Netflixで。

 

いい具合にストーリーのところどころを忘れていたので楽しめました。

 

昔みた映画を再び味わうにあたって、1つ期待していたことがあります。

 

歳を重ね人生経験を得た自分が、映画をみて感じることは、昔の若く青いときの自分のそれとはまったく異なるであろうと。

感想の違いを感じることで、成長も実感できるに違いない、きっと。

 

そして、観ました。観終わりましたよ。

 

 

 

 

結果、あんまり成長のあとを実感できるような感想も出てきませんでした。

 

四十にして惑わず、まであと1年と4ヶ月弱。

このままいけば、確実に惑ってんな。

勝ちすぎて怖い

ここ3日間のどうぶつしょうぎウォーズの戦績が、18戦18勝。

 

このままいけば、どうぶつしょうぎ会のヒクソン・グレイシーだ(笑)

 

という冗談は置いておいて、実力不相応な戦績で怖いわ。

あーもうこれ詰んだわ。って局面からなぜか相手がミス連発して逆転すること数回。

こんなに続くと変な感じになってきます。

無課金で可能な1日6戦で全勝は何度も経験ありますが、2日連続は初めてだと思うし、それが3日連続なのは確実に過去に経験なかったです。

 

怖いわー

明日にはこのこと忘れてると思うけど。

バンダースナッチ、ヤバイ

先月ふとしたことから、Netflixの無料体験を開始してしまい、その後、二作品にハマりました。

 

ドラマ「宇宙を駆けるよだか」公式サイト

 

サバイバー: 宿命の大統領

 

その後、ブラックミラーっていう世にも奇妙な物語的なドラマにハマりました。

 

ブラック・ミラー | Netflix (ネットフリックス) 公式サイト

 

その中のバンダースナッチってのがヤバイ。

ブラック・ミラー: バンダースナッチ | Netflix (ネットフリックス) 公式サイト

 

自分が選択肢を選んで、それにしたがって登場人物が行動していくんだけど、途中でこちらが選択した内容に逆らったり、こちら側の世界が物事の中に絡んでいったりするんだわ。

 

あまり話すとネタバレになるのでこの辺でやめておきます。

 

久々におもしろかった!!

地震怖かったわー

今日の深夜の地震、札幌で震度6(5?)を経験しました。

 

もうね、怖い。怖かった。死んだかと思いました。

 

東日本や熊本なんかの震災は心配していても、正直どこか他人事のところがあって、「まあ、札幌はないだろう」とずっと思ってきたんですが、本当にこんな大きな地震に遭うとは。

 

停電して、街の信号が消えている状況をみたり、普段はそんなに関わらない近所の人たちとも話したりしているうちに、「あぁ、これは本当に起きてることなんだな」と、どこかふわふわした気持ちを無理やり現実だと認識させるようにさせられました。

 

いま現在もなんだか非日常な感じですが、、、

とりあえず幸いにも停電が復旧して、夜を灯のもとで過ごせるのは本当にありがたいです。

 

来るかもしれない本震に備えて過ごしたいと思います。