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

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

新規登録して質問してみよう
ただいま回答率
87.20%
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による文字列操作をサポートしているため、日本語処理も標準で可能です。

解決済

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

glyzinieh
glyzinieh

総合スコア197

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による文字列操作をサポートしているため、日本語処理も標準で可能です。

1回答

0評価

0クリップ

159閲覧

投稿2022/06/01 14:38

編集2022/06/11 18:56

環境

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

問題

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

Python

# 該当部分の抜粋 ws = wb.worksheet("Main") row1 = ws.row_count ws.append_row(save_list) row2 = ws.row_count

試したこと

以下のようにシートを読み込みなおすと、row1row2の値がきちんと1つ増えるようになりましたが、スプレッドシートへのアクセス数が増えてしまうので可能であれば避けたいです。

Python

# 該当部分の抜粋 ws = wb.worksheet("Main") row1 = ws.row_count ws.append_row(save_list) ws = wb.worksheet("Main") row2 = ws.row_count

少し調べたのですが、この挙動が仕様なのか、私の検討違いなのかが分かりませんでした。問題点・解決策をご教授いただければ幸いです。よろしくお願いします。

念のため、以下にコード全文(汚くてすみません)を記載しておきます。

Python

import os from os.path import dirname, join import client import gspread from dotenv import load_dotenv from flask import Flask, render_template, request from flask_sitemap import Sitemap from google.oauth2.service_account import Credentials from werkzeug.utils import secure_filename # ローカル環境で環境編集を取得 dotenv_path = join(dirname(__file__), '.env') load_dotenv(dotenv_path) # Googleスプレッドシートからデータベースを取得 scope = ['https://www.googleapis.com/auth/spreadsheets','https://www.googleapis.com/auth/drive'] credential = { "type": "service_account", "project_id": os.environ['SHEET_PROJECT_ID'], "private_key_id": os.environ['SHEET_PRIVATE_KEY_ID'], "private_key": os.environ['SHEET_PRIVATE_KEY'].replace('\\n', '\n'), "client_email": os.environ['SHEET_CLIENT_EMAIL'], "client_id": os.environ['SHEET_CLIENT_ID'], "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": os.environ['SHEET_CLIENT_X509_CERT_URL'] } credentials = Credentials.from_service_account_info(credential,scopes=scope) # ログイン gc = gspread.authorize(credentials) # シートを開く wb = gc.open_by_key(os.environ['SHEET_DATABASE_KEY']) ws = wb.worksheet("Main") file_send = client.file_send(os.environ['DB_URL'],os.environ['DB_TOKEN']) app = Flask(__name__) ext = Sitemap(app=app) ALLOWED_EXTENSIONS = {'png','jfif','pjpeg','jpeg','pjp','jpg'} def allowed_file(filename): return '.' in filename and \ filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS @app.get('/') def index(): return render_template('index.html') @ext.register_generator def index(): yield 'index', {} @app.get('/about/') def about(): return render_template('about.html') @ext.register_generator def about(): yield 'about', {} @app.get('/contact/') def contact(): return render_template('contact.html') @ext.register_generator def contact(): yield 'contact', {} @app.get('/record/') def record(): return render_template('record.html') @ext.register_generator def record(): yield 'record', {} @app.post('/record/thanks/') def record_thanks(): # fileがない場合 if 'image' not in request.files: return render_template( 'record_thanks.html', status='登録できませんでした。ファイルを送信してください。' ) file = request.files['image'] # filenameが空の場合 if file.filename == '': return render_template( 'record_thanks.html', status='登録できませんでした。ファイルの名前を指定してください。' ) if file and allowed_file(file.filename): fileext = os.path.splitext(secure_filename(file.filename))[1] else: return render_template( 'record_thanks.html', status='登録できませんでした。PNG,JPEGのみ送信できます。' ) id = str(ws.row_count + 1).zfill(5) filename = id + fileext answer = request.form save_data = [ id, answer["email"], answer["name"], answer["title"], filename, answer["date"], answer["note"], answer["no_seven"], answer["no_family"] ] ws.append_row(save_data) file_send.write(filename,file) return render_template( 'record_thanks.html', status='ご登録ありがとうございます。' ) @app.get('/privacy-policy/') def privacy(): return render_template('privacy-policy.html') @ext.register_generator def privacy(): yield 'privacy', {} if __name__ == "__main__": app.run(port=8000,debug=True)

追記(2022年6月12日)

自分は @TakaiY 様のアドバイスを参考に、ゴリ押しで解決しましたが、それらしきものを見つけたので、後からこの質問を見た方のために残しておきます。
spreadsheet.pySpreadsheetクラスの__init__関数内のself._properties.update(metadata["properties"])を叩ければ更新できそうですね。
あとはご自身でお調べいただければと思います。ヒントにでもなれば幸いです。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

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による文字列操作をサポートしているため、日本語処理も標準で可能です。