雑史

思ったこととかメモとか

Google Cloud FunctionsからスプレッドシートAPIをPythonで操作する

はじめに

タイトル通りのことがしたかったんだけど、意外とこの組み合わせのサンプルっぽいものが無かったのです記録に残しておく。
サンプルリポジトリ作りました。

github.com

スプレッドシートAPIを有効にする

まずはじめに、GoogleのデベロッパーコンソールからスプレッドシートAPIを有効にする。

f:id:kzk0829:20200504220706p:plain
プロジェクトの選択

ここから、プロジェクトを選択する。
そしたら、検索ボックスから「Sheets API」を検索して、有効化する。

サービスアカウントのアドレスをスプレッドシートに登録する

まずはGCPコンソールにログイン。

左上のナビゲーションメニューからIAMと管理>サービスアカウントを選択する。

f:id:kzk0829:20200504221426p:plain

そしたら、名前App Engine default service accountメールをコピーする。

f:id:kzk0829:20200504221623p:plain

コピーしたらそのアドレスをスプレッドシートの共有設定に登録する。

f:id:kzk0829:20200504221826p:plain

最後にスプレッドシートの以下部分をコピーしておく。
あとで、SPREADSHEET_KEYとして使う。

https://docs.google.com/spreadsheets/d/{ここの部分!}/edit#gid=0

設定はこれでおしまい。

ソースコード

import gspread
import google.auth

def main(event, context):

    # ここで認証情報を取得する。デフォルトのサービスアカウントが適用される
    credentials, _ = google.auth.default(scopes=['https://spreadsheets.google.com/feeds', 'https://www.googleapis.com/auth/drive'])

    # ここでスプレッドシートの認証
    gc = gspread.authorize(credentials)

    # 先ほどコピーしたスプレッドシートキーを変数に
    SPREADSHEET_KEY = '{your-spreadsheet-key}'

    # sheet1を取得
    worksheet = gc.open_by_key(SPREADSHEET_KEY).sheet1

    import_value = int(worksheet.acell('A1').value)

    export_value = import_value + 100
    worksheet.update_cell(1, 2, export_value)

上記のような感じで操作する。
なかなか認証周りの資料がない中、そのプロジェクトのデフォルトのサービスアカウントの情報をスプレッドシートに登録しておけばjsonファイル等がなくても操作できることがわかった。