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)
    

你的情况,下面的流程如何。

  1. 使用 batchUpdate 方法插入新的 sheet 并将公式放入每个新 sheet 的单元格“B7”。
  2. 使用 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。
  • 关于数据框,这个脚本来自你的展示脚本。所以,请根据您的实际情况进行修改。

参考文献: