0
0
お題は不問!Qiita Engineer Festa 2024で記事投稿!
Qiita Engineer Festa20242024年7月17日まで開催中!

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

Posted at

事前準備

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

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

スクリーンショット 2024-06-23 11.36.14.png

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

スクリーンショット 2024-06-23 11.43.04.png

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

スクリーンショット 2024-06-23 11.51.39.png

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

スクリーンショット 2024-06-23 11.55.33.png

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

スクリーンショット 2024-06-23 12.34.13.png

settings.yamlの作成

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

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のインストールを行い、下記のスクリプトを作成。

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

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

スクリーンショット 2024-06-23 12.45.47.png

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0