【问题标题】:In C# how do I go through a Google Sheets document and write into a specific cell在 C# 中,我如何浏览 Google 表格文档并写入特定单元格
【发布时间】:2020-11-20 10:01:01
【问题描述】:

按照教程,我已经设置了 Google Sheets Api v4 需要设置的所有内容。在我的 Google 表格文档中,我在第一列中有学生的姓名,在我的第二列中我想输入他们的 GPA。在我的代码中,我创建了两个用户输入的变量,string namestring gpa。我想浏览 A 列,查找该名称并在其旁边插入该 GPA。我知道我可能应该使用 for 循环来遍历列,并将每个单元格与用户键入的字符串进行比较,但到目前为止我没有尝试过任何工作。

我写了一个可以获取条目的简单方法,现在它只打印但可以轻松更改:

static void ReadEntries() 
    {
        var range = $"{sheet}!A1:F10";
        var request = service.Spreadsheets.Values.Get(SpreadsheetId, range);

        var response = request.Execute();
        var values = response.Values;

        if(values != null && values.Count > 0) 
        {
            foreach(var row in values) 
                {
                    Console.WriteLine("{0} | {1}", row[0], row[1]);
                }
        }
        else 
            {
                Console.WriteLine("No data found");
            }
    }

以及可以更新特定单元格的方法:

static void UpdateEntry() 
    { 
        var range = $"{sheet}!B2"; //example
        var valueRange = new ValueRange();

        var objectList = new List<object>() { "updated" };
        valueRange.Values = new List<List<object>> { objectList };

        var updateRequest = service.Spreadsheets.Values.Update(valueRange, SpreadsheetId, range);
        updateRequest.ValueInputOption = SpreadsheetsResource.ValuesResource.AppendRequest.ValueInputOptionEnum.USERENTERED;
        var updateResponse = updateRequest.Execute();
    }

编辑:我需要帮助来制作一个 for 循环来遍历我的 A 列并找到同名的学生。我知道如何更新单元格。我只是不知道如何找到需要更新的单元格。

【问题讨论】:

  • 这能回答你的问题吗? Update a Cell with C# and Sheets API v4
  • 不。他们已经知道要更新哪个单元格。我不。我需要循环遍历我的 A 列,以查看 B 列中的哪个单元格需要更新。

标签: c# visual-studio google-sheets google-sheets-api


【解决方案1】:

听起来你们很亲密。您已经在循环中的 row[0] 中找到了要搜索的值,因此您只需通过循环跟踪行号。

if (values != null && values.Count > 0)
{
    int rowNo =0;
    foreach (var row in values)
    {
        rowNo ++;
        Console.WriteLine("{0} | {1}", row[0], row[1]);
     
        if (row[0].ToString() == "John")
        {
             string rangeToUpdate = $"{sheet}!B{rowNo}:B{rowNo}";
             ...  
        }
    }
}

您还可以从使用 foreach 更改为标准 for 循环。

【讨论】:

  • 这似乎正是我正在寻找的。我会尽快测试它。比你好多了!!
【解决方案2】:

我对 Sheets API 的 .NET 客户端库没有经验。

但是,在将 Sheets API 与 node 和 python 客户端库一起使用后,我可以将您指向 the documentation you should follow。这是官方 API 文档,每种语言的代码示例都有 Google 提供的客户端库。

例如,这里是您使用的 spreadsheets.values.update 文档,以及 C# 的代码示例。

那么问题来了:

  • 根据json representation of a ValueRange,ValueRange.Range 似乎不是可选的,即使它是多余的。您可能需要在代码中添加ValueRange.Range = range;

  • 另外,您在 ValueInputOption 的定义中使用 SpreadsheetsResource.ValuesResource.AppendRequest 而不是 SpreadsheetsResource.ValuesResource.UpdateRequest

如果有帮助请告诉我!

更新 这似乎也是Update a cell with C# and Sheets API V4的副本

【讨论】:

  • 使用 C# 链接更新单元格的问题是他们已经知道他需要更新哪个单元格(在他们的情况下为 F5)。我的问题是我不知道如何找到我需要的单元格。假设我想找一个名叫约翰的学生。约翰在文档的某处,在 A 列,但我不知道是哪一行。我需要在整个 A 中循环寻找“John”。我需要类似 for(...) { if(row[x][y] == "John) { update()
  • 这个for循环必须进入你的“get”函数。你想找到索引 x, y 其中 row[x][y] == "John"。完成后,您可以从这些索引和 update() 中制作一个范围。相对于“John”,要更新的单元格可能是 [x, y + 1] 或 [x + 1, y],但关键是您确实知道。
猜你喜欢
  • 1970-01-01
  • 2014-08-31
  • 1970-01-01
  • 2012-08-12
  • 1970-01-01
  • 1970-01-01
  • 2020-05-24
  • 1970-01-01
  • 2020-12-26
相关资源
最近更新 更多