chakokuのブログ(rev4)

テック・コミック・ごくまれにチャリ

手を抜かずにOAuthも使ってGoogle のSheets APIを叩いてみる(gspreadを利用)

GCPの環境から手抜きでSheets APIを叩こうとして、ADCが正しく機能しないせいか、権限不足でエラーになっていた。原因の切り分けが困難なので、、まずはGCPの外側の一般アプリとしてOAuthの認証もきっちり行ってセルにアクセスしてみることにする
Python Quickstart  |  Sheets API  |  Google Developers

以下の記事の手順に従って行う
PythonでGoogle Sheetsを編集する方法

事例説明の中で、「SpreadSheetに対して鍵を作った際のメールアドレスを追加すること」という説明があった。メールアドレスに基づいてアクセス管理するから、鍵のメールアドレスをSheet側に追加する必要があると理解した。GCPからのアクセスでもこの操作が抜けていたと思える。GCP用のデフォルトID(システムが作った仮のメールアドレス)をSheetに許可追加したら、Cloud Functionからのアクセスが正常に行えるようになった。

作業メモ
1. サービスアカウントから鍵を追加してJSON形式でDL
2. Sheetの権限に対して、DLした中のメールアドレスをアクセス許可に設定
3. サンプルソースを実行

import gspread
from oauth2client.service_account import ServiceAccountCredentials
scope =['https://spreadsheets.google.com/feeds', 'https://www.googleapis.com/auth/drive']
creds = ServiceAccountCredentials.from_json_keyfile_name('client_secret.json', scope)
client = gspread.authorize(creds)
sheet = client.open("SENSORLOG").sheet1
list_of_hashes = sheet.get_all_records()
print(list_of_hashes)

DLして使ったJSONファイル(一部マスクしていますが。。)

{
  "type": "service_account",
  "project_id": "home-iot-0000005",
  "private_key_id": "ded2xxxxxxxxxxxxxxxx237f",
  "private_key": "-----BEGIN PRIVATE KEY-----\n
      MIIEvQIxxxxxxxxxxxxxM2psqewwk3q2OzU=\n
      -----END PRIVATE KEY-----\n",
  "client_email": "home-iot-0000005@appspot.gserviceaccount.com",
  "client_id": "107xxxxxxxxxxxxx686",
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "token_uri": "https://oauth2.googleapis.com/token",
  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
  "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/home-iot-00000005%40appspot.gserviceaccount.com"
}