見出し画像

初心者でもできる業務の自動化!

こんにちわ

分析するときにエクセルせかせかいじるのめんどくさくないですか?わたしはプロダクトマネージャーとして日々活動しているため分析業務は切っても切り離せない業務の一つです。

今回は建築の大学を出ていきなり、ITベンチャーのプロダクトマネージャーとしてデビューして、プログラミングを一切触ったことがなかったわたしでもpythonを使って業務の一部を自動化できるんだぞというところを説明させていただきます笑

※コードに無駄なところなどがあればコメントしていただけると嬉しいです!

めんどくさい業務

それは、社内のサービスの利用率を調べるときの一部業務です。。。

1,社内で利用している自社サービスの利用率調べるために社内サービスにログイン

2,管理者ページ

3,ダウンロードに必要な期間を入力

4,分析に必要なファイルを複数ダウンロード(TSVファイル)

5,エクセルに移動

6,2つのファイルの項目を揃える

7,必要な項目以外列を削除

8,2つのファイルを一つにする

9,編集やダウンロードした元のファイルを削除
 
10,DOMOにアップロード(DOMOでビジュアル化の設定済み)

※DOMOは大変ありがたいBIツールで一つにしたファイルをアップロードしたら事前に作っておいたグラフに反映されるのでビジュアル化はすでに自動化済みです!
毎回DOMOには感謝です笑


週1くらい(10min-20min)で同じ作業をしているのでかなり面倒です。
今回は1-9までの手順を1つにしていきたいと思います!

方法

必要なフレームやモジュールなどをインポートしていきます!

import pandas as pd
import glob
import re
import os
import shutil
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
import time
from datetime import datetime, date, timedelta
import datetime
from dateutil.relativedelta import relativedelta

とりあえずいろいろなサイトをみて必要そうなものをインポートしてきました。

これいらんでしょなどあればコメントしていただけると嬉しいです!社内で利用しているTHANKSの管理者ページへ飛ぶようにSeleniumを使って指定していきます。

#THANKSの管理者ページを開く
s = Service('/Users/YUZU/Desktop/python/chromedriver')
browser = webdriver.Chrome(service=s)
browser.get("https://phoneappli.test/front/admin/thanks/settings")

これだけでも実行するとブラウザが立ち上がりTHANKSのサイトが開きます!ログインページに飛びます。
こんな感じ

スクリーンショット 2021-11-24 10.54.37

ここからIDとパスワードを入力しないといけません。
こちらも自動化します。

あらかじめIDとパスワードを指定します。

ID='automation.test@test.com'
PASS='testtesttesttest'

指定しただけでは入力されないので入力したいテキストボックスの上で右クリック検証を押します。

するとこの該当のテキストボックスのnameがわかります。

IDがaccountID

PASSがpassword

このそれぞれのテキストボックスに対して入力したい文字を送ってあげます。


```python
#ID,PASSを入力
User = browser.find_element(By.NAME,'accountId')
User.send_keys(ID)
Pass =browser.find_element(By.NAME,'Password')
Pass.send_keys(PASS)
```

ログインボタンも同じようにclass名やnameなど固有のIDみたいなものを探して指定して、クリックするために後ろにsubmit()してあげます。

```python
#ログインボタンを押す
find_login_botton=browser.find_element(By.CLASS_NAME,"login-button").submit()
```

管理者ページ開きました!!

期間をボックスをクリックするとカレンダーが出ます。

カレンダーのclass名やnameなどが複数あり、うまく指定できなかったので、xpathで指定します。

```python
#カレンダーを表示させる
find_start_date=browser.find_element(By.XPATH,'/html/body/section/article/div[2]/section/section/div[1]/div[3]/table[1]/tbody/tr/td/input[1]').click()
```

ここからが欲しいデータの期間(2021/6/1-現在)を入力します。

こちらは仕様上カレンダーから日付を選択するのみとなっています。

さらにデフォルトの表示として現在の月から一月分さかのぼった期間を設定されています

カレンダーの戻るボタンを現在の月-1ヶ月と2021/6月の差分の数だけ押した後に1日を選択します。

ここが個人的に一番手こずりました。。。

できたときは達成感で発狂しました笑

差分の数だけ戻るボタンを押して6月になった後に1日の箇所をクリックをXPATHで選択肢クリックしています。

```python
#指定した月をだす
specific_date =datetime.date(2021, 6, 1)
#今月を出す
today_date = datetime.date.today()
#指定した月と今月から1ヶ月引いた月の差だけボタンを押す
i=(today_date.year-specific_date.year)*12 + today_date.month-specific_date.month
for number_of in range(i-1):
   find_start_date_prev=browser.find_element(By.CLASS_NAME,'ui-datepicker-prev').click()

#1日のボタンをクリックする
find_start_date=browser.find_element(By.XPATH,'//*[@id="ui-datepicker-div"]/table/tbody/tr[1]/td[3]/a').click()
```

その後

カード情報ログといいねログのファイルをエクスポートするボタンをそれぞれクリックするように設定します。

```python
find_start_date=browser.find_element(By.XPATH,'//*[@id="thanks_log"]/div[3]/table[2]/tbody/tr[2]/td/button').click()
find_start_date=browser.find_element(By.XPATH,'//*[@id="thanks_log"]/div[3]/table[2]/tbody/tr[3]/td/button').click()
```

最後にブラウザを閉じます。

ファイルをダウンロード後すぐにブラウザを閉じるとダウンロードする前に閉じられてしまうので3秒ほど待機してから閉じるようにしました。

