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" }