我正在尝试通过smartsheet API(使用c#SDK)将数据表中的数据写入工作表。我看了看文档,发现它支持批量操作,但是我正在努力寻找该功能的示例。
我已经尝试过一种解决方法,只是遍历源中的每条记录并发布该数据。
//Get column properties (column Id ) for existing smartsheet and add them to List for AddRows parameter
//Compare to existing Column names in Data table for capture of related column id
var columnArray = getSheet.Columns;
foreach (var column in columnArray)
{
foreach (DataColumn columnPdiExtract in pdiExtractDataTable.Columns)
{
//Console.WriteLine(columnPdiExtract.ColumnName);
if(column.Title == columnPdiExtract.ColumnName)
{
long columnIdValue = column.Id ?? 0;
//addColumnArrayIdList.Add(columnIdValue);
addColumnArrayIdList.Add(new KeyValuePair<string, long>(column.Title,columnIdValue));
}
}
}
foreach(var columnTitleIdPair in addColumnArrayIdList)
{
Console.WriteLine(columnTitleIdPair.Key);
var results = from row in pdiExtractDataTable.AsEnumerable() select row.Field<Double?>(columnTitleIdPair.Key);
foreach (var record in results)
{
Cell[] cells = new Cell[]
{
new Cell
{
ColumnId = columnTitleIdPair.Value,
Value = record
}
};
cellRecords = cells.ToList();
cellRecordsInsert.Add(cellRecords);
}
Row rows = new Row
{
ToTop = true,
Cells = cellRecords
};
IList<Row> newRows = smartsheet.SheetResources.RowResources.AddRows(sheetId, new Row[] { rows });
}
我希望为每个单元格生成一个值,将其附加到列表中,然后通过行对象将其发布。但是,我的循环将这样添加列值:A1:1,B2:2,C3:3而不是A1:1,B1:2,C3:3
首选项将是使用批量操作,但是没有一个例子,我有点茫然。但是,该循环也无法解决,因此,如果有人有任何建议,我将不胜感激!
谢谢你, 钱宁
答案 0 :(得分:3)
您看过Smartsheet https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html吗?这可能是有用的参考。它包含批量操作的示例用法,该批量操作可通过一次调用更新多行。
答案 1 :(得分:2)
泰勒,
感谢您的帮助。您引导我朝着正确的方向前进,我找到了解决方案的方法。
我按列值列表进行分组,并为最终批量操作构建了记录。我使用了For循环,但是在此方法之前,每组列中的元素都已清理并分配为0,以便它们在每个组中保留相同的值计数。
// Pair column and cell values for row building - match
// Data source column title names with Smartsheet column title names
List<Cell> pairedColumnCells = new List<Cell>();
//Accumulate cells
List<Cell> cellsToImport = new List<Cell>();
//Accumulate rows for additions here
List<Row> rowsToInsert = new List<Row>();
var groupByCells = PairDataSourceAndSmartsheetColumnToGenerateCells(
sheet,
dataSourceDataTable).GroupBy(
c => c.ColumnId,
c => c.Value,
(key, g) => new {
ColumnId = key, Value = g.ToList<object>()
});
var countGroupOfCells = groupByCells.FirstOrDefault().Value.Count();
for (int i = 0; i <= countGroupOfCells - 1; i++)
{
foreach (var groupOfCells in groupByCells)
{
var cellListEelement = groupOfCells.Value.ElementAt(i);
var cellToAdd = new Cell
{
ColumnId = groupOfCells.ColumnId,
Value = cellListEelement
};
cellsToImport.Add(cellToAdd);
}
Row rows = new Row
{
ToTop = true,
Cells = cellsToImport
};
rowsToInsert.Add(rows);
cellsToImport = new List<Cell>();
}
return rowsToInsert;