質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

698閲覧

gspreadでrow_countの値が更新されない

glyzinieh

総合スコア208

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2022/06/01 14:38

編集2022/06/11 18:56

環境

Python 3.10.2gspread 5.3.2を利用しています。

問題

シートの行数を取得する際に、row_countの値が更新されません。
以下のコードを実行したときに、スプレッドシート上では正しく書き込み出来ているのですが、row1row2の値が同じになってしまいます。

Python

1# 該当部分の抜粋 2ws = wb.worksheet("Main") 3 4row1 = ws.row_count 5ws.append_row(save_list) 6row2 = ws.row_count

試したこと

以下のようにシートを読み込みなおすと、row1row2の値がきちんと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.pySpreadsheetクラスの__init__関数内のself._properties.update(metadata["properties"])を叩ければ更新できそうですね。
あとはご自身でお調べいただければと思います。ヒントにでもなれば幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

この動作、2018年にissue(問題のある動作報告)として本家サイトに上ってますが、未解決のようですね。

ということで、これは、現状そういう動作だということです。

ちらっと読んでみると、

シートを読み込みなおすと、row1とrow2の値がきちんと1つ増えるようになりましたが、スプレッドシートへのアクセス数が増えてしまう

とあるように、解決するにはいずれにしてもアクセス数が増えてしまうということにねっているみたいです。
これは、google spreadsheetが複数人で同時に編集できるところを同するかというところにもつながっているようで、一筋縄ではいかないみたいですね。

投稿2022/06/02 01:38

TakaiY

総合スコア12765

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

glyzinieh

2022/06/02 05:40 編集

回答ありがとうございます。リンク先大変参考になりました。 自分の理解が正しいか分からないのですが、row_countはプロパティを読み出しているだけで、スプレッドシートへのアクセスは発生していないということでしょうか?
TakaiY

2022/06/02 05:38

wsはメモリに読み込まれているはずなので、行の追加はそこになされているでしょう。しかし、row_countの値は更新されないということですね。 updateすることでスプレッドシートへの反映が行なわれて、row_count等の更新もされるのでしょうね。
glyzinieh

2022/06/02 05:57 編集

公式ドキュメント( https://docs.gspread.org/en/latest/index.html )を読んだのですが、updateの方法が分かりません。 update()のrange_nameだけ指定して、valuesを指定しないということでしょうか?
TakaiY

2022/06/02 06:11 編集

updateと書いたのは、参照したissueに書いてあったからなのですがupdadeメソッドなどでそれができるかどうかは、詳しいわけではないのでわかりません。 質問にあるように、wsを読込み直すことで更新できるのであれば、それでいいのではないかと思います。スプレッドシードにアクセスせずにやるほうほうは無いんじゃないかと思います。
glyzinieh

2022/06/02 06:25

ありがとうございます。 issueにbatch_update()を使うのように書かれていたと思うのですが、ドキュメントを読んでも、そのようなことが書かれていなかったんですよね…
TakaiY

2022/06/02 07:11

Issueへのコメントとかって、読んでもよくわからないこと多いですよね。的外れなものもあったりするし、文章のうまい人が書いているとも限らないというのもあるでしょうし。(人のこと言えませんが)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問