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)
我已经弄清楚如何将新数据批量添加到 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)