90014


まず、目的はPythonを使って、Cloud Functionsで関数を定期的に動かしてGoogle Spread Sheetに書き込むことです。

Cloud Functionsに書いた関数は下に置きます。  
以下のサイトを参考に、ローカル環境から目的のGoogle Spread Sheetに書き込みをしていくことには成功しました。

[PythonでGoogleスプレッドシートに書き込みする方法](https://www.teijitaisya.com/python-gsheets/)

また、Cloud Functionsにおいてデプロイには成功、しかし関数のテストをするとエラーが出ました。

[code]

    Error: function terminated. Recommended action: inspect logs for termination reason. Additional troubleshooting documentation can be found at https://cloud.google.com/functions/docs/troubleshooting#logging Details:
    500 Internal Server Error: The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
    
[/code]

ログの「エラー」を見ると、スプレッドシートのjson秘密鍵がない、と言われているようです。

[code]

    line 79, in from_filename with io.open(filename, "r", encoding="utf-8") as json_file: FileNotFoundError: [Errno 2] No such file or directory: 'json秘密鍵ファイルのパス.json'
    
[/code]

ローカルでは処理に成功してCloud Functionsではエラーになるのは、Cloud
Functionsからはローカルのファイルにアクセスできないからだと思うのですが、この場合Cloud
Functionsで動かしている関数がjson秘密鍵ファイルを使えるようにする（もしくは他の方法でCloud
Functionsで動かしている関数がスプレッドシートに書き込めるようになる）にはどうしたらよいのでしょうか？

初心者なので見当違いな質問かもしれないのですが、教えていただけると大変助かります。よろしくお願いします。

* * *

main.py

[code]

    import datetime
    import gspread
    from google.oauth2.service_account import Credentials
    from apiclient.discovery import build
    
    def main():
    
        #スプレッドシートIDを変数に格納する。
        SPREADSHEET_KEY = 'シートID' #シートID
        #ダウンロードしたjsonファイル名をクレデンシャル変数に設定。
        WHEREFILE = "json秘密鍵ファイルのローカルでのパス"
        #json秘密鍵ファイルのパス
        
        data = dataを持ってくる関数
        WriteVC(SPREADSHEET_KEY,WHEREFILE,data)
        return 0
    
    def dataを持ってくる関数
    
    def WriteVC(SPREADSHEET_KEY,WHEREFILE,data):
        # お決まりの文句
        # 2つのAPIを記述しないとリフレッシュトークンを3600秒毎に発行し続けなければならない
        scope = ['https://www.googleapis.com/auth/spreadsheets','https://www.googleapis.com/auth/drive']
    
        #ダウンロードしたjsonファイル名をクレデンシャル変数に設定。
        credentials = Credentials.from_service_account_file(WHEREFILE,scopes=scope)
        
        #OAuth2の資格情報を使用してGoogle APIにログイン。
        gc = gspread.authorize(credentials)
    
        # スプレッドシート（ブック）を開く
        workbook = gc.open_by_key(SPREADSHEET_KEY)
    
        # シートの一覧を取得する。（リスト形式）
        worksheet = workbook.worksheets()
    
            # シートを開く
        worksheet = workbook.worksheet('シート1')
    
        nextcell = worksheet.find('next')
        nextrow = nextcell.row             # 次の値を入れる行番号
    
        tnow = datetime.datetime.now()
    
            # next行にタイムスタンプとデータを書き込み。
    
        strtnow = tnow.strftime('%Y-%m-%d %H:%M:%S')
        worksheet.update_cell(nextrow, 1, strtnow)
        worksheet.update_cell(nextrow, 2, data)
        worksheet.update_cell(nextrow+1, 1, 'next')
        
        print(tnow)
    
[/code]

requirements.txt

[code]

    # Function dependencies, for example:
    # package>=version
    gspread>=5.4.0
    google-api-python-client>=2.52.0
    google-auth-httplib2>=0.1.0
    google-auth-oauthlib>= 0.5.2
    
[/code]


CC BY-SA 4.0
2022-07-14T05:55:07.813
89968
2022-07-16T05:32:54.273
2022-07-14T08:09:49.513
53524
53524
question
python google-cloud google-spreadsheet google-api
Google Cloud FunctionsからGoogle Spread Sheetに書き込みをしたい。


自己解決しました。  
google cloud
functionsのコード部分に、main.pyの下にcredential.jsonを作ってjson秘密鍵を書き込めばテストに成功しました。


CC BY-SA 4.0
2022-07-16T05:32:54.273
90014
2022-07-16T05:32:54.273
53524
89968
answer