【Python】Googleスプレッドシートの読み書き
今日もPythonネタ。Pythonを使ったGoogleスプレッドシートの更新方法について。
実際にAWS Lambdaからスプレッドシートを更新するときにこの方法を使ってます。
環境情報
・Python3.7
・AWS Lambda
事前準備
1.Google Cloud Platformでプロジェクトを作成
2.作成したプロジェクトでGoogle Drive APIとGoogle Sheet APIを有効にする
3.サービスアカウント作成
4.サービスアカウントキーを作成&JSONファイルダウンロード
5.操作するスプレッドシートの共有設定に上記3で作成したサービスアカウントを追加
詳細は以下を参照。
APIの上限設定
作成したプロジェクトの「IAM と管理者」の割り当てページで確認できるようです。
・ユーザごとで100秒あたりの読み込みリクエスト:100件まで
・ユーザごとで100秒あたりの書き込みリクエスト:100件まで
など
レンジ情報を取得する場合は、ループを回して1セルずつ取得するのではなく、範囲を指定してrangeで取得した方が良いです。
サンプルプログラム
import gspread
from oauth2client.service_account import ServiceAccountCredentials
# スプレッドシートキーを指定。スプレッドシートのURLの https://docs.google.com/spreadsheets/d/[スプレッドシートキー]/edit#gid=yyyyy
SPREADSHEET_KEY = "XXXXXXXXXXXXXXXXXX"
# 事前準備の手順4でダウンロードしたJSONファイルを指定
json_keyfile = "/opt/python/gspread/gspread_auth.json"
scope = ['https://spreadsheets.google.com/feeds','https://www.googleapis.com/auth/drive']
credentials = ServiceAccountCredentials.from_json_keyfile_name(json_keyfile, scope)
gc = gspread.authorize(credentials)
workbook = gc.open_by_key(SPREADSHEET_KEY)
sheet_name = "シート名"
range_str = "A1:B1"
worksheet = workbook.worksheet(sheet_name)
# 読み込みリクエストが発生
cells = worksheet.range(range_str)
# A1セル更新
cells[0].value = 1
# B1セル更新
cells[1].value = 2
# スプレッドシートへ反映(書き込みリクエストが発生)
worksheet.update_cells(cells)
(おまけ)gspreadをLayer用にzipにまとめる
Linux環境で以下のコマンドを実行してzipを作成。
サービスアカウントの秘密鍵(JSONファイル)もgrspread/pythonディレクトリに格納する。
# mkdir -p gspread/python
# cd gspread/python
# pip install gspread -t .
# pip install oauth2client -t .
※秘密鍵(JSONファイル)もこのディレクトリに格納する
# cd ..
# zip -r gspread.zip ./python
作成したzipファイルをAWS LambdaのLayerにアップロード。