【python】Googleスプレッドシートを操作する(GCPのAPI利用)

GCP_API

GCP側の登録

①GCPの利用登録

https://console.cloud.google.com/
※無料トライアルのステータスを有効化(クレジットカードの入力が必要)

②新しいプロジェクトを作成

③「2つのAPI」を有効化

Google Drive API
Google Sheets api

左ナビ「APIとサービス」選択 > 「ライブラリ」選択
Google Drive APIと入力して「Google Drive API」を検索します。
⇒「有効にする」ボタンを押して「Google Drive API」を使用可能にします。

Google Sheets apiと入力して「Google Sheets API」を検索します。
「有効にする」ボタンを押して「Google Sheets API」を使用可能にします。

↓↓↓↓↓↓↓↓

左ナビの「有効なAPIとサービス」の一覧に以下が表示されました。
Google Drive API
Google Sheets api

※Google Sheets API の概要
https://developers.google.com/sheets/api/guides/concepts?hl=ja

④認証情報を作成

サービス アカウントの作成
python******@f***********.iam.gserviceaccount.com

鍵を追加(キーのタイプ:json形式)

1)「APIとサービス」 -> 「認証情報」で以下の画面が開く。
「認証情報を作成」 -> 「サービス アカウントを管理」 を選択する。

2)「+サービス アカウントを作成」をクリックして、新規作成する。

3)作成された「サービス アカウント」のメールをクリックする。

4)「キー」のタブを開いて、「鍵を追加」を押す。

5)「JSONをダウンロード」 を押してJSONファイルを取得してください。

 

python gspread のドキュメント

gspread — gspread 5.10.0 documentation

Googleスプレッドシート側の処理

①Googleスプレッドシートの作成

https://docs.google.com/spreadsheets/d/●●●●/edit#gid=****

※「●●●●」がスプレッドシートID

②Googleスプレッドシートを「作成したサービスアカウント」に共有する

※編集者権限を付与する

スプレッドシートの共有設定で、GCPで作成したサービスアカウントのメールアドレスに編集者権限を与えて共有する

Python でコーディング

①ダウンロードした秘密鍵を作業ディレクトリにアップロードする。

・名前を変更:secret.json

②認証設定を行う

!pip install gspread
!pip install google-auth
import gspread

#認証(スコープを定義し、認証キーを呼び込む)
from google.oauth2.service_account import Credentials

scopes = [
'https://www.googleapis.com/auth/spreadsheets',
'https://www.googleapis.com/auth/drive'
]

credentials = Credentials.from_service_account_file(
'secret.json',
scopes=scopes
)

gc = gspread.authorize(credentials)
gc
<gspread.client.Client at 0x28b79f18760>

③スプレッドシートのインスタンスを作成し、値を取得

#スプレッドシートの取得(スプレッドシートのIDを登録)
SP_SHEET_KEY = "****スプレッドシートのID****"
#スプレッドシートのシートの取得
SP_SHEET = "**シート名**"
#スプレッドシートを開く
sh = gc.open_by_key(SP_SHEET_KEY)
#シートを指定
worksheet = sh.worksheet(SP_SHEET)
♯シートの全ての値を取得
data = worksheet.get_all_values()
data(SP_SHEET)
[['', '', '', '', ''],
 ['', '社員ID', '氏名', '年齢', '所属'],
 ['', '22', '佐藤', '42', '総務部'],
 ['', '96', '鈴木', '38', '人事部'],
 ['', '92', '岩橋', '26', '経理部'],
 ['', '22', '小泉', '40', '技術部'],
 ['', '35', '今西', '50', '総務部'],
 ['', '77', '斎藤', '44', '企画開発部'],
 ['', '38', '高橋', '28', '技術部'],
 ['', '69', '中村', '43', '技術部'],
 ['', '78', '吉田', '35', '企画開発部'],
 ['', '53', '前田', '37', '開発部']]

④スプレッドシートの値をデータフレームに入れる

import pandas as pd
df = pd.DataFrame(data[2:],columns=data[1])
df

⑤空の値の列(0列目)を削除する

#縦方向(axis=1)に0列目を削除する ※横方向は、「axis=0」
df=df.drop(df.columns[[0]],axis=1) 
df
#データ型を調べる
df.dtypes 
社員ID    object
氏名      object
年齢      object
所属      object
dtype: object

⑥データ型変換

#データ型を文字列から数値型に変換
df=df.astype({'年齢':int,'社員ID':int}) 
df.dtypes
社員ID     int32
氏名      object
年齢       int32
所属      object
dtype: object

⑦データの平均値を求め、小数点以下の値を丸める

#所属ごとの年齢の平均値を取得
pvt_table=df.pivot_table(index=['所属'],values=['年齢'],aggfunc='mean') 
#数値の小数点以下を丸める
pvt_table['年齢']=pvt_table['年齢'].round(0)
pvt_table

⑧新しくスプレッドシートにシートを追加して、値を書き込む

#新しいシートを追加する(シート名:new、100行100列)
new_worksheet=sh.add_worksheet(title='new',rows=100,cols=100)
#gspreadとDataFrameの連携をスムーズにするライブラリをインストール
!pip install gspread-dataframe
from gspread_dataframe import set_with_dataframe
#データの書き出しの位置を決める(左上のセルの位置)
first_row=2
first_col=2
#1列目がインデックスと認識されるので、これをリセットして、インデックスもデータ値としてスプレッドシートに書き込む)
set_with_dataframe(new_worksheet,pvt_table.reset_index(),row=first_row,col=first_col)

pvt_table.reset_index() すると、

⑨スプレッドシートのセルの書式設定をする

#セルの書式設定をするためのライブラリをインストール
!pip install gspread-formatting
from gspread_formatting import*

header_fmt = cellFormat(
    backgroundColor = color(38/255,166/255,154/255),
    textFormat = textFormat(bold=True,foregroundColor = color(255/255,255/255,255/255)),
    horizontalAlignment = "CENTER"
)

#範囲をインスタンス化
header_range='b2:c2'
index_range='B3:b8'
value_range='c3:c8'

#書式を指定した範囲に適用する
format_cell_range(new_worksheet,header_range,header_fmt)

#枠線を引く
border=Border('SOLID',Color(0,0,0,0))
fmt=cellFormat(borders=Borders(top=border,bottom=border,left=border,right=border))
format_cell_range(new_worksheet,header_range,fmt)
format_cell_range(new_worksheet,index_range,fmt)
format_cell_range(new_worksheet,value_range,fmt)

 

タイトルとURLをコピーしました