この記事では、PythonでプログラムによってExcelデータをGoogleスプレッドシートにエクスポートする方法を学習します。

PythonでExcelファイルをGoogleスプレッドシートにエクスポートする

Excelファイルは、データを保存し、グラフの生成や数式の適用など、さまざまな種類の操作を実行するために広く使用されています。一方、Google Sheetsは、スプレッドシートを作成および操作するための人気のあるオンラインアプリケーションです。 Googleスプレッドシートは、複数の人とスプレッドシートをリアルタイムで共有することもできます。場合によっては、ExcelXLSまたはXLSXファイルをプログラムでGoogleスプレッドシートにエクスポートする必要があります。これを実現するために、この記事では、Googleプロジェクトを設定し、PythonでExcelファイルからGoogleスプレッドシートにデータをエクスポートする方法に関する完全なガイドを提供します。

前提条件-PythonでExcelデータをGoogleスプレッドシートにエクスポートする

Google Cloud Project

Googleスプレッドシートと通信するには、Google Cloudでプロジェクトを作成し、GoogleスプレッドシートAPIを有効にする必要があります。また、コードで実行するアクションを承認するために使用される資格情報を作成する必要があります。 GoogleCloudプロジェクトを作成してGoogleSheetsAPIを有効にする方法のガイドラインを読むことができます。

Google Cloudプロジェクトを作成し、Google Sheets APIを有効にしたら、Pythonアプリケーションに次のAPIをインストールできます。

ExcelファイルをGoogleスプレッドシートにエクスポートするPythonライブラリ

Excel XLS / XLSXファイルからGoogleスプレッドシートにデータをエクスポートするには、次のAPIが必要です。

PythonでExcelからGoogleスプレッドシートにデータをエクスポートする

以下は、Excel XLSXファイルからデータを読み取り、PythonアプリケーションでGoogleスプレッドシートに書き込む方法のステップバイステップガイドです。

1.新しいPythonアプリケーションを作成します。

2.プロジェクトにAspose.CellsとGoogleクライアントライブラリをインストールします。

pip install aspose.cells
pip install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib
  1. JSONファイル(Google Cloudでクレデンシャルを作成した後にダウンロードしたもの)をプロジェクトのディレクトリに配置します。

  2. Googleスプレッドシートに新しいスプレッドシートを作成し、デフォルトシートの名前を設定し、スプレッドシートのIDを返すcreatespreadsheetという名前のメソッドを記述します。

def create_spreadsheet(_service, _title, _sheetName):   
    # スプレッドシートの詳細
    spreadsheetBody = {
        'properties': {
            'title': "{0}".format(_title)
        },
        'sheets': {
            'properties': {
                'title' : "{0}".format(_sheetName)
            }
        }
    }

    # スプレッドシートを作成
    spreadsheet = _service.spreadsheets().create(body=spreadsheetBody,
                                                fields='spreadsheetId').execute()
    
    print('Spreadsheet ID: {0}'.format(spreadsheet.get('spreadsheetId')))
    print('Spreadsheet URL: "https://docs.google.com/spreadsheets/d/{0}'.format(spreadsheet.get('spreadsheetId')))
    
    # ウェブブラウザで開く
    webbrowser.open_new_tab("https://docs.google.com/spreadsheets/d/{0}".format(spreadsheet.get('spreadsheetId')))

    return spreadsheet.get('spreadsheetId')
  1. add_sheet という名前の別のメソッドを記述して、Googleスプレッドシートに新しいシートを追加します。
def add_sheet(_service, _spreadsheetID, _sheetName):
    data = {'requests': [
        {
            'addSheet':{
                'properties':{'title': '{0}'.format(_sheetName)}
            }
        }
    ]}

    # リクエストを実行
    res = _service.spreadsheets().batchUpdate(spreadsheetId=_spreadsheetID, body=data).execute()

6.次に、クレデンシャル(JSONファイル)を使用してGoogleスプレッドシートサービスを初期化し、アプリケーションのスコープを定義します。 scopesパラメータは、Googleスプレッドシートとそのプロパティへのアクセス許可を指定するために使用されます。

