環境
Python 3.10.2
でgspread 5.3.2
を利用しています。
問題
シートの行数を取得する際に、row_count
の値が更新されません。
以下のコードを実行したときに、スプレッドシート上では正しく書き込み出来ているのですが、row1
とrow2
の値が同じになってしまいます。
Python
1# 該当部分の抜粋 2ws = wb.worksheet("Main") 3 4row1 = ws.row_count 5ws.append_row(save_list) 6row2 = ws.row_count
試したこと
以下のようにシートを読み込みなおすと、row1
とrow2
の値がきちんと1つ増えるようになりましたが、スプレッドシートへのアクセス数が増えてしまうので可能であれば避けたいです。
Python
1# 該当部分の抜粋 2ws = wb.worksheet("Main") 3row1 = ws.row_count 4ws.append_row(save_list) 5 6ws = wb.worksheet("Main") 7row2 = ws.row_count
少し調べたのですが、この挙動が仕様なのか、私の検討違いなのかが分かりませんでした。問題点・解決策をご教授いただければ幸いです。よろしくお願いします。
念のため、以下にコード全文(汚くてすみません)を記載しておきます。
Python
1import os 2from os.path import dirname, join 3 4import client 5import gspread 6from dotenv import load_dotenv 7from flask import Flask, render_template, request 8from flask_sitemap import Sitemap 9from google.oauth2.service_account import Credentials 10from werkzeug.utils import secure_filename 11 12# ローカル環境で環境編集を取得 13dotenv_path = join(dirname(__file__), '.env') 14load_dotenv(dotenv_path) 15 16# Googleスプレッドシートからデータベースを取得 17scope = ['https://www.googleapis.com/auth/spreadsheets','https://www.googleapis.com/auth/drive'] 18 19credential = { 20 "type": "service_account", 21 "project_id": os.environ['SHEET_PROJECT_ID'], 22 "private_key_id": os.environ['SHEET_PRIVATE_KEY_ID'], 23 "private_key": os.environ['SHEET_PRIVATE_KEY'].replace('\\n', '\n'), 24 "client_email": os.environ['SHEET_CLIENT_EMAIL'], 25 "client_id": os.environ['SHEET_CLIENT_ID'], 26 "auth_uri": "https://accounts.google.com/o/oauth2/auth", 27 "token_uri": "https://oauth2.googleapis.com/token", 28 "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", 29 "client_x509_cert_url": os.environ['SHEET_CLIENT_X509_CERT_URL'] 30 } 31credentials = Credentials.from_service_account_info(credential,scopes=scope) 32# ログイン 33gc = gspread.authorize(credentials) 34# シートを開く 35wb = gc.open_by_key(os.environ['SHEET_DATABASE_KEY']) 36ws = wb.worksheet("Main") 37 38file_send = client.file_send(os.environ['DB_URL'],os.environ['DB_TOKEN']) 39 40app = Flask(__name__) 41ext = Sitemap(app=app) 42 43ALLOWED_EXTENSIONS = {'png','jfif','pjpeg','jpeg','pjp','jpg'} 44def allowed_file(filename): 45 return '.' in filename and \ 46 filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS 47 48@app.get('/') 49def index(): 50 return render_template('index.html') 51@ext.register_generator 52def index(): 53 yield 'index', {} 54 55@app.get('/about/') 56def about(): 57 return render_template('about.html') 58@ext.register_generator 59def about(): 60 yield 'about', {} 61 62@app.get('/contact/') 63def contact(): 64 return render_template('contact.html') 65@ext.register_generator 66def contact(): 67 yield 'contact', {} 68 69@app.get('/record/') 70def record(): 71 return render_template('record.html') 72@ext.register_generator 73def record(): 74 yield 'record', {} 75 76@app.post('/record/thanks/') 77def record_thanks(): 78 # fileがない場合 79 if 'image' not in request.files: 80 return render_template( 81 'record_thanks.html', 82 status='登録できませんでした。ファイルを送信してください。' 83 ) 84 file = request.files['image'] 85 86 # filenameが空の場合 87 if file.filename == '': 88 return render_template( 89 'record_thanks.html', 90 status='登録できませんでした。ファイルの名前を指定してください。' 91 ) 92 93 if file and allowed_file(file.filename): 94 fileext = os.path.splitext(secure_filename(file.filename))[1] 95 else: 96 return render_template( 97 'record_thanks.html', 98 status='登録できませんでした。PNG,JPEGのみ送信できます。' 99 ) 100 101 id = str(ws.row_count + 1).zfill(5) 102 filename = id + fileext 103 answer = request.form 104 save_data = [ 105 id, 106 answer["email"], 107 answer["name"], 108 answer["title"], 109 filename, 110 answer["date"], 111 answer["note"], 112 answer["no_seven"], 113 answer["no_family"] 114 ] 115 116 ws.append_row(save_data) 117 file_send.write(filename,file) 118 return render_template( 119 'record_thanks.html', 120 status='ご登録ありがとうございます。' 121 ) 122 123@app.get('/privacy-policy/') 124def privacy(): 125 return render_template('privacy-policy.html') 126@ext.register_generator 127def privacy(): 128 yield 'privacy', {} 129 130if __name__ == "__main__": 131 app.run(port=8000,debug=True)
追記(2022年6月12日)
自分は @TakaiY 様のアドバイスを参考に、ゴリ押しで解決しましたが、それらしきものを見つけたので、後からこの質問を見た方のために残しておきます。
spreadsheet.pyのSpreadsheet
クラスの__init__
関数内のself._properties.update(metadata["properties"])
を叩ければ更新できそうですね。
あとはご自身でお調べいただければと思います。ヒントにでもなれば幸いです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/06/02 05:40 編集
2022/06/02 05:38
2022/06/02 05:57 編集
2022/06/02 06:11 編集
2022/06/02 06:25
2022/06/02 07:11