Googleスプレッドシートとpythonで自動入力ツールを作っていたところ、タイトルのエラーが発生しました。原因や解決方法をまとめます。
実装していた機能の詳細
Google MapからAPIを使って複数の値を取得し、Googleスプレッドシートに自動で書き込むスクリプトを作成していた。
取得した2つの値をスプレッドシートのF,G列にそれぞれ書き込むことを想定してコードを書き、実行した時にエラーが発生した。
エラー概要
spread.exceptions.APIError: [400] but tried writing to column [G]
エラーを読むと、G列に書き込もうとしていることが問題らしい。
F,Gに書き込むのは想定通りだが、受け付けてくれていない。コードはF列まで書き込むことを想定しているようだ。
解決方法
書き込む範囲をしていたのは以下の部分である。
cell_range = f"F{row_index}:{chr(64 + len(values) + 4)}{row_index}"
上記の+4の部分を+5にすることで解決した。
原因と解説
エラー時のコードだと、cell_rangeがF4:F4になるのが原因。
valuesは2つあるので、「Gにはみ出しちゃうけど、指定した範囲と違うよね?」って教えてくれてる。
詳しく説明します
chr()は数値を文字に変換する関数。つまり、数字によって列を作ろうとしている。65=Aで、そこからアルファベットが続く。
それを前提にコードを見てみます(算数の問題)。
chr(64 + len(values) + 4)}を分解すると...
64はAの手前、len(values)は出力する値の数(今回は2)。
そして、+4で始点から数えるため、揃えるために置いてる数。
つまり、始点からvaluesの分だけ進んだ列を終点にするという書き方。
64+2+4=70(F)なので、終点をFにしてしまっているのである。
len(values) |
64 + len(values) + 4 の計算 |
chr(…) |
終列 | 意味 |
---|---|---|---|---|
1 | 64 + 1 + 4 = 69 |
'E' |
E列 | 1つだけしか書けない。F列すら含まれない。NG |
2 | 64 + 2 + 4 = 70 | 'F' |
F列 | 2つ目を書こうとするとG列に出るけど、範囲外でエラー |
✅ 2(正解) | 64 + 2 + 5 = 71 | 'G' |
G列 | F列・G列の2つぶんが範囲内。OK |
Gを終点にしたいので、+5にして69からvaluesの分(今回は2)右に進むようにすることで解決した、ということです。
つぶやき
将来的に取得する値が3つ、4つと増えていく可能性があるため、 cell_range
は動的に len(values)
を使って柔軟に対応できるようにしてあります。