# これらのスコープを変更する場合は、token.json ファイルを削除してください。
SCOPES = ['https://www.googleapis.com/auth/spreadsheets']

creds = None
# ファイル token.json には、ユーザーのアクセス トークンと更新トークンが格納され、
# 承認フローが初めて完了するときに自動的に作成されます。
if os.path.exists('token.json'):
    creds = Credentials.from_authorized_user_file('token.json', SCOPES)

# 利用可能な (有効な) 資格情報がない場合は、ユーザーにログインさせます。
if not creds or not creds.valid:
    if creds and creds.expired and creds.refresh_token:
        creds.refresh(Request())
    else:
        flow = InstalledAppFlow.from_client_secrets_file(
            'credentials1.json', SCOPES)
        creds = flow.run_local_server(port=0)
    # Save the credentials for the next run
    with open('token.json', 'w') as token:
        token.write(creds.to_json())

    service = build('sheets', 'v4', credentials=creds)

7.次に、Aspose.Cellsを使用してExcel XLSまたはXLSXファイルをロードし、ブックの最初のワークシートの名前を取得します。

# Excel ワークブックを読み込む
wb = Workbook(fileName)

# ワークシート コレクションを取得する
collection = wb.getWorksheets()
collectionCount = collection.getCount()

# ワークブックと最初のシートの名前を取得する
spreadsheetName = wb.getFileName()
firstSheetName = collection.get(0).getName()

8.create_spreadsheet メソッドを呼び出してGoogleスプレッドシートに新しいスプレッドシートを作成します。

# Google スプレッドシートでスプレッドシートを作成する
spreadsheetID = create_spreadsheet(service, spreadsheetName, firstSheetName)

9.Excelファイルのワークシートをループします。各反復で、ワークシートからデータを読み取り、それを配列に追加します。

# すべてのワークシートをループする
for worksheetIndex in range(collectionCount):

    # インデックスを使用してワークシートを取得する
    worksheet = collection.get(worksheetIndex)

    # ワークシート範囲の設定
    if(worksheetIndex==0):
        sheetRange= "{0}!A:Y".format(firstSheetName)
    else:
        add_sheet(service, spreadsheetID, worksheet.getName())
        sheetRange= "{0}!A:Y".format(worksheet.getName())

    # 行数と列数を取得する
    rows = worksheet.getCells().getMaxDataRow()
    cols = worksheet.getCells().getMaxDataColumn()

    # ワークシートのデータを格納するリスト
    worksheetDatalist = []

    # 行をループする
    for i in range(rows):
        # ワークシートの各行を格納するリスト 
        rowDataList = []

        # 選択した行の各列をループします
        for j in range(cols):
            cellValue = worksheet.getCells().get(i, j).getValue()
            if( cellValue is not None):
                rowDataList.append(str(cellValue))
            else:
                rowDataList.append("")

        # ワークシート データに追加
        worksheetDatalist.append(rowDataList)
  1. Excelファイルのワークシートごとに、Googleスプレッドシートにデータを書き込むリクエストを作成します。
# 設定値
body = {
    'values': worksheetDatalist
}

# リクエストを実行
result = service.spreadsheets().values().update(
    spreadsheetId=spreadsheetID, range=sheetRange,
    valueInputOption='USER_ENTERED', body=body).execute()

# 更新されたセルの数を出力    
print('{0} cells updated.'.format(result.get('updatedCells')))

以下は、ExcelファイルからGoogleスプレッドシートのスプレッドシートにデータをエクスポートするための完全な機能です。

