Pandas DataFrame 到 Smartsheet sheet

Pandas DataFrame to Smartsheet sheet

我已经弄清楚如何将新数据批量添加到 Smartsheet sheet,但只能使用单列数据集。我最接近于使用 for 循环将多列批量推送到 sheet,它将值推送到正确的列,但每个值都是一个新行。我需要在所有列中循环到 运行 一行,每次都建立该行,然后移动到下一行。我觉得我很接近,但现在不知道该怎么办。

key = 'super-secret-key'
smart = smartsheet.Smartsheet(key)

# test sheet
sheet_id = 111111111111
sheet = smart.Sheets.get_sheet(sheet_id)

# translate column names to column id
column_map = {}
for column in sheet.columns:
    column_map[column.title] = column.id

df = pd.DataFrame({'item_id': [111111, 222222],
                    'item_color': ['red', 'yellow'],
                    'item_location': ['office', 'kitchen']})

data_dict = df.to_dict('index')

rowsToAdd = []
for i, i in data_dict.items():
    for k, v in i.items():
        def res(k, v): 
            # Build new cell value
            new_cell = smart.models.Cell()
            new_cell.column_id = column_map[k]
            new_cell.value = v

            # Build the row to update
            new_row = smart.models.Row()
            new_row.to_top = True
            new_row.cells.append(new_cell)
            return new_row
        rowsToAdd.append(res(k, v))

result = smart.Sheets.add_rows(sheet_id, rowsToAdd)

结果:

您的代码(具体来说,嵌套 for 循环中的代码)每次从数据中读取 key/value 对时都会创建一个新的行对象——从而导致您的结果重新查看(即,Smartsheet 中的一行对应数据中的每个 key/value 对)。

相反,您只想在将所有(三个)key/value 对的数据添加到行对象后在 Smartsheet 中创建一个新行。以下代码应该会给出您想要的结果。

# goal is to create a row for each object in data_dict
for i, i in data_dict.items():

    # create a new row object
    new_row = smart.models.Row()
    new_row.to_top = True

    # for each key value pair, create & add a cell to the row object
    for k, v in i.items():

        # create the cell object and populate with value
        new_cell = smart.models.Cell()
        new_cell.column_id = column_map[k]
        new_cell.value = v

        # add the cell object to the row object
        new_row.cells.append(new_cell)

    # add the row object to the collection of rows
    rowsToAdd.append(new_row)

# add the collection of rows to the sheet in Smartsheet
result = smart.Sheets.add_rows(sheet_id, rowsToAdd)