【python】Googleスプレッドシートを読み書きしてみた(gspread)

かずおじです。pythonを使って、Googleスプレッドシートに単純な読み書きをしてみました。その時のメモになります。Anaconda環境でgspreadライブラリをインストールして使用しました。

前提

以下を前提としている。

  • Google Sheets APIの認証情報を取得している
  • Google Sheets APIを有効化している
  • 読み書き対象となるGoogleスプレッドシートの共有を有効にしている
  • サービスアカウントキーのJSONファイルをダウンロードしている

gspreadとは

Googleスプレッドシートを操作できるPythonAPIである。

↓公式ドキュメント

gspread — gspread 5.2.0 documentation

環境

  • MacOS Big Sur 11.2.2
  • Anaconda3
  • python 3.7.9
  • gspread 3.6.0
  • oauth2client 4.1.3

必須ライブラリのインストール

Googleスプレッドシートを読み書きするためには、gspreadとAPI認証処理をするoauth2clientが必要。

gspreadのインストール

$ conda install -c conda-forge gspread

oauth2clientのインストール

$ conda install -c conda-forge oauth2client

Googleスプレッドシートを読み書きするためのコーディング

今回は単純な読み書きをやってみた。

ライブラリのインポート

前節でインストールしたライブラリをインポート。

import gspread
from oauth2client.service_account import ServiceAccountCredentials

認証処理

サービスアカウントキーやAPIキーはGoogle Cloud Platformで取得すし、以下で認証処理ができる。(※トラブルシューティングあり)

# 必要な認証情報
## サービスアカウントキーのJSONファイルのパス
json_path = "./XXXXXXXXXXXXXXXXX.json"
## GoogleスプレッドシートのAPIキー
gss_key = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
## GoogleスプレッドシートとGoogleドライブのURL(ここは共通)
api = ['https://spreadsheets.google.com/feeds','https://www.googleapis.com/auth/drive']

# 認証処理
cred = ServiceAccountCredentials.from_json_keyfile_name(json_path, api)
gs_auth = gspread.authorize(cred)

ワークシートの取得

以下で単純にsheet1を取得できる。

# Work Sheet取得
lang_ws = gs_auth.open_by_key(gss_key).sheet1

書き込み

テキトーにリストデータを書き込んでみた。以下のようにupdate_callメソッドでセルの中身を更新するという形で書き込むことができる。なお、セルの位置は今回は数値で指定しているが、他の指定方法もある。

# データの書き込み
## 書き込むデータ
lang_list_written = ["Python","SQL","C","Java","Javascript","C++","C#","HTML","CSS","Julia","Cobol"]
for i,lang in enumerate(lang_list_written):
    lang_ws.update_cell(i+1,1,i+1)
    lang_ws.update_cell(i+1,2,lang)

読み込み

前節で書き込んだデータを読み込んでみた。get_all_valuesメソッドで取得可能で、リスト型で取得される。

# データの読み込み
lang_list_read = lang_ws.get_all_values()
for lang in lang_list_read:
    print(lang)

以下、出力結果。

 ['1', 'Python']
 ['2', 'SQL']
 ['3', 'C']
 ['4', 'Java']
 ['5', 'Javascript']
 ['6', 'C++']
 ['7', 'C#']
 ['8', 'HTML']
 ['9', 'CSS']
 ['10', 'Julia']
 ['11', 'Cobol'] 

全体コード

import gspread
from oauth2client.service_account import ServiceAccountCredentials

# 必要な認証情報
## サービスアカウントキーのJSONファイルのパス
json_path = "./XXXXXXXXXXXXXXXXX.json"
## GoogleスプレッドシートのAPIキー
gss_key = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
## GoogleスプレッドシートとGoogleドライブのURL(ここは共通)
api = ['https://spreadsheets.google.com/feeds','https://www.googleapis.com/auth/drive']

# 認証処理
cred = ServiceAccountCredentials.from_json_keyfile_name(json_path, api)
gs_auth = gspread.authorize(cred)

# Work Sheet取得
lang_ws = gs_auth.open_by_key(gss_key).sheet1

# データの書き込み
## 書き込むデータ
lang_list_written = ["Python","SQL","C","Java","Javascript","C++","C#","HTML","CSS","Julia","Cobol"]
for i,lang in enumerate(lang_list_written):
    lang_ws.update_cell(i+1,1,i+1)
    lang_ws.update_cell(i+1,2,lang)

# データの読み込み
lang_list_read = lang_ws.get_all_values()
for lang in lang_list_read:
    print(lang)

トラブルシューティング

以下、筆者が当たったエラーである。

エラー:Google Sheets API has not been used in project

gspread.exceptions.APIError: {'code': 403, 'message': 'Google Sheets API has not been used in project XXXXXXXXXXXXXX before or it is disabled. Enable it by visiting https://console.developers.google.com/apis/api/sheets.googleapis.com/overview?project=XXXXXXXXXXXXXX then retry. If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry.', 'status': 'PERMISSION_DENIED', 'details': [{'@type': 'type.googleapis.com/google.rpc.Help', 'links': [{'description': 'Google developers console API activation', 'url': 'https://console.developers.google.com/apis/api/sheets.googleapis.com/overview?project=XXXXXXXXXXXXXX'}]}, {'@type': 'type.googleapis.com/google.rpc.ErrorInfo', 'reason': 'SERVICE_DISABLED', 'domain': 'googleapis.com', 'metadata': {'service': 'sheets.googleapis.com', 'consumer': 'projects/XXXXXXXXXXXXXX'}}]}

解決方法

Google Cloud PlatformでGoogle Sheets APIを有効にする。

エラー:The caller does not have permission

gspread.exceptions.APIError: {'code': 403, 'message': 'The caller does not have permission', 'status': 'PERMISSION_DENIED'}

解決方法

対象のGoogleスプレッドシートで共有を有効にする。