めちゃくちゃ手間のかかっていた手作業をPython使って激効率化した話

# 前置き
- すごく手間のいる作業が存在していた。ざっくり
    - スプレッドシートを複製
    - 運用管理ツールからjsonを複数DL
    - シミュレータ実行
    - シミュレータ実行結果をスプレッドシートに貼り付け
    - 目視で結果確認（NGならリトライ）
    - スプレッドシートからExcelファイルexport
    - メール＆Slackで報告
- 実質的な作業時間としては10~20min（リトライあるともっと）かかるが、色んなツールが必要だからとにかく面倒。
- 図にするとこんな感じ
　![CESA事前ガシャ検証の自動化.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87713/cfe5a41e-f499-e4e7-d576-55448afd11ad.png)

# 環境
- masOS Mojave ver10.14.6
- Python 3.7.3
- pip 19.2.2

# 激効率化（自動化）した結果

パラメータ指定なしのコマンド一つで、欲しかったExcelファイルが作成されるようにした
![CESA事前ガシャ検証の自動化 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87713/7b7e9f61-e38c-560a-5a29-87ad10a316ad.png)

# 自動化のポイント

## 1. 運用観点
無駄は無くしていこうな方針で2点対応。

### 1-1. スプレッドシートの廃止
シミュレート結果の確認＋Excelファイル（.xlsx）を出力するだけの存在。
シミュレートの結果は機械的にチェックして、Excelファイルはテンプレートを作っておいて、それに直接結果を入れ込めばよくないか？と気づき **滅** した。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87713/7aeed49a-bb96-966d-13ad-c85954e5e313.png)

### 1-2. Gmailの廃止
シミュレート結果を何故かメールで添付して送る運用。
前のメールとかテンプレートを参考にメール1通作るのがめんどい。
宛先もチーム全体のMLをccにする運用であったため、宛先を絞りたいわけでもなさそうだった。
セキュリティ的にもslackはEnterpriseだし、ワークスペースをチーム単位で区切ってるし、プライベートチャンネルだし、そこに投下しても問題なさそう。
であれば、slackのチャンネルで直接やり取りすればよいじゃんという結論で、 **滅** した。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87713/d31e286e-4960-2cff-3b89-d2ca578dd21e.png)


## 2. 技術観点
## 2-1. Pythonでスクレイピング
下準備のここを、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87713/6567eeed-19a8-8349-8ed8-0cd54714ab33.png)


この前書いた記事に沿って、ローカルに商品情報をDLできるようにした：[運用管理ツール(Webアプリ)のjsonDL機能を気軽にローカルに保存したかった話](https://qiita.com/nir_takemi/items/9f425e3e049cca1ff298)
*必要な情報をDLできればどうとでもなる*

## 2-2. Pythonでrubyスクリプトの実行
subprocessモジュールを利用。
以下のように実行して、rubyスクリプト側でシミュレータ結果をtxt形式で出力してくれるので、そのtxtファイルさえloadすればどうとでもできた。

```python
import subprocess

res = subprocess.run(["ruby", "exec.rb", "exec.rbの引数1", "exec.rbの引数2", "exec.rbの引数3"])
```

## 2-3. PythonでのExcel操作
- openpyxlを利用した。（いちいちExcel開かないで処理できるので、早くてとても素晴らしい）
- インストール

```bash
pip install openpyxl
```

- 全部は載せられないが、こんな感じで操作できるので、Excelに結果を出力するには十分だった

```python
import openpyxl

# Excel(.xlsx)load
book = openpyxl.load_workbook(filename = "Excelファイル名")
# sheet指定
sheet = book["シート名"]
# 値代入
sheet.cell(row=行 , column=列, value=値)
# Excel(.xlsx)save
book.save("Excelファイル名")
```

- ちょいつまりポイント
    - 値を数値として出力したい場合は、ちゃんと型変換してあげないとダメだった。
    - 今回でいうと、文字列/整数/小数の3種類があったので、以下のように出し分けした
    
```python
# "."/"-"を最初の1つ目削除した値を変換してみて小数判定
if data.replace(".","",1).replace("-","",1).isdigit() :
    # 一旦floatにしてみる
    d_data = float(data)
    if d_data.is_integer() :
        sheet.cell(row = row, column = column, value = int(d_data))
    else :
        sheet.cell(row = row, column = column, value = d_data)
else :
    sheet.cell(row = row, column = column, value = data)
```


# 感想
- シミュレート時間があるのでそこまで時間短縮にはなっていないが、作業ミスもなくなり、とにかく作業が楽になった。
- スクレイピングして必要な情報かき集められればあとはどうとでもできそう
- Excel業務がいまだにあるのがアレだけど、他社絡みなのでしかたないと思いつつ、Excelに絡む効率化はPythonでいいやってなった
- 他言語/他サービスとのつなぎ合わせ的な観点でできることが増えれば、自動化の幅広がりそう
- 既存の運用手順は急ぎで組み立てられたりしてることも多い気がするので、そもそもの手順で無駄がないか（楽な手順にシフトできないか）を見てみると意外にある（気がする）

# 参考
- [python上でunixコマンドを実行する](https://qiita.com/tdrk/items/9b23ad6a58ac4032bb3b)
- [Pythonで数値が整数か小数かを判定](https://note.nkmk.me/python-check-int-float/)