如何通过Google Sheets API完整复制单元格全部数据(含文本、备注)
问题原因
你当前代码丢失文本和备注的核心原因是RepeatCellRequest的Fields参数仅配置了UserEnteredFormat,该配置只会同步单元格的用户自定义格式,不会同步单元格内容、公式、备注等其他数据。同时你读取单元格的代码存在语法问题,RowData[0].Values返回的是单元格数组,你需要取下标[0]拿到单个单元格的CellData对象。
解决方案
你可以在同一次BatchUpdate请求中完成两个单元格的完整内容互换,不需要多次调用接口,操作步骤如下:
- 分别读取两个目标单元格的完整
CellData(包含值、格式、备注等所有属性) - 在
Fields参数中指定要复制的所有字段,直接填*即可同步单元格的全部属性 - 在同一个批量请求中添加两个更新操作,将两个单元格的
CellData互相写入对方的位置
修正后的参考代码
UserCredential credential; using (var stream = new FileStream("credentials.json", FileMode.Open, FileAccess.Read)) { string credPath = System.Environment.GetFolderPath( System.Environment.SpecialFolder.Personal); credential = GoogleWebAuthorizationBroker.AuthorizeAsync( GoogleClientSecrets.Load(stream).Secrets, Scopes, "user", CancellationToken.None, new FileDataStore(credPath, true)).Result; Console.WriteLine("Credential file saved to: " + credPath); } // 创建Google Sheets API服务 var service = new SheetsService(new BaseClientService.Initializer() { HttpClientInitializer = credential, ApplicationName = ApplicationName, }); String spreadsheetId = "<ID>"; int sheetId = (int)service.Spreadsheets.Get(spreadsheetId).Execute().Sheets[0].Properties.SheetId; // -------------------------- 配置两个要互换的单元格位置 -------------------------- // 示例:互换G16(行索引15、列索引6,索引从0开始计数)和H16(行索引15、列索引7),可自行修改坐标 var cellARange = "G16"; var cellAGridPos = new GridRange() { SheetId = sheetId, StartColumnIndex = 6, StartRowIndex = 15, EndColumnIndex = 7, EndRowIndex = 16 }; var cellBRange = "H16"; var cellBGridPos = new GridRange() { SheetId = sheetId, StartColumnIndex = 7, StartRowIndex = 15, EndColumnIndex = 8, EndRowIndex = 16 }; // -------------------------- 读取两个单元格的完整数据 -------------------------- var getRequest = service.Spreadsheets.Get(spreadsheetId); getRequest.Ranges = new List<string>() { cellARange, cellBRange }; getRequest.IncludeGridData = true; var getResponse = getRequest.Execute(); CellData cellAData = getResponse.Sheets[0].Data[0].RowData[0].Values[0]; CellData cellBData = getResponse.Sheets[0].Data[1].RowData[0].Values[0]; // -------------------------- 同一次批量请求完成互换 -------------------------- var batchRequest = new BatchUpdateSpreadsheetRequest() { Requests = new List<Request>() { // 将B单元格内容写入A位置 new Request() { RepeatCell = new RepeatCellRequest() { Range = cellAGridPos, Cell = cellBData, Fields = "*" // 同步所有属性:值、格式、备注、公式等 } }, // 将A单元格内容写入B位置 new Request() { RepeatCell = new RepeatCellRequest() { Range = cellBGridPos, Cell = cellAData, Fields = "*" } } } }; service.Spreadsheets.BatchUpdate(batchRequest, spreadsheetId).Execute();
补充说明
如果不需要同步全部属性,可以将Fields = "*"替换为你需要的字段列表,例如userEnteredValue,note,userEnteredFormat就只会同步值、备注和格式,所有操作都在同一次批量请求中完成,接口只会调用一次,不会出现数据冲突问题。
内容的提问来源于stack exchange,提问作者Strawberry_Yogurt
相关产品推荐
相关产品推荐

