大田区から発信するゆるゆる日記

主にITエンジニアに関する備忘録日記。たまに趣味も。何か不備があればコメント頂けると幸いです。Twitterアカウント https://twitter.com/ryuzan03

【Python】Googleスプレッドシートのワークシートを指定する

※下記の内容に不備がありましたら、コメント頂けると幸いです。また、下記の内容をご使用頂ける場合は自己責任でお願いします。

概要

APIからデータを取得して、スプレッドシートに出力するために必要だった処理です。
再現性がありそうだったのでメモ程度に投稿します。

Python 3.7
conda 4.9.2
※Anacondaの仮想環境使用


作業の流れ

  1. 事前準備
  2. スプレッドシートへのアクセス権を取得
  3. スプレッドシートのワークシートを指定

事前準備

事前準備として、Google Cloud Platformで初期設定を行いましょう。

  1. 新規プロジェクト作成
  2. Google Drive APIを有効化
  3. Google Sheets APIを有効化
  4. サービスアカウントを作成
  5. 4の秘密鍵を生成
  6. スプレッドシートにサービスアカウントを登録

1. 新規プロジェクト作成

Google Cloud Platformのコンソール画面から新規プロジェクトを作成しましょう。
Googleアカウントを持っていない場合は事前に作成しておきましょう
※既存のプロジェクトを使う場合は新規プロジェクトの作成は不要です
Google Cloud Platform

「プロジェクトの選択」から「新しいプロジェクト」をクリック。 f:id:ryuzan03:20210425100233p:plain

「プロジェクト名」を記入し、「作成」をクリック。 f:id:ryuzan03:20210425100113p:plain
少し待つとプロジェクトが作成されます。

2. Google Drive APIを有効化

f:id:ryuzan03:20210425101725p:plain

3. Google Sheets APIを有効化

f:id:ryuzan03:20210425101812p:plain

4. サービスアカウントを作成

Google Cloud Platformのコンソール画面からサービスアカウントを作成します。 f:id:ryuzan03:20210425102210p:plain

f:id:ryuzan03:20210425102237p:plain

サービスアカウントに先ほど作成したプロジェクトへのアクセス権を付与します。
今回はオーナーの権限を付与しました。 f:id:ryuzan03:20210425102258p:plain

すぐにサービスアカウントが発行されます。 f:id:ryuzan03:20210425102554p:plain

5. 4の秘密鍵を生成

先ほど作成したサービスアカウントをクリックします。
「キー」のタブを選択し、「鍵を追加」から「新しい鍵を作成」をクリックします。 f:id:ryuzan03:20210425102934p:plain

キーのタイプで「JSON」を選択し、「作成」をクリックします。
すると、JSONファイルで秘密鍵がダウンロードされます。
こちらの秘密鍵のファイル名を任意のファイル名に変更し、任意の場所に移動させましょう。
後ほどこの秘密鍵を使用します。 f:id:ryuzan03:20210425103216p:plain

6. スプレッドシートにサービスアカウントを登録

スプレッドシートに先ほど作成したサービスアカウントのメールを登録します。
スプレッドシート右上の「共有」からメールを登録することができます。 f:id:ryuzan03:20210425110926p:plain

スプレッドシートへのアクセス権を取得

以下のライブラリをインストールします。
今回私はAnacondaを使用しているので、condaコマンドでライブラリをインストールします。

conda install -c conda-forge oauth2client
conda install -c conda-forge gspread

Oauth2Client :: Anaconda.org
Gspread :: Anaconda.org

スプレッドシートへのアクセス権を取得するコードです。

main.py

from oauth2client.service_account import ServiceAccountCredentials

def get_credentials_to_gspread():
    # スプレッドシートへのアクセスURL
    scope = ["https://spreadsheets.google.com/feeds"]

    # 事前準備で作成したサービスアカウントの秘密鍵のファイルパス
    service_account_secret_key_file_path = "ダウンロードしたサービスアカウントの秘密鍵のファイルパスを入力"

    # スプレッドシートへのアクセス権を返す
    return ServiceAccountCredentials.from_json_keyfile_name(service_account_secret_key_file_path, scope)


# スプレッドシートへのアクセス権を取得
service_account_credentials = get_credentials_to_gspread()



スプレッドシートのワークシートを指定

まずはスプレッドシートのキーを取得します。
キーはスプレッドシートのURLの「d」と「edit」の間にある文字列です。

https://docs.google.com/spreadsheets/d/xxxxxxxxxxxxxxxx/edit
※「xxxxxxxxxxxxxxxx」がスプレッドシートのキーになります。


スプレッドシートのワークシートを指定するコードです。

main.py

## 追加
import gspread 
from oauth2client.service_account import ServiceAccountCredentials


## 追加
# 指定したいシート名
target_sheet = "test"


## 追加
# スプレッドシートのキー
target_gspread_key = "スプレッドシートのキーを入力"


def get_credentials_to_gspread():
    # スプレッドシートへのアクセスURL
    scope = ["https://spreadsheets.google.com/feeds"]

    # 事前準備で作成したサービスアカウントの秘密鍵のファイルパス
    service_account_secret_key_file_path = "サービスアカウントの秘密鍵のファイルパスを入力"

    # スプレッドシートへのアクセス権を返す
    return ServiceAccountCredentials.from_json_keyfile_name(service_account_secret_key_file_path, scope)


## 追加
def select_gspread_sheet(service_account_credentials, gspread_key, sheet):
    # スプレッドシート認証
    auth_gspread = gspread.authorize(service_account_credentials)

    # 対象のスプレッドシートを開く
    target_gspread = auth_gspread.open_by_key(gspread_key)

    # 対象のワークシートを指定
    return target_gspread.worksheet(sheet)


# スプレッドシートへのアクセス権を取得
service_account_credentials = get_credentials_to_gspread()


## 追加
# スプレッドシートのワークシートを選択
worksheet = select_gspread_sheet(service_account_credentials, target_gspread_key, target_sheet)


参考

素晴らしい記事に感謝致します。
Google Spread Sheets に Pythonを用いてアクセスしてみた - Qiita
gspread — gspread 3.7.0 documentation
API Reference — gspread 3.7.0 documentation