PythonからローカルにあるExcelファイルをGoogleDriveにスプレッドシートとしてアップロード

## 事前準備

**認証情報の作成**
PythonからGoogleDroveに連携するため、下記のURLから認証情報を作成する。

https://console.cloud.google.com/

認証情報の作成は、サイドメニューバー >[APIとサービス] > [認証情報] から作成する。

![スクリーンショット 2024-06-23 11.36.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780659/59b8da06-9200-d912-df50-b1a23ec9e222.png)


[+ 認証情報を作成] > [OAuth クライアント ID]を選択する。

![スクリーンショット 2024-06-23 11.43.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780659/e827b3f3-f6bc-888b-0643-e93d15cfb433.png)

[アプリケーションの種類]に「デスクトップアプリ」を選択する。
[名前]は任意の名称を入力し、[作成]ボタンを押下する。

![スクリーンショット 2024-06-23 11.51.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780659/454ab055-5438-9bed-578e-a42758e37345.png)

作成が完了すると下記の画面が表示される。[JSONをダウンロード]を押下し、JSONファイルをダウンロードする。「client_secrets.json]の名称で保存する。

![スクリーンショット 2024-06-23 11.55.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780659/a615fa68-a784-93de-2884-875eca80dfb8.png)

**OAuthの同意確認**
 [OAuth同意確認] > [Verification Status]が[PREPAGE FOR VERIFICATION]となっていることを確認する。

![スクリーンショット 2024-06-23 12.34.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780659/16108e28-23c1-a10b-31a8-0441404da59e.png)


**settings.yamlの作成**

認証情報に関する情報をsettings.yamlに記載する。

```ruby:settings.yaml
client_config_file: client_secrets.json

save_credentials: True
save_credentials_backend: file
save_credentials_file: saved_credentials.json

get_refresh_token: True
```

## 実装
**ライブラリのインストール**
PyDrive2のインストールを行い、下記のスクリプトを作成。

```ruby:GoogleDrive_Operate.py
import os

from pydrive2.auth import GoogleAuth
from pydrive2.drive import GoogleDrive


class GoogleDriveFacade:

    def __init__(self, setting_path: str = 'settings.yaml'):
        gauth = GoogleAuth(setting_path)
        gauth.LocalWebserverAuth()

        self.drive = GoogleDrive(gauth)
        
    def create_folder(self, folder_name):
        '''
        GoogleDriveのフォルダ確認を行い、フォルダを作成する。
        :param folder_name: フォルダ名
        :return: フォルダ
        '''
        ret = self.check_files(folder_name)
        if ret:
            folder = ret
            print(f"{folder['title']}: exists")
        else:
            folder = self.drive.CreateFile(
                {
                    'title': folder_name,
                    'mimeType': 'application/vnd.google-apps.folder'
                }
            )
            folder.Upload()

        return folder

    def check_files(self, folder_name):
        query = f'title = "{os.path.basename(folder_name)}"'

        list = self.drive.ListFile({'q': query}).GetList()
        if len(list) > 0:
            return list[0]
        return False

    def upload(self, local_file_path: str,
               save_folder_name: str = 'sample',
               is_convert: bool = True):
        if save_folder_name:
            folder = self.create_folder(save_folder_name)

        file = self.drive.CreateFile(
            {
                'title': os.path.basename(local_file_path),
                'parents': [
                    {'id': folder["id"]}
                ]
            }
        )
        file.SetContentFile(local_file_path)
        file.Upload({'convert': is_convert})

        drive_url = f"https://drive.google.com/uc?id={str(file['id'])}"
        return drive_url


if __name__ == "__main__":
    g = GoogleDriveFacade()
    g.upload(
        local_file_path='test.xlsx',
        save_folder_name="2024_プロジェクト",
        is_convert=True,
    )

```

## 動作確認
テスト用に`test.xlsx`を作成し、マイドライブの`2024_プロジェクト`フォルダにアップロードする。

初回実行時は下記のようなOAuth認証画面が表示されるので、画面に従って本人確認を行う。

![スクリーンショット 2024-06-23 12.42.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780659/67e9f8ea-d287-7a64-a0e0-d897e39682d2.png)

GoogleDriveにアクセスし、マイドライブに、[2024_プロジェクト]フォルダの直下に[test.xlsx]が作成されていることを確認。

![スクリーンショット 2024-06-23 12.45.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780659/1dcf10de-95ba-64e6-e5f9-751582bea90f.png)