Google Sheets API

v3のAPIが2021/6/8に終わるみたいなので,v4に対応しなきゃなーって.
gspread 0.6.2とか使ってた気がするけど,v4に対応させるために3.6.0を使うことにした.

認証

日本語記事だと結構gspread使うとき,oauth2clientを使ってるみたいだけど,古いバージョンだとそうみたい.
今は(といっても,2021/1/24はって意味だけど),oauth2clientは非推奨で,google-authを採用しているっぽい.
oauth2clientを使っててもgspreadが今はgoogle-authに変換してくれるみたいだけど,今のうちgoogle-authに切り替えていたほうが良いよね.

  • Google Developers Consoleにログイン
  • プロジェクト作成をクリックして,プロジェクト名と場所を設定して作成する(場所よくわからんし,組織なしNo organizationにした).
image
  • 上の検索から「Google Drive API」と「Google Sheets API」を有効化する.
image image
  • APIとサービス>認証情報をクリック
image
  • 認証情報を作成>サービスアカウントをクリック
  • サービスアカウント名とかもろもろ(というかサービスアカウント名だけ入力して省略可のところは全部省略した)を入力して完了をクリック
  • サービスアカウント一覧のところに表示される(少し時間かかるかも)ので編集をクリック
image
  • 鍵を追加>新しい鍵を作成でキーのタイプはJSON
  • jsonファイルがダウンロードされるので,どっかに保存(~/.config/gspread/service_account.jsonがいいかな.Windowsなら%APPDATA%\gspread\service_account.jsonらしい)
  • ダウンロードしたjsonファイルを開いてtypeとかproject_idとか色々あるけど,client_emailを動作させたいスプレッドシートを開いてそのアドレスで共有する.そうしないと見れないので.
image

これで用意は出来たはず.

動かす

import gspread

gc = gspread.service_account(filename=service_account.json)
sh = gc.open_by_key("シートのID")
print(sh.sheet1.get('A1'))

gs.pread.service_account()はちゃんと~/.config/gspread/service_account.jsonに配置してるならfilenameは要らない.
私は,このtest.pyと同じ場所に配置したのでこんな書き方にしてる.
シートIDはスプレッドシートを開くときのURLがhttps://docs.google.com/spreadsheets/d/シートID/edit#gid=0とかだと思うので,そっから.

> python test.py
[['helloworld']]
>

出来た.

余談

これ以降のスプレッドシートの動作なんかに関してはいろんな記事が載せてあると思うので略.
v4になって,認証周りのコードは減ったなって. 前までは,

import gspread
from oauth2client.service_account import ServiceAccountCredentials

scope = ['https://spreadsheets.google.com/feeds','https://www.googleapis.com/auth/drive']
credentials = ServiceAccountCredentials.from_json_keyfile_name(json_key_path, scope)
gc = gspread.authorize(credentials)

これが

import gspread

gc = gspread.service_account(filename=json_key_path)

になるので.
まぁ,service_account()が強いってだけなんだけども.
ちなみにservice_account()を使わないとこうなる.

import gspread
from google.oauth2.service_account import Credentials

scope = ['https://www.googleapis.com/auth/spreadsheets','https://www.googleapis.com/auth/drive']
credentials = Credentials.from_service_account_file(json_key_path, scopes=scope)
gc = gspread.authorize(credentials)