YutaKa Notebook | Python徹底図解ブログ!

Python の文法やモジュール、Python関連のAPIについて画像・ソースコード付きで徹底解説!

PythonでGoogle スプレッドシート APIへ楽々アクセス!めんどうな認証はファンクションにまとめよう!!

f:id:YutaKa:20191115194156p:plain
今回はPythonでGoole スプレッドシートを操作するための前処理を関数にする方法をまとめました!

Python でグーグルスプレッドシートを操作する際の手順はおおまかに次のような感じです。

  1. APIへのアクセストークン取得
  2. スプレッドシート操作用のインスタンス作成
  3. スプレッドシート操作!

1~2のインスタンス作成までが少しめんどうなんですよね…(;^ω^)
ということで、1と2を一つの関数にまとめました!

操作のために必要なモジュール、Google APIの認証方法は過去記事にまとめているので、こちらもご参照ください。 

yutaka01.hatenablog.com

Google が紹介する方法を参考にしているので、興味がある方は原文もご覧ください!Python Quickstart | Sheets API | Google Developers

インスタンス取得用関数

一見、複雑に見えますが、中身は非常にシンプルです。コメントで解説しています!

def api_service():
    """Get instance to manipulate google spread sheet 
    """
    # 操作範囲(スコープ)は、スプレッドシートです。よろしくお願いします。
    SCOPES = ['https://www.googleapis.com/auth/spreadsheets']
    
    # アクセストークン持ってますか?if文で確認
    creds = None
    if os.path.exists('token.pickle'):
        with open('token.pickle', 'rb') as token:
            creds = pickle.load(token)

    # 持ってない…or 期限切れです…
    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)

    # それじゃあ、スプレッドシート操作用のインスタンスください!
    return build('sheets', 'v4', credentials=creds).spreadsheets()

まずは有効なアクセストークンをローカルフォルダに所有しているかどうか確認して、
持ってない場合にはGoogleにそれを要求します。この辺りの詳細は過去記事参照です!

yutaka01.hatenablog.com

最後の行でスプレッドシート操作用のインスタンスを返しています。

    # それじゃあ、スプレッドシート操作用のインスタンスください!
    return build('sheets', 'v4', credentials=creds).spreadsheets()

スプレッド操作の実例!

シート操作用インスタンス生成

実際にインスタンスを生成して読み書きをしてみましょう。

# さっきの関数で操作用インスタンス生成!
my_spread = api_spread()

編集シートとレンジの指定 

シートIDと読み込むセルの範囲(レンジ)を指定します。

# シートIDとレンジの指定
sheet_id = 'XXXXXXXXXXX'
range_name = 'Sheet名!A1:B2'

シートIDはURLの /d/ と /edit の間の文字列です!例えば以下のスプレッドシートURLで言えば太字の部分です。 https://docs.google.com/spreadsheets/d/1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms/edit#gid=0

PythonでGoogleスプレッドシートを編集する方法【後編:スクリプト作成】 - ドローン×プログラミング

スプレッドシートの読み込み

あとは次のコードで読み取ります。

# 読み込み結果をもらいましょう
result = my_spread.values().get(spreadsheetId=sheet_id, range=range_name).execute()

resultの中身は辞書型です。これはスプレッドシートを読み書きするうえでの基本形です。

{
  "range": "Sheet名!A1:B2",
  "majorDimension": 'ROWS',
  "values": [['A1の値', 'B1の値'], 
       ['A2の値', 'B2の値',]] }

スプレッドシートへの書き込み

書き込みする値を辞書型で準備します。これは、読み込みの結果で受け取ったresultインスタンスと似たような形ですが、"values"だけ指定しておけばとりあえずはOKです!

body = {
    "values": [['A1に入れる値','B1に入れる値'],
['A2に入れる値','B2に入れる値']] }

では、bodyに準備した値をシートに書き込んでみましょう!

# 実際に書き込んでみます
result = my_spread.values().update(spreadsheetId=sheet_id, range=range_name,
                                           valueInputOption="RAW", body=body).execute()

 結果はこんなかんじです。

f:id:YutaKa:20191115191158p:plain

おつかれさまでした!(⌒∇⌒)

まとめ

今回はGoole スプレッドシートの操作をするために必要な前処理を関数にしてしまう方法についてまとめまいした!今回作成した関数でインスタンスを作ってしまえば、あとは簡単にスプレッドシートを読み書きできます

 読み書きに使う辞書型は、慣れるまでは違和感ありますが、覚えてしまえば単なるリスト in 辞書型なので楽々だと思います!