spreadsheetを一括でexcel形式にダウウンロードする【python自動化】(その1)

「spreedsheetを一括でダウンロードしたい。」

「spreedsheetからexcelにサービスを移行したいと考えているけど、ファイル多すぎてダウンロード大変」

私自身もそうでした。会社の中で、spreedsheetから試験的にexcelに移行してみたいという話が出ていました。そのためには、spreedsheetをダウンロードしてexcelに移行する必要があるのですが、spreedsheetには一括ダウンロードができなく、一つ一つ手作業でやる必要がありました。(何百ファイルとなるとめちゃ大変でした)

今回は、pythonのseleniumを使って、ダウンロードするまでの一連の作業を自動化していきたいと思います。

こちらを用いれば、スプレッドシート一覧から一括でダウンロードが可能になります。ぜひ一気にダウンロードをしたいという方は、試してみて下さい。

GoogleSpreedSheetは一括ダウンロードができない

SpreedSheetを一括でダウンロードする方法はありません。(もしどこかで一括でダウンロードするツールがあったら教えてほしいです)

もしダウンロードをしたい場合は、ファイルを一つ一つ開いて、メニューの「ファイル」から「ダウンロード」を選び、Excel形式か自分のダウンロードしたい形式を選んで行います。

これでは、ダウンロードしたいファイルが何百ファイルもある場合は、作るのがめちゃくちゃ大変になります。

今回はこの作業を自動化できないかと考えました。

解説の順番

解説の順番

①Googleアカウントでログインし、各SpreedSheetのURLを取得する←(今回はこれ)

②URLを加工し、ダウンロードする

解説は、この2ステップで行います。今回は各ファイルのURLを取得するところまでをやっていきます。

前準備

今回の自動化にはPythonのseleniumとwebDriverなどを用います。まず最初に準備しておくことがあるので準備しておきましょう。

  • Python
  • selenium
  • ChoromeDriver
  • SpreedSheetを閲覧できるアカウントのプロフィールパスを取得
  • Chromeのバックグラウンドインスタンスの停止

Python やselenium、ChromeDriverのダウンロードは他のサイトでも載っているのでここは割愛します。

SpreedSheetを閲覧できるアカウントのプロフィールパスを取得

SpreedSheetにログインできるアカウントでChromeにログインしましょう。

ログイン後、URLで以下を検索します。

chrome://version

コメント 2022-07-05 080528.png

こちらのプロフィールパスの部分を後で使うので、このページを参照できるようにしておいてください。

Chromeのバックグラウンドインスタンスの停止

今回Pythonのseleniumを使いますが、Chromeを操作する際にChromeのインスタンスが実行されていてはエラーが起きます。

そのため、Chromeをバックグラウンドの実行を止める設定をします。

Chormeの右上の「3ポチ」(三つの点があるやつ)をクリックして、その中の「設定」を選びます。

すると、以下のように設定画面がでるので、左のメニューバーから「システム」を選びます。

「GoogleChromeを閉じた際にバックグランドアプリの処理を続行する」をオフにします。

コード解説

# 時間を計るライブラリをインポート
import time
# WebDriverライブラリをインポート
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
# ChromeのWebDriverライブラリをインポート
from selenium.webdriver.chrome import service as fs

#ChromeDriverのパスを指定
#今回は同じディレクトリに置いている。
CHROMEDRIVER = "chromedriver.exe"
 
# ドライバー指定でChromeブラウザを開く
chrome_service = fs.Service(executable_path=CHROMEDRIVER)
options = Options()
#以下を加えないとエラーが出る場合があった。(今はない)
#options.add_argument('--headless')

options.add_experimental_option('detach', True)
# プロファイルの保存先を指定
# <ユーザー名>は変更してください。以下2行注意点あり。
options.add_argument("--user-data-dir=C:/Users/<ユーザー名>/AppData/Local/Google/Chrome/User Data")
# 使用するプロファイルを指定
options.add_argument("--profile-directory=Profile 1")


driver = webdriver.Chrome(service=chrome_service, options=options)
# Chromeを開いてスプレッドシート一覧にアクセスする
driver.get('https://docs.google.com/spreadsheets/u/0/')

#時間を置く。
time.sleep(5)

SearchClass = "docs-homescreen-list-item docs-homescreen-item-shared"
num = 0
count=len(driver.find_elements(By.XPATH,"//*[@class='docs-homescreen-list-item docs-homescreen-item-shared']"))
hover = []
#以下のcountを変えることで、回数を変更可能(最大45件。スクロール制御を加えればさらに多くを取得できる)
for i in range(count):
    #以下のclassの値(docs-home~~)が違うかもしれないので、「存在しない」エラーが出た場合サイトを確認してみてください。
    hover=driver.find_elements(By.XPATH,"//*[@class='docs-homescreen-list-item docs-homescreen-item-shared']")
    time.sleep(1)#ロードができていない場合、取得できない場合があるので、間隔をあけている
    print(len(hover))#ここでhoverの数が0の場合は読み込めていないとき。対策は、time.sleepを長くするか、hoverが0以外の時にのみ処理を実行するか。
    hover[num].click()
    print(driver.title)
    print(num,":",driver.current_url)
    driver.back()
    time.sleep(2)#同様に間隔を空けている(hoverが0の時は再度処理をやり直すのを組み込んでも良い)
    num = num + 1 


time.sleep(5)
#スクリーンショットを撮影したい場合
#driver.save_screenshot('selenium_schreenshot_test2.png')
time.sleep(5)


# 画面を閉じる。インスタンスを終了する処理を組み込まなければ、次に実行したときにエラーになる可能性がある。
driver.quit()

「プロファイルの保存先を指定」と「使用するプロファイルを指定」とするところは、先ほど準備した、プロフィールパスを使用します。

注意点として、

--user-data-dir=C:/Users/<ユーザー名>/AppData/Local/Google/Chrome/User Data

の部分で、User Dataの間にスペースを必ず設けましょう。設けないとエラーとなります。

また、「使用するプロファイルを指定」のところは、プロフィールパスの「~~Data\<ここに記載してあるもの>」を記載しましょう。

このpythonファイルを実行すれば、ファイルのURLが取得できるはずです。

エラーが出た場合

エラーパターン①

SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 18-19: truncated \UXXXXXXXX escape

このエラーの場合は、

options.add_argument("--user-data-dir=C:/Users/<ユーザー名>/AppData/Local/Google/Chrome/User Data/")

この部分で「\」となっている可能性があります。

全て、「/」となっているか確認しましょう。

エラーパターン②

エラーの原因として考えられるのは、GoogleChromeのインスタンスが実行されている可能性が考えられます。

バックグラウンドでGoogleChromeが実行されているかを確認してみてください。実行されている場合は、それを終了することが必要です。

もちろん、フォアグラウンドで通常でChromeが開いていてもダメなので、全てウィンドウは閉じるようにしましょう。

バックグラウンドで動くChromeを停止させる

①スタートメニューから、「タスクマネージャー」を選択します。

②「プロセス」の中の、バックグラウンドプロセスで、GoogleChromeが実行されていないか確認します。

③実行されている場合は、選択して「タスクの終了」を行います。

今回はここまで

今回は、GoogleSpreedSheetのダウンロードをpythonのseleniumでURLを取得する方法まで解説しました。

次は、URLを取得したところから、ダウンロードをするところを実装していきますので、そちらも合わせてご覧ください。

(Visited 3 times, 1 visits today)