IT技術で仕事を減らしたい!

ITエンジニアのメモ+α

Python GoogleSheetsAPIでスプレッドシートの情報取得

どうも、nippa です。

python で便利な操作を勉強中です。

本日は、pythonGoogle スプレッドシート(SpeadSheets)から情報を取得してみたいと思います。

Google の公式のクイックスタートを参考にして、python で GoogleSheetAPI を利用してみたいと思います。

GoogleSheetsAPI は Google アカウントがあれば無料で使えます。

GoogleSheetsAPI の詳細については、こちらを参考にしてください。

Google Sheets API v4(英語)

環境

Google Sheets API を有効化

新しくプロジェクトを作成

既存のプロジェクトを利用する場合は、作成不要です。

複数 Google アカウントログインしている場合は、ユーザを選んでから行なってください。

Cloud Console のダッシュボードにアクセスします。

Google Cloud Console

プロジェクトを選択 -> 「新しいプロジェクトの作成」 -> プロジェクトを作成

Google Sheet API を有効化

利用するプロジェクトを選択後に、

「ライブラリ」-> 「Google Sheets API」 -> 「有効可する」を選択

Google Cloud Console ライブラリ

Google Sheets API を無効化する場合が、

「ライブラリ」-> 「Google Sheets API」 -> 「概要」-> 「API を無効にする」

で無効化することもできます。

認証情報の作成と保存

有効可したあとに、認証情報を作成します。

認証情報には 2 種類あります。

  • OAuth クライアント ID: ユーザが Google スプレッドシートにアクセスする認証情報
  • サービスアカウント: サービス、アプリ用の認証情報

必要に応じて、使い分けてください。

「認証情報」 -> 「認証情報を作成」 -> 認証情報を選択して作成

作成した認証情報を保存します。

この認証情報を使って pythongoogle スプレッドシートにアクセスします。

認証情報は、重要な情報なので取り扱いに注意してください。

Git でサーバ上にアップロードなどしないように。

必要なライブラリのインストール

pip でインストールする場合は、以下です。

pip install google-api-python-client google-auth-httplib2 google-auth-oauthlib

conda でインストールする場合は、以下です。

conda install google-api-python-client google-auth-httplib2 google-auth-oauthlib

PythonGoogle スプレッドシートのセルの情報を取得

Google のクイックスタートのサンプルコード(読み取りのみ)

PythonGoogle Sheets API のサンプルコードは以下から取得できます。

Github python-samples/sheets/quickstart/quickstart.py

内容は以下の通りです。

from __future__ import print_function
import pickle
import os.path
from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request

# If modifying these scopes, delete the file token.pickle.
SCOPES = ['https://www.googleapis.com/auth/spreadsheets.readonly']

# The ID and range of a sample spreadsheet.
SAMPLE_SPREADSHEET_ID = '1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms'
SAMPLE_RANGE_NAME = 'Class Data!A2:E'

def main():
    """Shows basic usage of the Sheets API.
    Prints values from a sample spreadsheet.
    """
    creds = None
    # The file token.pickle stores the user's access and refresh tokens, and is
    # created automatically when the authorization flow completes for the first
    # time.
    if os.path.exists('token.pickle'):
        with open('token.pickle', 'rb') as token:
            creds = pickle.load(token)
    # If there are no (valid) credentials available, let the user log in.
    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(
                'credentials.json', SCOPES)
            creds = flow.run_local_server(port=0)
        # Save the credentials for the next run
        with open('token.pickle', 'wb') as token:
            pickle.dump(creds, token)

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

    # Call the Sheets API
    sheet = service.spreadsheets()
    result = sheet.values().get(spreadsheetId=SAMPLE_SPREADSHEET_ID,
                                range=SAMPLE_RANGE_NAME).execute()
    values = result.get('values', [])

    if not values:
        print('No data found.')
    else:
        print('Name, Major:')
        for row in values:
            # Print columns A and E, which correspond to indices 0 and 4.
            print('%s, %s' % (row[0], row[4]))

if __name__ == '__main__':
    main()

前項で作成した認証情報と quickstart.py を同じフォルダに保存し、実行します。

python quickstart.py

#実行結果
Name, Major:
Alexandra, English
Andrew, Math
Anna, English
Becky, Art
Benjamin, English
Carl, Art
Carrie, English
Dorothy, Math
Dylan, Math
Edward, English
Ellen, Physics
Fiona, Art
John, Physics
Jonathan, Math
Joseph, English
Josephine, Math
Karen, English
Kevin, Physics
Lisa, Art
Mary, Physics
Maureen, Physics
Nick, Art
Olivia, Physics
Pamela, Math
Patrick, Art
Robert, English
Sean, Physics
Stacy, Math
Thomas, Art
Will, Math

初回の場合、認証を要求される場合があります。

python コードの中では、認証情報を使って、Token を作成してます。

2 回目からは認証情報ではなく、Token を利用してアクセスしています。

Google のサンプルのスプレッドシートにアクセスして情報を取得して、その情報が表示されます。

スプレッドシート全体の情報の取得

python からスプレッドシート全体の情報の取得する場合、以下のスクリプトになります(スプレッドシート、シート情報)。

こちらには、セルの情報は含まれません。

spreadsheet_idスプレッドシートの ID を指定して下さい。

import json
import pickle
import os.path
from google.auth.transport.requests import Request
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError as googleHttpError

scopes = ['https://www.googleapis.com/auth/spreadsheets.readonly']
spreadsheet_id = 'XXXXXXXXXXXXXXXX'

creds = None

if os.path.exists('token.pickle'):
    with open('token.pickle', 'rb') as token:
        creds = pickle.load(token)
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(
            'credentials.json', scopes)
        creds = flow.run_local_server(port=0)
    with open('token.pickle', 'wb') as token:
        pickle.dump(creds, token)

service = build('sheets', 'v4', credentials=creds)
sheet = service.spreadsheets()

try:
    result = sheet.get(spreadsheetId=spreadsheet_id).execute()
except googleHttpError as e:
    print(e)

print(json.dumps(result, indent=2))

スプレッドシートの情報が表示されます。

スプレッドシートの ID とアクセス権限について

サンプルコード quickstart.py では

SAMPLE_SPREADSHEET_ID = '1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms'

スプレッドシートの ID を指定しています。

ID は スプレッドシートの URL を見ていただて、確認することもできます。

https://docs.google.com/spreadsheets/d/[スプレッドシートのID]/edit#gid=0

また、スプレッドシートの全情報を取得すれば、確認することが可能です。

quickstart.py では読み込み専用になっていますので、

# 変更前
SCOPES = ['https://www.googleapis.com/auth/spreadsheets.readonly']

# 変更後
SCOPES = ['https://www.googleapis.com/auth/spreadsheets']

のように変更が必要になります。

感想

今回、pythonGoogle スプレッドシート の情報を取得についてまとめてみました。

GoogleSheetAPI を利用すれば、スプレッドシートへの書き込みやシートの削除や編集、グラフの作成なども行うことができます。

pythonスプレッドシートにレポートを自動生成することもできます。

少しずつ慣れて、ルーティン的な作業は自動化していきたいですね。

スプレッドシートの操作や書き込みについてもまとめていきます。

ではでは、また次回。