def export_to_google(fileName):
    # これらのスコープを変更する場合は、token.json ファイルを削除してください。
    SCOPES = ['https://www.googleapis.com/auth/spreadsheets']

    creds = None
    # ファイル token.json には、ユーザーのアクセス トークンと更新トークンが格納され、
    # 承認フローが初めて完了するときに自動的に作成されます。
    if os.path.exists('token.json'):
        creds = Credentials.from_authorized_user_file('token.json', SCOPES)
    
    # 利用可能な (有効な) 資格情報がない場合は、ユーザーにログインさせます。
    if not creds or not creds.valid:
        if creds and creds.expired and creds.refresh_token:
            creds.refresh(Request())
        else:
            flow = InstalledAppFlow.from_client_secrets_file(
                'credentials1.json', SCOPES)
            creds = flow.run_local_server(port=0)
        # Save the credentials for the next run
        with open('token.json', 'w') as token:
            token.write(creds.to_json())

    try:
        service = build('sheets', 'v4', credentials=creds)
        
        # Excel ワークブックを読み込む
        wb = Workbook(fileName)

        # ワークシート コレクションを取得する
        collection = wb.getWorksheets()
        collectionCount = collection.getCount()

        # ワークブックと最初のシートの名前を取得する
        spreadsheetName = wb.getFileName()
        firstSheetName = collection.get(0).getName()

        # Google スプレッドシートでスプレッドシートを作成する
        spreadsheetID = create_spreadsheet(service, spreadsheetName, firstSheetName)

        # ワークシート範囲を設定するには
        sheetRange = None

        # すべてのワークシートをループする
        for worksheetIndex in range(collectionCount):

            # インデックスを使用してワークシートを取得する
            worksheet = collection.get(worksheetIndex)

            # ワークシート範囲の設定
            if(worksheetIndex==0):
                sheetRange= "{0}!A:Y".format(firstSheetName)
            else:
                add_sheet(service, spreadsheetID, worksheet.getName())
                sheetRange= "{0}!A:Y".format(worksheet.getName())

            # 行数と列数を取得する
            rows = worksheet.getCells().getMaxDataRow()
            cols = worksheet.getCells().getMaxDataColumn()

            # ワークシートのデータを格納するリスト
            worksheetDatalist = []

            # 行をループする
            for i in range(rows):
                # ワークシートの各行を格納するリスト 
                rowDataList = []

                # 選択した行の各列をループします
                for j in range(cols):
                    cellValue = worksheet.getCells().get(i, j).getValue()
                    if( cellValue is not None):
                        rowDataList.append(str(cellValue))
                    else:
                        rowDataList.append("")

                # ワークシート データに追加
                worksheetDatalist.append(rowDataList)

            # 設定値
            body = {
                'values': worksheetDatalist
            }
            
            # リクエストを実行
            result = service.spreadsheets().values().update(
                spreadsheetId=spreadsheetID, range=sheetRange,
                valueInputOption='USER_ENTERED', body=body).execute()

            # 更新されたセルの数を出力    
            print('{0} cells updated.'.format(result.get('updatedCells')))
    except HttpError as err:
        print(err)

    print("Workbook has been exported to Google Sheets.")

完全なソースコード

以下は、ExcelXLSXファイルをPythonのGoogleスプレッドシートにエクスポートするための完全なソースコードです。

from __future__ import print_function
import jpype
import webbrowser
import os.path
from google.auth.transport.requests import Request
from google.oauth2.credentials import Credentials
from google_auth_oauthlib.flow import InstalledAppFlow
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError
import asposecells

jpype.startJVM()
from asposecells.api import Workbook, License


