PythonとseleniumでExcelファイルを自動翻訳

## 追記
2021/05/27 コードを一新しました（というより、掲載コードが正しく動いていませんでした。）


# 初めに
仕事の都合上、英語を使う（読む・書く・聞く（予定）・話す（予定））ことがあります。
メールだけでなく、WordやExcel、PDF等のファイルにもズラっと英文が書かれていたりします。

簡単な英文だと、「まあ、こんな感じのこと書いとるな～」程度で訳せるんですが、
これに技術的な話が混ざると機械翻訳に頼っちゃうんですよね（英語弱者）

機械翻訳もまあ精度の問題がありますが、自動で翻訳するプログラムを書いておけば
他の作業と並行できるのではと思い自動翻訳に挑戦してみました。

# 準備
windows10 64bit
python3.9.4 (PATHは設定済み)
Google Chrome
chromedriver.exe(Google Chromeと同じバージョン)

取り敢えず、この4つを用意してもらえると良いかと思います。
次に、必要なライブラリ等のインストールをしていきます。

# python用のライブラリ
```
pip install selenium
pip install openpyxl
```
次に、ちょっとややこしいchromedriver.exeのダウンロードをしていきます。

# chromedriver.exeのダウンロード

1. 【Google Chromeの設定】から【設定】をクリック
1. 【Chromeについて】をクリックし、バージョンを確認します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1501045/20628afc-77ec-fdad-3617-873d6c2d4f86.png)

1. https://chromedriver.chromium.org/downloads にアクセス　
1. Current Releasesにて 2. で調べたバージョンと同じchromedriver.zip をダウンロードします

これで必要なものはそろいました。次からプログラムの作成に取り掛かります。

# プログラムコード

## ライブラリのimport

```translate.py
from selenium import webdriver
import openpyxl
```
Python初めて2週間なので、importの順番は適当です。。。
（何か、鉄則等があればご教授願います）

##Excelファイルの読込
```translate.py
workbook = openpyxl.load_workbook("sample.xlsx")
```
sample.xlsxは後ほど準備いたします。

##翻訳対象外を取り除く
空白セルを訳しても意味がないので、省略して時間短縮を図ります。
そのほか、気づいたものだけ条件分岐で取り除きます。
2021/11/29 更新
一部処理を変更しました。

```translate.py
for sheet in workbook: #ファイルの中からシートを列挙
  for row in sheet: #シートの中から行を列挙
      for cell in row #行の中からセルを列挙
          value = cell.value
          if value is not None: #セルの中身が空白ではないとき
            if isinstance(value, int)
              continue:
            if isinstance(cell.value,float) 
              continue:
            #翻訳処理をここに書く(選ばれし英文が翻訳される）
           
         else:#空白セルは何もしない。
           continue
  

```
翻訳対象のセルを探すだけで3重ループ。。。
セルの数が多すぎると時間がかかりますね。

## 翻訳処理
翻訳処理を作成します。ここでは関数を利用します。

```translator.py
def translator(value):
    driver = webdriver.Chrome(executable_path="C:\\chromedriver.exe")
    webdriver.implicitly_wait(3)

    url = "https://translate.google.co.jp/#ja/en/{0}".format(value)
    driver.get(url)

    en = driver.find_element_by_css_selector("span[jsname='W297wb']")
    cell.value = en.text
    driver.close()
    driver.quit()
```
先ほど、ダウンロードしたchromedriver.exeをC:\\直下に配置しておいて
pathが通るようにしておきます。
翻訳にはGoogle翻訳を利用させていただきました。

## すべてのまとめたファイル

```translate.py
from selenium import webdriver
import openpyxl

def translator(value):
    driver = webdriver.Chrome(executable_path="C:\\chromedriver.exe")
    webdriver.implicitly_wait(3)

    url = "https://translate.google.co.jp/#ja/en/{0}".format(value)
    driver.get(url)

    en = driver.find_element_by_css_selector("span[jsname='W297wb']")
    cell.value = en.text
    driver.close()
    driver.quit()

workbook = openpyxl.load_workbook("sample.xlsx")

for sheet in workbook: #ファイルの中からシートを列挙
  for row in sheet: #シートの中から行を列挙
      for cell in row #行の中からセルを列挙
          value = cell.value
          if cell.value is None:
              continue:
          if isinstance(cell.value,int)
              continue:
          translator(value)

workbook.save("translated.xlsx")
print("翻訳終了")
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1501045/5cb71eb7-3922-0224-4ec1-cf2104bac248.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1501045/1a9b3e45-8c5c-7161-5ba3-8348f6fe0e1f.png)
翻訳できてますね。

# 自動化できたけど・・・
目的の自動化は達成できましたが、翻訳対象のセルが膨大になると
律儀にセル単位で翻訳してると時間が結構かかります。

セルの中身を取り出して翻訳かけて元の位置に戻す処理を行っているので
マルチスレッドでも十分対応できるのではないかと思い試してみました。

2021/11/29 更新
処理を大幅に変更しましたので、ソースコードを一旦非公開にしました。
申し訳ありません。

# 終わりに
Python歴 2週間のド素人ですが、自動翻訳を作成することができました。
今後の方針として
* GUIアプリとして開発 (近日公開予定)
* 翻訳にかけるファイルを増やす(Word PowerPoint PDF等) (近日公開予定)
* 翻訳対象外の文字の把握 (作成中)
* 結合セルの対策 (作成中)
* headlessモードの搭載 (検討中)
があげられます

headlessモードを実現するには社内プロキシを回避する方法がありますので
もう少し先の話かなと・・・

学生時代はフロントエンド?(HTML,CSS,JavaScript)あたりを触っていたので、
これらをうまく活用できたら良いなと思います。

割りと工夫して作ったつもりなのですが、結局後半は突貫工事になってしまいました。
マルチスレッドを使いこなすにはまだ未熟だということを知りました。

今後はPythonの言語仕様をしっかり把握して、もう少しお行儀のよいプログラムを作成していこうと思います。

# 謝辞
本プログラムを作成するにあたって

1. [【Python】Seleniumの使用方法メモ](https://qiita.com/motoki1990/items/a59a09c5966ce52128be)
(@motoki1990様)
1. [Python + Selenium で Chrome の自動操作を一通り](https://qiita.com/memakura/items/20a02161fa7e18d8a693)
(@memakura様)
1. [SeleniumでGoogle翻訳を自動化する--晴耕雨読](https://tex2e.github.io/blog/python/selenium-google-translate)
1. [Pythonのthreadingとmultiprocessingを完全理解](@kaitolucifer)
1. (https://qiita.com/kaitolucifer/items/e4ace07bd8e112388c75)
1. [【Python】日本語のエクセルデータを簡単に英語に翻訳するやり方](https://note.com/gaku_prog/n/n2c2d2a529f12)

を参考にさせて頂きました。
Pythonの面白さ、自動化の仕組みについて知ることができました。
この場をお借りしてお礼申し上げます。
今後もPythonを利用した自動化について勉強していこうと思います。