This repository has been archived by the owner on Jun 22, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathspread_sheet_result_sender.py
235 lines (186 loc) · 9.49 KB
/
spread_sheet_result_sender.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
"""
■ ご依頼その2
このプログラムを実行……
python spread_sheet_result_sender.py
したとき、一番下にあるデータが「レース yyyy-mm-dd の着順」として
Spread Sheet にきちんと格納されるように、関数 send を作ってください!
"""
# 必要モジュールの準備
import pandas as pd
import gspread
# ServiceAccountCredentials:Googleの各サービスへアクセスできるservice変数を生成します。
from oauth2client.service_account import ServiceAccountCredentials
# User modules.
import consts
seat_dict = {
'sample-id-1': 'ササキ',
'sample-id-2': 'コバヤシ',
'sample-id-3': 'ウエハラ',
'sample-id-4': 'マツノ',
'sample-id-5': 'アカミネ',
'sample-id-6': 'フクヤマ',
'sample-id-7': 'トヨシ',
}
# 2つのAPIを記述しないとリフレッシュトークンを3600秒毎に発行し続けなければならない
scope = ['https://spreadsheets.google.com/feeds', 'https://www.googleapis.com/auth/drive']
# 認証情報設定
# NOTE: もともとは from_json_keyfile_name で json ファイルから credentials を作っていました。
# しかし秘密鍵である json ファイルを repository に含めると、 GitHub で公開できません!
# なので from_json_keyfile_dict に変更して、 json ファイルがなくても動くようにしました。
credentials = ServiceAccountCredentials.from_json_keyfile_dict(
consts.GSPREAD_CREDENTIAL_JSON,
scope,
)
# OAuth2の資格情報を使用してGoogle APIにログインします。
gc = gspread.authorize(credentials)
# 共有設定したスプレッドシートキーを変数[SPREADSHEET_KEY]に格納する。
# スプレッドシートのd/〜〜/までをコピー。
SPREADSHEET_KEY = '1pCTN9momqKlH4UtTRTf11yqXW2nI3grXUzRpbu6M6Tw'
SP_SHEET = '結果' # ワークシート名
# 共有設定したスプレッドシートを開く
sh = gc.open_by_key(SPREADSHEET_KEY)
# ワークシートの選択
worksheet = sh.worksheet(SP_SHEET)
# スプレットシートの全データを取得
data = worksheet.get_all_values()
def send(race_held_yyyy_mm_dd, race_result):
# ここを埋めてほしい。
####################################
# pandasでindex番号を取得
# 上から2列目を無視上から1列目をカラムとする。indexは開催年月日とする。
df = pd.DataFrame(data[2:], columns=data[1]).set_index('開催年月日')
# 開催年月日と比較したいのでrace_held_yyyy_mm_ddを編集
acquisition_date = race_held_yyyy_mm_dd.replace('-', '/')
# 開催年月日が一致するindex番号を取得
# スプレッドシートのフォーマット状 取得したインデックスに3加算した値がセルの位置
cell_index_no = df.index.get_loc(acquisition_date)+3
# race_resultの辞書よりキーを取得してリスト化 11点のリストを確認してから並び替え
race_result_list = race_result.keys()
if len(race_result_list) == 11:
sorted_race_result_list = [
'ranking1',
'ranking1_name',
'ranking2',
'ranking2_name',
'ranking3',
'ranking3_name',
'tansho_payout',
'umaren_payout',
'umatan_payout',
'fuku3_payout',
'tan3_payout']
# 結果を書込む範囲を指定する。(G○:Q○)で指定。
range_write_result = worksheet.range(
'G' + str(cell_index_no) + ':' + 'Q' + str(cell_index_no)
)
# 変更範囲を指定して、変更内容を書込みしスプレッドシートに反映させる。
for i, cell in enumerate(range_write_result):
cell.value = race_result[sorted_race_result_list[i]]
worksheet.update_cells(range_write_result)
# ####################################
# 結果を元に各ユーザーのシートに的中判定と的中金額を書き込んでいく。
# シートのリストを取得。
seat_dict_key_list = list(seat_dict.keys())
####################################
# seat_dict_key_listの数だけ下記を回す。
for _ in range(len(seat_dict_key_list)):
# ワークシート名
SP_SHEET = seat_dict[seat_dict_key_list[_]]
# 共有設定したスプレッドシートを開く
sh = gc.open_by_key(SPREADSHEET_KEY)
# ワークシートの選択
worksheet_user = sh.worksheet(SP_SHEET)
# スプレットシートの全データを取得
data_users = worksheet_user.get_all_values()
# pandasでindex番号を取得
# 上から2列目を無視上から1列目をカラムとする。indexは開催年月日とする。
df_result_writing = pd.DataFrame(
data_users[2:], columns=data_users[1]
).set_index('開催年月日')
# 読み込んできたいcolumnsのリストと辞書を定義
expected_columns_list = ['◎', '○', '▲', '△', '☆']
refundment_writing_dict = {}
# 予想の辞書作成。
for expected_column in expected_columns_list:
refundment_writing_dict[expected_column] = int(
df_result_writing.at[acquisition_date, expected_column]
)
# 勝負レースかを判定。チェックボックスの状態を見ている。
geme_race_bool = df_result_writing.at[acquisition_date, '勝負']
# 通常は、1倍 勝負レースで3倍
geme_race = 1
if geme_race_bool == 'TRUE':
geme_race = 3
# レース名を取得
race_name = df_result_writing.at[acquisition_date, 'レース名']
# 払戻情報を辞書化
refund_info_dict = {
'単勝': 0,
'馬連': 0,
'馬単': 0,
'3連複': 0,
'3連単': 0,
'合計払戻し': 0
}
# レース結果の1,2,3着リスト
ranking123_list = [
race_result['ranking1'],
race_result['ranking2'],
race_result['ranking3']
]
# 単勝結果の判定
if race_result['ranking1'] == refundment_writing_dict['◎']:
refund_info_dict['単勝'] = race_result['tansho_payout'] * 10 * geme_race
# 馬連結果の判定
umaren_flag = 0
if refundment_writing_dict['◎'] == race_result['ranking1'] or refundment_writing_dict['◎'] == race_result['ranking2']:
umaren_flag += 10
if refundment_writing_dict['○'] == race_result['ranking1'] or refundment_writing_dict['○'] == race_result['ranking2']:
umaren_flag += 10
if refundment_writing_dict['▲'] == race_result['ranking1'] or refundment_writing_dict['▲'] == race_result['ranking2']:
umaren_flag += 1
if refundment_writing_dict['△'] == race_result['ranking1'] or refundment_writing_dict['△'] == race_result['ranking2']:
umaren_flag += 1
if refundment_writing_dict['☆'] == race_result['ranking1'] or refundment_writing_dict['☆'] == race_result['ranking2']:
umaren_flag += 1
if umaren_flag >= 11:
refund_info_dict['馬連'] = race_result['umaren_payout'] * 4 * geme_race
# 馬単結果の判定
if refundment_writing_dict['◎'] == race_result['ranking1']:
if refundment_writing_dict['○'] == race_result['ranking2'] or refundment_writing_dict['▲'] == race_result['ranking2']:
refund_info_dict['馬単'] = race_result['umatan_payout'] * 3 * geme_race
# 3連複の判定
fuku3_len = set(list(refundment_writing_dict.values())) & set(ranking123_list)
if len(fuku3_len) == 3:
refund_info_dict['3連複'] = race_result['fuku3_payout'] * 2 * geme_race
# 3連単の判定
if refundment_writing_dict['◎'] in ranking123_list:
if len(set(list(refundment_writing_dict.values())) & set(ranking123_list)) == 3:
refund_info_dict['3連単'] = race_result['tan3_payout'] * geme_race
# 合計払戻しを計算する。
refund_info_dict['合計払戻し'] = refund_info_dict['単勝']+refund_info_dict['馬連']+refund_info_dict['馬単'] + \
refund_info_dict['3連複'] + refund_info_dict['3連単']-(10000*geme_race)
# 結果を書込む範囲を指定する。(G○:S○)で指定。
range_write_refund = worksheet_user.range('N' + str(cell_index_no) + ':' + 'S' + str(cell_index_no))
# 変更範囲を指定して、変更内容を書込みしスプレッドシートに反映させる。
for i, cell in enumerate(range_write_refund):
cell.value = refund_info_dict[list(refund_info_dict.keys())[i]]
worksheet_user.update_cells(range_write_refund)
print(f'{SP_SHEET}のシート。{race_name}に書き込み。勝負レース:{geme_race_bool}')
print(refund_info_dict)
# この関数が終わるとき、データが Spread Sheet に【レース結果と払戻し情報】がきちんと格納されるように、作ってほしい。
pass
if __name__ == '__main__':
send('2021-04-18', {
'tansho_payout': 370,
'umaren_payout': 4300,
'umatan_payout': 5510,
'fuku3_payout': 20000,
'tan3_payout': 82320,
'ranking1': 7,
'ranking1_name': 'エフフォーリア',
'ranking2': 13,
'ranking2_name': 'タイトルホルダー',
'ranking3': 3,
'ranking3_name': 'ステラヴェローチェ'
})