66009


閲覧いただきありがとうございます。

## エラーが生じた経緯

google
colaboratory上で作成し動作確認をしたコードをローカル環境の仮想マシン上で実行したところ、タイトルのとおりエラーが生じてしまいました。

## やりたいこと

PythonスクリプトからGoogle Sheets APIを利用しスプレッドシートにアクセスする

SheetsAPIを利用する上で同時に必要となるGoogle DriveのAPIも利用しています。  
SheetsAPIの認証にはサービスアカウントキーを利用し、秘密鍵のjsonファイルを.pyファイルと同じディレクトリに配置しております。  
スプレッドシート側において共有設定も済ませています。

## ローカルの実行環境

Windowsマシン上にVagrantで構築したCentOS  
Python 3.5.2

## 問題のコード writeToSheets.py

[code]

    import gspread
    from oauth2client.service_account import ServiceAccountCredentials
    import json
    import pandas as pd
    
    SP_CREDENTIAL_FILE = 'pittustatsroyale-a37bcb54c774.json'
    SP_SCOPE = [
        'https://www.googleapis.com/auth/drive',
        'https://spreadsheets.google.com/feeds'
    ]
    SP_SHEET_KEY = '1_zyQWw_Kwn1nhLfsjHlm2baxH9CUweqPo6kZ38dcwo4'
    SP_SHEET = 'pittu'
    
    credentials = ServiceAccountCredentials.from_json_keyfile_name(SP_CREDENTIAL_FILE,SP_SCOPE)
    gc = gspread.authorize(credentials)
    workbook = gc.open_by_key(SP_SHEET_KEY)
    worksheet = workbook.worksheet(SP_SHEET)
    data = worksheet.get_all_values()
    
[/code]

## 実行時のエラーメッセージ

[code]

    [vagrant@localhost pittuStatsRoyale]$ python writeToSheets.py
    Traceback (most recent call last):
      File "writeToSheets.py", line 17, in <module>
        worksheet = workbook.worksheet(SP_SHEET)
      File "/home/vagrant/.pyenv/versions/3.5.2/lib/python3.5/site-packages/gspread/models.py", line 314, in worksheet
        sheet_data = self.fetch_sheet_metadata()
      File "/home/vagrant/.pyenv/versions/3.5.2/lib/python3.5/site-packages/gspread/models.py", line 263, in fetch_sheet_metadata
        r = self.client.request('get', url, params=params)
      File "/home/vagrant/.pyenv/versions/3.5.2/lib/python3.5/site-packages/gspread/client.py", line 67, in request
        headers=headers
      File "/home/vagrant/.pyenv/versions/3.5.2/lib/python3.5/site-packages/requests/sessions.py", line 543, in get
        return self.request('GET', url, **kwargs)
      File "/home/vagrant/.pyenv/versions/3.5.2/lib/python3.5/site-packages/google/auth/transport/requests.py", line 442, in request
        self.credentials.before_request(auth_request, method, url, request_headers)
      File "/home/vagrant/.pyenv/versions/3.5.2/lib/python3.5/site-packages/google/auth/credentials.py", line 124, in before_request
        self.refresh(request)
      File "/home/vagrant/.pyenv/versions/3.5.2/lib/python3.5/site-packages/google/oauth2/service_account.py", line 334, in refresh
        access_token, expiry, _ = _client.jwt_grant(request, self._token_uri, assertion)
      File "/home/vagrant/.pyenv/versions/3.5.2/lib/python3.5/site-packages/google/oauth2/_client.py", line 153, in jwt_grant
        response_data = _token_endpoint_request(request, token_uri, body)
      File "/home/vagrant/.pyenv/versions/3.5.2/lib/python3.5/site-packages/google/oauth2/_client.py", line 124, in _token_endpoint_request
        _handle_error_response(response_body)
      File "/home/vagrant/.pyenv/versions/3.5.2/lib/python3.5/site-packages/google/oauth2/_client.py", line 60, in _handle_error_response
        raise exceptions.RefreshError(error_details, response_body)
    google.auth.exceptions.RefreshError: ('invalid_grant: Invalid JWT: Token must be a short-lived token (60 minutes) and in a reasonable timeframe. Check your iat and exp values in the JWT claim.', '{"error":"invalid_grant","error_description":"Invalid JWT: Token must be a short-lived token (60 minutes) and in a reasonable timeframe. Check your iat and exp values in the JWT claim."}')
    
[/code]

## 試したこと

ファイルのパスなど、環境の移行に応じてコード内で変更が必要な箇所はできる限り精査しました。  
16行目までは正常に実行できていると確認しましたので、スプレッドシートにはアクセスできていますが、具体的なシートを選択する段階で問題が生じているのではないかと原因を調査しました。

## 分からないこと

・Google Colaboratoryとローカル開発環境の違い。前者で実行できたコードを後者の環境で実行する場合に必要となる変更事項はあるか。

・gspreadライブラリを利用している場合において、worksheet()呼び出しに起因するエラーが生じた場合、どのようなケースが存在するのか。

## コードの作成において参考にしたもの

・Colab上での実行で参考にした動画  
<https://www.youtube.com/watch?v=uBy7F4Wd9cE>

・ローカルでの実行で参考にしたサイト  
<https://tanuhack.com/operate-spreadsheet/#i-6>  
<https://tanuhack.com/library-gspread/#i-2>

## 助力いただけますよう、よろしくお願いいたします

初めてこちらで質問させていただきました。至らぬ点ございましたらご不便をかけします。ご指摘いただけたら幸いです。何卒よろしくお願いいたします。


CC BY-SA 4.0
2020-04-26T03:51:12.453
65973
2020-04-27T01:21:59.257
2020-04-26T06:22:46.710
39816
39816
question
python google-api google-spreadsheet google-colaboratory
gspreadライブラリのworksheet()実行時に生じたエラーが解決できません。


改めて……

SP_SCOPE の順番を入れ替えて

[code]

    SP_SCOPE = [
        'https://spreadsheets.google.com/feeds',
        'https://www.googleapis.com/auth/drive'
    ]
    
[/code]

としたらどうでしょうか？

エラーの出ている部分とは違うのですが、私自身のテストコード、[公式ドキュメント](https://gspread.readthedocs.io/en/latest/oauth2.html#for-
bots-using-service-account)、参考にされたリンクを見ても、そこくらいしか違いが見当りませんでした。


CC BY-SA 4.0
2020-04-26T04:24:19.047
65976
2020-04-26T13:52:56.973
2020-04-26T13:52:56.973
7290
7290
65973
answer


エラーメッセージ末尾に

[code]

    google.auth.exceptions.RefreshError: ('invalid_grant: Invalid JWT: Token must be a 
    short-lived token (60 minutes) and in a reasonable timeframe. Check your iat and exp 
    values in the JWT claim.', '{"error":"invalid_grant","error_description":"Invalid JWT: 
    Token must be a short-lived token (60 minutes)
    
[/code]

とあるように  
仮想マシンCentOS上の時刻設定が現時刻よりも遅れてズレていることが原因でした。  
CentOSのコマンドライン上でnpt関連の設定を行うことで解消しました。


CC BY-SA 4.0
2020-04-27T01:21:59.257
66009
2020-04-27T01:21:59.257
39816
65973
answer