Python で Google Sheets の複数シートを操作する方法等

Photo by Clément H on Unsplash

Google Sheets の複数シートを操作する方法

やりたいこと

所有している株式の値動きを Google sheets で管理している。
週に一度、証券会社のサイトを閲覧し、数字をシートに転記していた。
転記は面倒だし、ミスもあるので、自動化したい。

  1. データは、証券会社からダウンロードした CSV 形式ファイル。現時点では手動でダウンロードする。
  2. 1 銘柄、1 シートで管理している。
  3. シートの 1 行目は見出し。2 行目以降は CSV 形式ファイルから転記するデータ。
  4. 週に一度行追加する。行は日付の降順に並べる。(常に 2 行目をコピーして、2 行目に挿入)
  5. 列には、左から「日付」「銘柄コード」「銘柄名」「保有数量 」「取得コスト(円)」「現在値(円)」「取得金額(円)」「評価額(円)」「評価損益(円)」「利益率」が並ぶ。なお、1 銘柄、1 シートなので、「銘柄コード」「銘柄名」は同じ値が続く。
  6. 「日付」は処理した日付をセットする。
  7. 「保有数量 」「取得コスト(円)」「現在値(円)」は CSV 形式ファイルから取得したデータをセットする。
  8. 「取得金額(円)」「評価額(円)」「評価損益(円)」「利益率」は数式。

処理手順

ソースコードに沿って処理手順を説明する。
1 行目から 24 行目までは、「 Python で Google Sheets にアクセスするための手順」を参照のこと。[]内はソースコード内の位置

  1. 今日の日付を YYYY/MM/DD 形式で取得する。[ 30 行目]
  2. Google Sheets の複数シートをシートの数だけ順次処理していく。[ 33 行目、 34 行目]
  3. シートの 2 行目をコピーし、 2 行目に挿入する。数式をコピーする場合、row_value のオプションとして 'FORMULA' が必要。また、insert_row のオプションとして 'USER_ENTERED' も必要。(参考: ValueRenderOption  |  Sheets API  |  Google DevelopersValueInputOption  |  Sheets API  |  Google Developers )[ 38 行目]
  4. 日付を更新する。[ 41 行目]
  5. 数式(「取得金額(円)」「評価額(円)」「評価損益(円)」「利益率」)を 3 行目の数式をコピーして、 2 行目の同列に貼り付ける。[ 44 行目、 45 行目]
  6. 銘柄名を検索キーワードとしてセットする。[ 48 行目]
  7. CSV ファイルを読み込み、ヘッダは読み飛ばし、明細のみリスト化する。[ 53 行目~ 61 行目]
  8. リストからキーワード(銘柄名)を検索する。ヒットすれば、CSV 形式ファイルの「保有数量 」「取得コスト(円)」「現在値(円)」でシート内の同項目を更新する。[ 64 行目~ 67 行目]

問題発生

キーワードはワークシートから取得しており、検索ループ内でワークシートをアクセスしていたため、下記のようなエラーが発生していた。

そこでキーワードを検索ループ外で変数にセットすることにした。
つまり、「if r.count(ws.cell(2,2).value) > 0:」を「kw = ws.cell(2,2).value」と「if r.count(kw) > 0:」に分けることにより、ワークシートへのアクセス回数を減らして解決した。

申請すれば上限を上げることも可能らしいが、まずは自分のコードを見直すべきであろう

<エラーメッセージ>
gspread.exceptions.APIError: {'code': 429, 'message': "Quota exceeded for quota group 'ReadGroup' and limit 'Read requests per user per 100 seconds' of service 'sheets.googleapis.com' for consumer 'project_number:(以下省略)

ソースコード

Posted in  on 3/08/2020 by rteak |