Python for Google Sheets:自动创建新的 sheet(在同一工作簿中)并向其中写入新的数据框
Python for Google Sheets: Create new sheet (in the same workbook) automatically and write a new dataframe into it
我有一个循环运行 'n' 次并在每次迭代中生成 1 个新数据帧。每次迭代结束时创建新数据框时,如何自动创建新的 Google sheet(在同一工作簿中)?
我使用此代码将一个数据帧写入我已经手动创建的 Google Sheet:
#将一个数据帧写入Google的代码 Sheets:
cell_range_insert= 'B7'
values = df1.to_json()
body = {'values': values}
response_date= service.spreadsheets().values().append(
spreadsheetId=spreadsheet_id,
valueInputOption='RAW',
range=cell_range_insert,
body=dict(
majorDimension= 'ROWS',
values=df1.T.reset_index().T.values.tolist()
)
).execute()
#每次迭代生成一个dataframe的代码:
Ticker_List= ["AAPL", "GOOG", "AMZN"]
for Ticker in Ticker_List:
values = [['=GOOGLEFINANCE("' + str(Ticker) + '", "ALL", "1/1/2014", "2/6/2018" ,"DAILY")']]
cell_range_insert = 'B7'
body = {'values': values}
#Send formula to Google Sheet
service.spreadsheets().values().update(
spreadsheetId=spreadsheet_id,
valueInputOption='USER_ENTERED',
range=cell_range_insert,
body=body
).execute()
# Readback stock data from Google Sheets:
response = service.spreadsheets().values().get(
spreadsheetId=spreadsheet_id,
majorDimension='ROWS',
range='Sheet1'
).execute()
# Readback data from Google Sheets and assign it to dataframe df:
columns = response['values'][1]
data = response['values'][2:]
df = pd.DataFrame(data, columns=columns)
你的情况,下面的流程如何。
- 使用 batchUpdate 方法插入新的 sheet 并将公式放入每个新 sheet 的单元格“B7”。
- 使用 values.batchGet 方法从每个新的 sheet 中检索值。
当这个流程反映在你的脚本中时,它变成如下。
修改后的脚本:
spreadsheet_id = "###" # Please set your Spreadsheet ID.
requests = []
Ticker_List = ["AAPL", "GOOG", "AMZN"]
start_sheet_id = 123456
for i, Ticker in enumerate(Ticker_List):
sheet_id = start_sheet_id + i
formula = '=GOOGLEFINANCE("' + str(Ticker) + '", "ALL", "1/1/2014", "2/6/2018" ,"DAILY")'
requests.extend(
[
{"addSheet": {"properties": {"title": Ticker, "sheetId": sheet_id}}},
{
"updateCells": {
"start": {"sheetId": sheet_id, "rowIndex": 6, "columnIndex": 1},
"rows": [
{
"values": [
{"userEnteredValue": {"formulaValue": formula}}
]
}
],
"fields": "userEnteredValue",
}
},
]
)
service.spreadsheets().batchUpdate(spreadsheetId=spreadsheet_id, body={"requests": requests}).execute()
time.sleep(5) # This is required to be used.
res = service.spreadsheets().values().batchGet(spreadsheetId=spreadsheet_id, ranges=[f"'{e}'!B7:G" for e in Ticker_List]).execute()
# Put the values to dataframe.
for e in res["valueRanges"]:
values = e["values"]
columns = values[0]
data = values[1:]
df = pd.DataFrame(data, columns=columns)
print(df)
- 当此脚本为 运行 时,将插入 3 个新的 sheet 作为
"AAPL", "GOOG", "AMZN"
的 sheet 名称。并将公式放入每个插入的单元格“B7”中 sheet。这是使用 batchUpdate 方法 运行。
- batchUpdate 方法完成后,等待 5 秒。在这种情况下,请根据您的实际情况进行调整。 10秒可能合适。
- 等待后,将从每个插入的 sheet 中检索值。并且,这些值被放入数据框中。
注:
- 在此脚本中,使用了 2 个工作表配额 API。
- 关于数据框,这个脚本来自你的展示脚本。所以,请根据您的实际情况进行修改。
参考文献:
我有一个循环运行 'n' 次并在每次迭代中生成 1 个新数据帧。每次迭代结束时创建新数据框时,如何自动创建新的 Google sheet(在同一工作簿中)?
我使用此代码将一个数据帧写入我已经手动创建的 Google Sheet:
#将一个数据帧写入Google的代码 Sheets:
cell_range_insert= 'B7'
values = df1.to_json()
body = {'values': values}
response_date= service.spreadsheets().values().append(
spreadsheetId=spreadsheet_id,
valueInputOption='RAW',
range=cell_range_insert,
body=dict(
majorDimension= 'ROWS',
values=df1.T.reset_index().T.values.tolist()
)
).execute()
#每次迭代生成一个dataframe的代码:
Ticker_List= ["AAPL", "GOOG", "AMZN"]
for Ticker in Ticker_List:
values = [['=GOOGLEFINANCE("' + str(Ticker) + '", "ALL", "1/1/2014", "2/6/2018" ,"DAILY")']]
cell_range_insert = 'B7'
body = {'values': values}
#Send formula to Google Sheet
service.spreadsheets().values().update(
spreadsheetId=spreadsheet_id,
valueInputOption='USER_ENTERED',
range=cell_range_insert,
body=body
).execute()
# Readback stock data from Google Sheets:
response = service.spreadsheets().values().get(
spreadsheetId=spreadsheet_id,
majorDimension='ROWS',
range='Sheet1'
).execute()
# Readback data from Google Sheets and assign it to dataframe df:
columns = response['values'][1]
data = response['values'][2:]
df = pd.DataFrame(data, columns=columns)
你的情况,下面的流程如何。
- 使用 batchUpdate 方法插入新的 sheet 并将公式放入每个新 sheet 的单元格“B7”。
- 使用 values.batchGet 方法从每个新的 sheet 中检索值。
当这个流程反映在你的脚本中时,它变成如下。
修改后的脚本:
spreadsheet_id = "###" # Please set your Spreadsheet ID.
requests = []
Ticker_List = ["AAPL", "GOOG", "AMZN"]
start_sheet_id = 123456
for i, Ticker in enumerate(Ticker_List):
sheet_id = start_sheet_id + i
formula = '=GOOGLEFINANCE("' + str(Ticker) + '", "ALL", "1/1/2014", "2/6/2018" ,"DAILY")'
requests.extend(
[
{"addSheet": {"properties": {"title": Ticker, "sheetId": sheet_id}}},
{
"updateCells": {
"start": {"sheetId": sheet_id, "rowIndex": 6, "columnIndex": 1},
"rows": [
{
"values": [
{"userEnteredValue": {"formulaValue": formula}}
]
}
],
"fields": "userEnteredValue",
}
},
]
)
service.spreadsheets().batchUpdate(spreadsheetId=spreadsheet_id, body={"requests": requests}).execute()
time.sleep(5) # This is required to be used.
res = service.spreadsheets().values().batchGet(spreadsheetId=spreadsheet_id, ranges=[f"'{e}'!B7:G" for e in Ticker_List]).execute()
# Put the values to dataframe.
for e in res["valueRanges"]:
values = e["values"]
columns = values[0]
data = values[1:]
df = pd.DataFrame(data, columns=columns)
print(df)
- 当此脚本为 运行 时,将插入 3 个新的 sheet 作为
"AAPL", "GOOG", "AMZN"
的 sheet 名称。并将公式放入每个插入的单元格“B7”中 sheet。这是使用 batchUpdate 方法 运行。 - batchUpdate 方法完成后,等待 5 秒。在这种情况下,请根据您的实际情况进行调整。 10秒可能合适。
- 等待后,将从每个插入的 sheet 中检索值。并且,这些值被放入数据框中。
注:
- 在此脚本中,使用了 2 个工作表配额 API。
- 关于数据框,这个脚本来自你的展示脚本。所以,请根据您的实际情况进行修改。