```python
# 3秒待機
time.sleep(3)
#ブラウザを閉じる
browser.close()
```

エクスポートされたフォルダはダウンロードフォルダに入ります。

ダウンロードフォルダはあまりファイルが整理されていないので

別のフォルダへ移動させます。

```python
#2つのファイルをダウンロードから探す
find_from_download_cardInfo_Log = sorted(glob.glob('/Users/YUZU/Downloads/pa_thanks_card_information_log_*.tsv'))
find_from_download_goodLog = sorted(glob.glob('/Users/YUZU/Downloads/pa_thanks_good_log_*.tsv'))
#リスト型から文字列に変換
st_from_download_cardInfo = ''.join(find_from_download_cardInfo_Log)
st_from_download_goodLog = ''.join(find_from_download_goodLog)
#ファイルを移動
shutil.move(st_from_download_cardInfo,'/Users/YUZU/Desktop/python/web操作自動化')
shutil.move(st_from_download_goodLog,'/Users/YUZU/Desktop/python/web操作自動化')
```

1つめのファイルを編集します。

PA PEOPLEの仕様上ファイルはTSV形式なので、TSV形式として読み込みます。

```python
#カード情報ログのファイルを見つける
find_cardInfo_Log = sorted(glob.glob('pa_thanks_card_information_log_*.tsv'))
#リスト型から文字列に変換
str_cardInfo = ''.join(find_cardInfo_Log)
#tsvを読み込む
df = pd.read_csv(str_cardInfo,sep='\t')
```
編集するファイルを見つけて削除する列と列名を変更していきます。を指定していきます。
```python
#削除する列名を指定
drop_col = ['カードID',
           '本文',
           'ポイント',
           'いいね総数',
           '受信者の部署コード1',
           '受信者の部署名1',
           '受信者の部署コード2',
           '受信者の部署名2',
           '受信者のログインID',
           '受信者氏名']
#列を削除する
Drop1=df.drop(drop_col,axis = 1)
#列名を変更
Rename1=Drop1.rename(columns={'送信者の部署コード1':'部署コード1',
                  '送信者の部署名1':'部署名1',
                  '送信者の部署コード2':'部署コード2',
                  '送信者の部署名2':'部署名2',
                  '送信者のログインID':'ログインID',
                  '送信者氏名':'氏名'})
#ファイルの名称を変更する
Rename1.to_csv('true_card_info.csv')
```

続いて2つめのファイルを削除します。

```python
#カード情報ログのファイルを見つける
find_goodLog = sorted(glob.glob('pa_thanks_good_log_*.tsv'))
#リスト型から文字列に変換
str_goodLog = ''.join(find_goodLog)
#tsvを読み込む
df2 = pd.read_csv(str_goodLog,sep='\t')
#削除する列を指定
drop_col2 = ['カードID',
           'いいね総数']
#列の削除
Drop2=df2.drop(drop_col2,axis = 1)
#csvとして出力
Drop2.to_csv('true_good.csv')
```

この2つのファイルを結合していきます。

```python
#フォルダ内のCSVファイルの一覧を取得
files = sorted(glob.glob('true_*.csv'))
#CSVファイルの中身を読み出して、リスト形式にまとめる
csv_list = []
for file in files:
   csv_list.append(pd.read_csv(file,skiprows=[1]))

#CSVファイルの結合
merge_csv = pd.concat(csv_list)
#CSVファイル出力
merge_csv.to_csv('useRate_.csv')
```

最後に元のファイルが4つほど作られたので削除していきます。

ダウンロードにファイルが溜まっていくのが許せないので笑

#カード情報ログのファイルを見つける
find_true_goodLog = sorted(glob.glob('/Users/YUZU/Desktop/python/web操作自動化/true_card*.csv'))
find_true_cardInfo_Log = sorted(glob.glob('/Users/YUZU/Desktop/python/web操作自動化/true_good*.csv'))
#リスト型から文字列に変換
str_true_goodLog = ''.join(find_true_goodLog)
str_true_cardInfo = ''.join(find_true_cardInfo_Log)
#元ファイルすべての削除
os.remove(str_cardInfo)
os.remove(str_goodLog)
os.remove(str_true_cardInfo)
os.remove(str_true_goodLog)

苦労したところ

HTMLやCSSもろくに触れたことがないので、ボタンや入力フォームなどclass名が同じものがいくつもあったりして何を指定して良いのかわからず、かなり時間を費やしてしまいました。。

今回のでXPATHというものを見つけたのでなんとかなりそうでした。
ただ、XPATHにしてしまうと機能を更新等すると変わってしまったりする可能性があるのでおすすめはしないです。

感想

プログラミングの挫折点としてエラーでまくりで何を調べたら良いのかわからない!

英語わからんなどでうまくすすめることができずに時間経過してしまって飽きる→挫折となるパターンが

多いかなと感じています。

僕の場合エラー出まくりで何回もやめようと思いましたが、サクサク進むと楽しくなってくるので

パズルと同じ感覚でやめられないです笑

webの仕組みやプログラミングで使う用語もわからないくらいの初心者でもある程度自動化はすすめることができたのでめんどくさい業務あるなと言う方!

すこし時間をかけてでもやることで日々の業務が10,20分でも減らすことができれば、年単位で膨大な時間の削減につながるのでぜひやってみてください!

今回で一通りやったと思うので他にも面倒だなと思う業務を自動化してみようかと思います!

最後までご覧いただきありがとうございました!!!

この記事が気に入ったらサポートをしてみませんか?