def export_to_google(fileName):
    # これらのスコープを変更する場合は、token.json ファイルを削除してください。
    SCOPES = ['https://www.googleapis.com/auth/spreadsheets']

    creds = None
    # ファイル token.json には、ユーザーのアクセス トークンと更新トークンが格納され、承認フローが初めて完了するときに自動的に作成されます。
    if os.path.exists('token.json'):
        creds = Credentials.from_authorized_user_file('token.json', SCOPES)
    
    # 利用可能な (有効な) 資格情報がない場合は、ユーザーにログインさせます。
    if not creds or not creds.valid:
        if creds and creds.expired and creds.refresh_token:
            creds.refresh(Request())
        else:
            flow = InstalledAppFlow.from_client_secrets_file(
                'credentials1.json', SCOPES)
            creds = flow.run_local_server(port=0)
        # 次回の実行のために資格情報を保存します
        with open('token.json', 'w') as token:
            token.write(creds.to_json())

    try:
        service = build('sheets', 'v4', credentials=creds)
        
        # Excel ワークブックを読み込む
        wb = Workbook(fileName)

        # ワークシート コレクションを取得する
        collection = wb.getWorksheets()
        collectionCount = collection.getCount()

        # ワークブックと最初のシートの名前を取得する
        spreadsheetName = wb.getFileName()
        firstSheetName = collection.get(0).getName()

        # Google スプレッドシートでスプレッドシートを作成する
        spreadsheetID = create_spreadsheet(service, spreadsheetName, firstSheetName)

        # ワークシート範囲を設定するには
        sheetRange = None

        # すべてのワークシートをループする
        for worksheetIndex in range(collectionCount):

            # インデックスを使用してワークシートを取得する
            worksheet = collection.get(worksheetIndex)

            # ワークシート範囲の設定
            if(worksheetIndex==0):
                sheetRange= "{0}!A:Y".format(firstSheetName)
            else:
                add_sheet(service, spreadsheetID, worksheet.getName())
                sheetRange= "{0}!A:Y".format(worksheet.getName())

            # 行数と列数を取得する
            rows = worksheet.getCells().getMaxDataRow()
            cols = worksheet.getCells().getMaxDataColumn()

            # ワークシートのデータを格納するリスト
            worksheetDatalist = []

            # 行をループする
            for i in range(rows):
                # ワークシートの各行を格納するリスト 
                rowDataList = []

                # 選択した行の各列をループします
                for j in range(cols):
                    cellValue = worksheet.getCells().get(i, j).getValue()
                    if( cellValue is not None):
                        rowDataList.append(str(cellValue))
                    else:
                        rowDataList.append("")

                # ワークシート データに追加
                worksheetDatalist.append(rowDataList)

            # 設定値
            body = {
                'values': worksheetDatalist
            }
            
            # リクエストを実行
            result = service.spreadsheets().values().update(
                spreadsheetId=spreadsheetID, range=sheetRange,
                valueInputOption='USER_ENTERED', body=body).execute()

            # 更新されたセルの数を出力    
            print('{0} cells updated.'.format(result.get('updatedCells')))
    except HttpError as err:
        print(err)

    print("Workbook has been exported to Google Sheets.")

def create_spreadsheet(_service, _title, _sheetName):   
    # スプレッドシートの詳細
    spreadsheetBody = {
        'properties': {
            'title': "{0}".format(_title)
        },
        'sheets': {
            'properties': {
                'title' : "{0}".format(_sheetName)
            }
        }
    }

    # スプレッドシートを作成
    spreadsheet = _service.spreadsheets().create(body=spreadsheetBody,
                                                fields='spreadsheetId').execute()
    
    # ウェブブラウザで開く
    webbrowser.open_new_tab("https://docs.google.com/spreadsheets/d/{0}".format(spreadsheet.get('spreadsheetId')))

    return spreadsheet.get('spreadsheetId')

def add_sheet(_service, _spreadsheetID, _sheetName):
    data = {'requests': [
        {
            'addSheet':{
                'properties':{'title': '{0}'.format(_sheetName)}
            }
        }
    ]}

    # リクエストを実行
    res = _service.spreadsheets().batchUpdate(spreadsheetId=_spreadsheetID, body=data).execute()

 # Aspose.Cells ライセンス オブジェクトを作成する
license = License()

# 評価制限を回避するために Aspose.Cells のライセンスを設定します。
license.setLicense("D:\\Licenses\\Conholdate.Total.Product.Family.lic")

export_to_google("Book1.xlsx")

無料のAspose.Cellsライセンスを取得する

無料の一時ライセンスを取得して、評価の制限なしにPython用のAspose.Cellsを使用できます。

結論

この記事では、PythonでExcelデータをGoogleスプレッドシートにエクスポートする方法を学びました。 Google Cloudでプロジェクトを作成する方法、Google Sheets APIを有効にする方法、Excelファイルを読み取る方法、ExcelファイルからGoogleSheetsにデータをエクスポートする方法について説明しました。 Aspose.Cells for Pythonの詳細については、ドキュメントにアクセスしてください。また、フォーラムから質問することもできます。

関連項目