You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Google Sheets API完整复制单元格全部数据(含文本、备注)

问题原因

你当前代码丢失文本和备注的核心原因是RepeatCellRequest的Fields参数仅配置了UserEnteredFormat,该配置只会同步单元格的用户自定义格式,不会同步单元格内容、公式、备注等其他数据。同时你读取单元格的代码存在语法问题,RowData[0].Values返回的是单元格数组,你需要取下标[0]拿到单个单元格的CellData对象。

解决方案

你可以在同一次BatchUpdate请求中完成两个单元格的完整内容互换,不需要多次调用接口,操作步骤如下:

  1. 分别读取两个目标单元格的完整CellData(包含值、格式、备注等所有属性)
  2. 在Fields参数中指定要复制的所有字段,直接填*即可同步单元格的全部属性
  3. 在同一个批量请求中添加两个更新操作,将两个单元格的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 00:27:05