データベース(mysql)からデータを引っ張ってきて、スプレッドシートに入れます。
・動機としては、知りたい数字があるけど、社内で使っているCRMは改修にお金がかかるから易々と変更できない。
・ベンチマークとかを使って、クエリで呼び出したデータをコピペしてスプレッドシートに貼り付けていた。でも、貼り付ける作業も毎日なので、しんどくなってきて、自動でスプレッドシートに更新されればいいのに。と思った。
完成イメージとしては、バッチファイルを作って、毎日パソコンを起動したときに、自動で数字を更新してくれたらいいな。という感覚。
今回やったステップを順番にまとめると以下。
1.貼り付け先のスプレッドシートを用意する。
2.貼り付け先は、A:AとかB:Bとか、縦一列のイメージ。
3.Pythonを使ってスプレッドシートにアクセスできるようにする。
4.Pythonを使って、データベースにアクセスできるようにする。
5.セルを一つづつ更新していたら、APIのエラーが出て更新出来ない。
6.APIエラーが出ないようにクエリの結果をA:Aに貼り付けたい。
こんな感じ。
とりあえずやりたいのが、データベースからデータを引っ張ってきてスプレッドシートに入力するということ。
まずは、pythonを使ってスプレッドシートにアクセルする方法。
これは、調べても山のように出てくるから、「python スプレッドシート 連携」とかで調べたらすぐにわかると思う。
次に、データベースの件。「import mysql.connector」で調べたら出てくる。
次に、セルを一つづつ更新したら、エラーが出る件。
100秒以内に100回だったかな?APIを呼び出すとエラーが出る。
エラーは以下のようなエラー内容
raise APIError(response)
gspread.exceptions.APIError: {
"error": {
"code": 429,
"message": "Quota exceeded for quota group 'WriteGroup' and limit 'USER-100s' of service 'sheets.googleapis.com' for consumer 'project_number:〇〇〇〇〇〇〇'.",
"status": "RESOURCE_EXHAUSTED",
"details": [
{
"@type": "type.googleapis.com/google.rpc.Help",
"links": [
{
"description": "Google developer console API key",
"url": "https://console.developers.google.com/project/〇〇〇〇〇/apiui/credential"
}
]
}
]
}
}
1000行以上あるから、worksheet.update_acellを使っていたら、エラーが出る。
worksheet.update_acellは、一つづつ値を更新していくので、それだけAPIを使わなければいけないので、すぐにエラーになる。一気に値を追加しようと思ったら、worksheet.update_cellsを使う。worksheet.update_cellsを使うとAPIをたたく回数が少なくて済む。
一気に取得して、一気に入力!という感じ。実際にどんな風に書いているのかコードを張っておく。
# データベースから引っ張ってきた情報(出力カラムは1つ)をスプレッドシートへ入力する。
# スプレッドシートの2行目から貼り付けられるようにする。
import gspread
from oauth2client.service_account import ServiceAccountCredentials
import json
import gspread
from oauth2client.service_account import ServiceAccountCredentials
import mysql.connector
import sys
scope = ['https://spreadsheets.google.com/feeds']
#ダウンロードしたjsonファイル名を記入
json_file = '〇〇〇〇.json'
#スプレッドシートIDを記入
sheet_id = 'スプレッドシートのID'
#スプレッドシートのシート名を記入
sheet_name = 'sheet'
# jsonを読みに行き、スプレッドシートと連携
credentials = ServiceAccountCredentials.from_json_keyfile_name(json_file, scope)
gc = gspread.authorize(credentials)
sp = gc.open_by_key(sheet_id)
worksheet = sp.worksheet(sheet_name)
# データベースへ接続
# コネクションの作成
def sql_input(sql,col_select):
conn = mysql.connector.connect(
host='localhost',
port='〇〇〇',
user='〇〇〇',
password='〇〇〇',
database='〇〇〇'
)
cur = conn.cursor()
cur.execute(sql)
rows = cur.fetchall()
# keyword_listへsqlの結果を格納
keyword_list=[]
for row in rows:
row = row[0]
keyword_list.append(row)
# キーワードの個数を確認してA1:A〇を作る。keyword_listに+1している理由はA2行目から始めるから。
range_count = len(keyword_list)+1
range_count = str(range_count)
range_counts = col_select+range_count
# rangeに入るA1:A●をworksheet.rangeへ入れる
#cell_list = worksheet.range(A1:A7)
cell_list = worksheet.range(range_counts)
# cell_valuesは入力したい値。今回の場合は、keyword_listの内容が入力したい値になる。
# cell_valuesをkeyword_listへ変更する。
# cell_values = [1,2,3,4,5,6,7]
for i, val in enumerate(keyword_list):
cell_list[i].value = val
worksheet.update_cells(cell_list)
# データベースを閉じる
cur.close()
conn.close()
# sqlの文章というところへ、select カラム名 from デーブル名・・・を入れる
# ”A2:A"のところへ、貼り付けたい列を入れる。(単一列のみ)A1:B10とはエラー出る。
sql_input("sqlの文章","A2:A")
これで、エラーで出ずに、一撃でスプレッドシートに追加することが出来た。