将 python 数据框发布到 Gsheet:根据日期绘制一组数据周围的边框

Publish python dataframe to Gsheet: Sketch borders around a set of data based on dates

我有一个数据框 df(这是一个时间序列数据),如所附照片所示。我可以使用下面的代码将此数据帧写入 Google Sheet。

问题:

  1. 在GoogleSheet中,我想在每个星期结束后画一条水平线(如图所示)。
  2. 如您所见,我计算了 Year# 和 Week#(从 Date 列)。这两列的唯一组合是否可以用来识别属于同一周的数据并用作逻辑来勾勒一条线?

清除 Google Sheet:

service.spreadsheets().values().clear(
    spreadsheetId=spreadsheet_id,
    range='A1:AZ2600',
    body={}
).execute()

将df_final写入Google Sheet:

cell_range_insert= 'B7'
values = df_final.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=df_final.T.reset_index().T.values.tolist()
    )
).execute()

我相信你的目标如下。

  • 您想在每周结束时插入水平线到点差sheet。
  • 当脚本为运行时,“清除GoogleSheet:”的脚本为运行后,“写入df_final的脚本] 到 Google Sheet:" 是 运行.
  • 数据来自第一个选项卡中的单元格“B7”。
  • 您想使用 googleapis 实现此目的 python。

在你的脚本中,下面的修改脚本怎么样?

修改后的脚本:

请设置spreadsheet_idsheet_id的值。

spreadsheet_id = "###" # Please set Spreadsheet ID.
sheet_id = 0  # Please set the sheet ID.

# 1. Clear sheet. In this case, the values and the horizontal lines are removed.
service.spreadsheets().batchUpdate(
    spreadsheetId=spreadsheet_id, body={"requests": [{
        "repeatCell": {
            "range": {
                "sheetId": sheet_id
            },
            "fields": "userEnteredValue,userEnteredFormat.borders"
        }
    }
    ]}).execute()

# 2. Put the values from the dataframe to Spreadsheet.
cell_range_insert = 'B7'
# values = df_final.to_json() # It seems that this is not used.
# body = {'values': values} # It seems that this is not used.
response_date = service.spreadsheets().values().append(
    spreadsheetId=spreadsheet_id,
    valueInputOption='RAW',
    range=cell_range_insert,
    body=dict(
        majorDimension='ROWS',
        values=df_final.T.reset_index().T.values.tolist()
    )
).execute()

# 3. Set the horizontal lines.
temp = -1
n = []
for index, row in df_final.iloc[:, 5:8].iterrows():
    s = ''.join(row.astype(str).tolist())
    if temp != s:
        n.append(index)
        temp = s
offset = 7
requests = [{
    "repeatCell": {
        "cell": {
            "userEnteredFormat": {
                "borders": {
                    "top": {
                        "style": "SOLID_THICK"
                    }
                }
            }
        },
        "range": {
            "sheetId": sheet_id,
            "startRowIndex": e + offset,
            "endRowIndex": e + 1 + offset,
            "startColumnIndex": 1,
            "endColumnIndex": 10
        },
        "fields": "userEnteredFormat.borders"
    }
} for e in n]
service.spreadsheets().batchUpdate(spreadsheetId=spreadsheet_id, body={"requests": requests}).execute()
  • 当此脚本为运行时,sheet使用batchUpdate方法清除。在这种情况下,值和水平线都被删除。并且,数据被放入 Spreadsheet。然后,使用 batchUpdate 方法放置水平线(每个周末的列“B”到“J”)。

  • 为了检查放置边框的行号,我使用了“G”、“H”、“I”列的值。

  • 在这个示例中,我使用 SOLID_THICK 作为边框。如果你想改变这个,请改变它。 Ref

注:

  • 以上脚本检查“G”、“H”、“I”列。如果只想检查“I”列而不是“G”、“H”、“I”列,作为简单修改,请将上述脚本修改如下。

    • 来自

        for index, row in df_final.iloc[:, 5:8].iterrows():
      
    •   for index, row in df_final.iloc[:, 7:8].iterrows():
      

参考文献: