在C#中使用BatchUpdateSpreadsheetRequest批量更新谷歌表格多行多列单元格:每行多单元格更新实现问询
解决谷歌表格批量多行多列更新的问题
我来帮你搞定这个C#操作谷歌表格的问题,你的代码目前只更新了每行的第一个单元格,咱们一步步调整来实现多行多列的精准写入:
一、实现每行多个单元格更新
你现在的核心问题是每个RowData只添加了一个CellData,所以每行只能更新第一个单元格。要处理多列,只需要在遍历数据库记录时,为每个需要写入的字段创建对应的CellData,并添加到当前RowData的Values列表里就行。
二、精准定位单元格写入
谷歌表格的UpdateCellsRequest是通过Start属性指定起始单元格,然后Rows列表里的每个RowData对应从起始行开始的每一行,每个RowData.Values里的CellData对应从起始列开始的每一列:
- 如果
Start设置为RowIndex=0, ColumnIndex=0,那第一个RowData的第一个CellData对应A1,第二个对应B1;第二个RowData的第一个对应A2,第二个对应B2,以此类推 - 如果要从第3行(索引2)第2列(索引1)开始写入,只需要把
Start的RowIndex设为2,ColumnIndex设为1就行
修改后的完整代码
BatchUpdateSpreadsheetRequest requestBody = new BatchUpdateSpreadsheetRequest(); requestBody.Requests = new List<Request>(); Request r = new Request(); requestBody.Requests.Add(r); r.UpdateCells = new UpdateCellsRequest(); // 设置起始单元格:这里从第1行第1列开始(索引从0开始计数) var gc = new GridCoordinate(); gc.ColumnIndex = 0; // 起始列索引,对应表格的A列 gc.RowIndex = 0; // 起始行索引,对应表格的第1行 gc.SheetId = 0; // 要更新的目标工作表ID r.UpdateCells.Start = gc; // 只更新单元格的值,比"*"更高效,若需更新格式等其他属性再改用"*" r.UpdateCells.Fields = "userEnteredValue"; r.UpdateCells.Rows = new List<RowData>(); SqlDataReader reader = default(SqlDataReader); reader = o_cSQL.RunSPReturnDataReader("Shipments", 40997, sNow, sNow); while (reader.Read()) { var rd = new RowData(); r.UpdateCells.Rows.Add(rd); rd.Values = new List<CellData>(); // 为当前行的每个字段创建CellData并添加到Values列表 // 1. 处理new_attn字段(对应起始列的第一列) var cdAttn = new CellData(); cdAttn.UserEnteredValue = new ExtendedValue(); cdAttn.UserEnteredValue.StringValue = reader["new_attn"].ToString(); rd.Values.Add(cdAttn); // 2. 处理第二个字段,比如shipment_id(对应起始列的第二列) var cdId = new CellData(); cdId.UserEnteredValue = new ExtendedValue(); cdId.UserEnteredValue.StringValue = reader["shipment_id"].ToString(); rd.Values.Add(cdId); // 3. 处理第三个字段,比如ship_date(对应起始列的第三列) var cdDate = new CellData(); cdDate.UserEnteredValue = new ExtendedValue(); cdDate.UserEnteredValue.StringValue = reader["ship_date"].ToString(); rd.Values.Add(cdDate); // 若有更多字段,继续添加对应的CellData即可 } SpreadsheetsResource.BatchUpdateRequest batchRequest = service.Spreadsheets.BatchUpdate(requestBody, spreadsheetId); batchRequest.Execute();
额外优化提示
- 如果你想动态处理数据库返回的所有字段,不用手动逐个添加,可以用
reader.FieldCount循环遍历每个字段:for (int i = 0; i < reader.FieldCount; i++) { var cd = new CellData(); cd.UserEnteredValue = new ExtendedValue(); cd.UserEnteredValue.StringValue = reader[i].ToString(); rd.Values.Add(cd); } - 工作表ID
SheetId可以通过谷歌表格URL或API查询获取,确保指定的是你要操作的目标工作表
内容的提问来源于stack exchange,提问作者Trudy Reiser
相关产品推荐
相关产品推荐

