さて前回はgoogle sheets APIを利用するために以下の作業をしてきました。
①APIの有効化
②credential情報の取得
③google認証認可のPass
まで、実施してきました。ここまで終わっていないと、今回の読み取り(データ取得)は対応できますが、次回以降の書き込み(データupload)はできませんので、是非前回記事は完了しておいてください。
本当はデータの書き込みが最終ゴールですが、まずは簡単なデータの読み取り(データ取得)から初めていきます。
sheets APIを利用してスプレッドシートのデータを取得する
さて、早速今回の本題、スプレッドシートのデータを取得する方法です。
取得するのは以下のようなスプレッドシートだとします。

シートIDは各人のシートをご確認ください。シート1つだけ準備して、簡単な2×2の範囲データを取得してみます。
シート名:test
データ範囲: A1:B2
今回のゴール
取得してターミナルで以下のように表示するのが今回のゴールです。

実際のコード
さて、実際のコードは以下のようになります。正直quickstartのコードとほぼ同様ですので、英語でも気にならない方は、API documentをご確認ください。
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
SCOPES = ['https://www.googleapis.com/auth/spreadsheets.readonly']
SAMPLE_SPREADSHEET_ID = 'スプレッドシートのIDを入力'
SAMPLE_RANGE_NAME = 'test!A1:B2'
json_path = "client_secret.jsonファイルのPathを入力"
def main():
creds = None
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(
json_path, 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('columnA, columnB:')
for row in values:
print('%s, %s' % (row[0], row[1]))
if __name__ == '__main__':
main()
さて、実際のコードは上記のようになります。半分以上は前回の認証をpassするために利用したものと同じですが、少し解説を入れていければと思います。
SCOPEの設定
SCOPES = ['https://www.googleapis.com/auth/spreadsheets.readonly']
SCOPESでは利用するAPIの種類を選択していきます。今回はreadonly(読み取り専用)のAPIを1つだけ利用していますが、前回見たAPI有効化のページで、複数種類のAPIを有効化させたのち、こちらのSCOPES配列に含めることで利用可能となります。

認証関係の説明
前回も見た認証関係のコードですが、今回簡単に説明を入れていこうかと思います。
def main():
creds = None
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(
json_path, 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)
まず、最初に以下の部分です。
if os.path.exists('token.pickle'):
with open('token.pickle', 'rb') as token:
creds = pickle.load(token)
一度でも当該コードがうまく回るとtoken.pickleというファイルが同一ディレクトリに生成されます。そのtoken.pickleファイル内にcredential(googleが自分たちにくれた識別子や秘密情報とでも理解してください)情報が含まれていますので、それを読み込んでいっています。
さて、次に以下の部分です。
if not creds or not creds.valid:
if creds and creds.expired and creds.refresh_token:
creds.refresh(Request())
credentialの情報は実は有効期限があり(いわゆるaccess tokenのexpire period)一定期間を経るとaccess token(credential情報)は失効してしまいます。その時に再度access tokenを発行するために利用するのがrefresh_tokenです。ここら辺の情報は以前freeeのAPIを利用した際にも軽く触れていますので、そちらもご確認ください。
そして何もない場合には、以下のコードが実行されています。
else:
flow = InstalledAppFlow.from_client_secrets_file(
json_path, SCOPES)
creds = flow.run_local_server(port=0)
InstalledAppFlowというgoogleが提供しているlibraryを利用してローカルサーバからcreds情報を取得しにいっています。詳細を確認したい方は、このリンクをご確認ください。
そして、取得した情報をpickleとして保存していくのが以下の部分です。
with open('token.pickle', 'wb') as token:
pickle.dump(creds, token)
with openはみなさんよくご存知のファイルを開くコードです。そして、開き方はwb(write/binary)です。日頃バイナリとかはあまり使わないかもですが、text以外にバイナリファイルでも保存可能です。
また、pickle.dumpで先ほど取得した変数credsをtokenというファイルネームでpickle処理しています。pickleというのはよくわかりにくいかと思いますが、ざっというと以下のイメージです。
ピクルス!酢漬。
まぁオブジェクトを一つの瓶に入れて保存するという感じです。よくわからないかと思いますが、深層学習とかではよく利用されているようです(quiita記事)
最後にserviceを立ち上げます。
service = build('sheets', 'v4', credentials=creds)
sheets APIのv4にcredentialsとしてcredsに先ほど取得したデータを入れ込んで、接続する(今回はbuild)と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('columnA, columnB:')
for row in values:
print('%s, %s' % (row[0], row[1]))
先ほど立ち上げた、serviceで、spreadsheetsメソッドを呼び出します。呼び出したスプレッドシートにIDやデータ範囲を付与して実行します。
そして、対象のレンジからgetメソッドで数値を配列として取得しています。
最後の表示はまぁいいですよね。
まとめ
GASでよく利用するスプレッドシートデータの取得ですが、sheets APIでは少し動作のさせ方が異なります。GAS慣れしていると、感覚的に気持ち悪い部分もあるかもしれませんが、pythonで利用する場合はこちらなので是非慣れてください。
ドキュメントのリンクも参考に貼っておきます。 →リンク
さて、次回以降ついにローカルのpythonからデータをスプレッドシートに書き込んでいきます。大きく変化する部分はないので、書き込む方法をメソッド化して対応していきましょう。
関連記事: pythonとsheets API v4を使ってスプレッドシートにアクセスする
pythonでスクレイピング等をした後に取得したデータをスプレッドシートで管理してみましょう。ローカルのpythonコードからgoogle sheets APIを利用してスプレッドシートにアクセスする方法を紹介しています。