PythonでAPIを使ってデータを受け取ったあとspreadsheetへ書き込みたいなと思ったものの、なかなかまとまった情報が落ちていなかったのでまとめます。
準備と環境
Pythonでspreadsheetを書き込むための準備は以下の記事にまとめています。
ここではcolabを使って動作確認しています。
Pythonでspreadsheetに書き込む
準備の記事で使っているコードは書き込み済みの想定で書いていきます。
import gspread
from oauth2client.service_account import ServiceAccountCredentials
scope = ['https://spreadsheets.google.com/feeds','https://www.googleapis.com/auth/drive']
#ダウンロードしたjsonファイルをドライブにアップデートした際のパス
json = 'ここに秘密キーのパスを貼り付け'
credentials = ServiceAccountCredentials.from_json_keyfile_name(json, scope)
gc = gspread.authorize(credentials)
#書き込み先のスプレッドシートキーを追加
SPREADSHEET_KEY = 'ここにスプレッドシートのキーを貼り付け'
シートの書き出し先の指定の仕方
スプレッドシートへ書き込むためにはスプレッドシートのシートの書き込み先の指定方法からみていきます。シート名を指定して取得するなどいろいろな方法があります。
参考元:https://docs.gspread.org/en/latest/user-guide.html
シートの1枚目を指定する方法
問答無用でシートの1枚目を指定します。
worksheet = gc.open_by_key(SPREADSHEET_KEY).sheet1
gc.open_by_key(SPREADSHEET_KEY).sheet1となっているので、sheet2と指定したらシートの2枚目を取れそうに思うのですが取れないです。
シート名を指定して取得する方法
シート名を指定します。
worksheet = gc.open_by_key(SPREADSHEET_KEY).worksheet('シート名')
事前に作ってあるシート名を指定する方法です。シートが存在しないと「WorksheetNotFound」のエラーがおきます。
シートを作成して取得する方法
シートを作成し作成したシートを取得します。
workbook = gc.open_by_key(SPREADSHEET_KEY)
worksheet = workbook.add_worksheet('シート名', rows=100, cols=26)
workbookはspreadsheet全体を取得しています。
add_worksheet(‘シート名’, rows=100, cols=26)で指定したシート名を追加します。rowsとcolsは必須です適当な量を追加します。
シート名が重複した場合は以下のエラーになります。
APIError: {‘code’: 400, ‘message’: ‘Invalid requests[0].addSheet: A sheet with the name “シート名” already exists. Please enter another name.’, ‘status’: ‘INVALID_ARGUMENT’}
シートの中身をクリアする方法
書き込む前にシートの中のデータを消したい場合もあるかと思います。上記で取得したworksheet変数を使います。
シートの中身を全て消す
worksheet.clear()
シートの中身が全て消されます。
シートの中身の一部を消す
workbook = gc.open_by_key(SPREADSHEET_KEY)
workbook.values_clear("'シート名'!A1:B1")
シートを指定したレンジで消します。上記の例だとA1とB1のセルが消えます。A1:E21にするとA1が始点、E21が終点とした四角形のエリアが消されます。
シートへ書き込む方法
ようやく書き込む方法です。
シートへとりあえず書き込む
worksheet.append_row( values= ['Hello'] )
values= [‘Hello’] の部分はリスト型(配列)が入ります。以下のように書くこともできます。
items = ['Hello', 'here', 'is', 'Programmer', 'Life']
worksheet.append_row(items)
rowなので1行目にリストの項目1つずつを1つのセルに入れいってくれます。
書き込む位置を指定する場合は以下のようになります。
items = ['Hello', 'here', 'is', 'Programmer', 'Life']
worksheet.append_row(items , table_range='B2')
仮にtable_range=’B2’を指定していてもB2のセルに既に値がある場合はB3へ書き出されます。
シートへ複数行書き出す
append_rowではなくappend_rowsを使います。
items = [['Hello', 'here', 'is'],['Programmer', 'Life']]
worksheet.append_rows(items , table_range='B2')
リスト型で中身のリストごとに行が変わっていきます。
table_rangeはオプションなのであってもなくてもOKです。
シートへとりあえず上書きする
appendでは上書きはされませんが、updateを使うと上書きされます。
worksheet.update('B2', 'Hello!')
何も値がない場合は上記の場合B2に文字が追加されます。
シートへオブジェクト型を書き込む
文字列やリスト型は手前の方法で書き込めるので、次はオブジェクト型を書き込んでみます。と言ってもリスト型に入れ直すだけですが。
item = {'title': 'Programmer-Life', 'web': 'ブログ'}
datas = [item["title"], item["web"]]
worksheet.append_row(datas)
配列の中にオブジェクトがいる場合はfor文のループで回せばスプレッドシートへ1行ずつ書き出してくれます。
おわり
データフレーム型の書き出し方法についてはpandasを使う方法しか知らないのでここでは省略します。
pythonは調べるといろいろできそうでやりたくなりますが、自分の実力が追いついていないので少しずつ理解を深めていきたいところです。