pythonとsheets API v4を使ってスプレッドシートにアクセスする〜③sheets APIを利用してスプレッドシートのデータを取得する〜

API関連
この記事は約10分で読めます。

さて前回はgoogle sheets APIを利用するために以下の作業をしてきました。

①APIの有効化
②credential情報の取得
③google認証認可のPass

まで、実施してきました。ここまで終わっていないと、今回の読み取り(データ取得)は対応できますが、次回以降の書き込み(データupload)はできませんので、是非前回記事は完了しておいてください。

本当はデータの書き込みが最終ゴールですが、まずは簡単なデータの読み取り(データ取得)から初めていきます。

Advertisements

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配列に含めることで利用可能となります。

scopeの選択画面

認証関係の説明

前回も見た認証関係のコードですが、今回簡単に説明を入れていこうかと思います。

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を利用してスプレッドシートにアクセスする方法を紹介しています。

  1. pythonとsheets API v4を使ってスプレッドシートにアクセスする〜①概要編〜
  2. pythonとsheets API v4を使ってスプレッドシートにアクセスする〜②事前準備 sheets APIのactivateとcredential.jsonの取得方法編〜
  3. pythonとsheets API v4を使ってスプレッドシートにアクセスする〜③sheets APIを利用してスプレッドシートのデータを取得する〜
  4. pythonとsheets API v4を使ってスプレッドシートにアクセスする〜④sheets APIを利用してスプレッドシートへデータを書き込む〜

コメント