使用C#中的Sheets API访问标准电子表格函数

时间:2018-04-07 20:42:46

标签: c# google-sheets-api

我目前正在开发一个使用C#和.NET的小应用程序,我正在尝试使用图形界面模拟电子表格,同时在Google云端硬盘中更新电子表格。

我需要使用一些函数,我试图在文档中找到是否可以通过API访问本机函数,但是没有成功。我也试图做一个简单的黑客将函数作为字符串直接插入到单元格中,就像这样(对于列表的使用感到抱歉,我只是从另一个函数中复制它,我尝试同时填充多个单元格),

var valuesToAppend = new List<object>() { "=MAX(A1:A5)" };

然后我也通过了引号,这使它变得毫无用处。

可能是因为星期六和我的头脑没有正常工作,但我没有找到任何解决方案。是否有人知道我是否可以轻松访问这些方法,或者我是否需要走很长的路并实现这些功能并在本地进行计算?

编辑:为了澄清,我希望做的是在我的服务器的单元格中通过Sheets API插入类似= MAX(范围),= SUM(范围)的公式。

1 个答案:

答案 0 :(得分:2)

是的,你绝对可以这样做。您需要为更新请求指定ValueInputOptionUSERENTERED - 您可以请求在响应中获取单元格的内容(作为计算值)。

类似于:

var valueRange = new ValueRange { Values = new[] { new object[] { formula } } };
var request = service.Spreadsheets.Values.Update(valueRange, spreadsheetId, cell);
request.ValueInputOption = ValueInputOptionEnum.USERENTERED;
request.IncludeValuesInResponse = true;
request.ResponseValueRenderOption = ResponseValueRenderOptionEnum.UNFORMATTEDVALUE;
var response = request.Execute();
Console.WriteLine($"Result: {response.UpdatedData.Values[0][0]}");

以下是包含该代码的完整示例:

using Google.Apis.Auth.OAuth2;
using Google.Apis.Services;
using Google.Apis.Sheets.v4;
using Google.Apis.Sheets.v4.Data;
using System;
using System.IO;
using System.Threading;
using static Google.Apis.Sheets.v4.SpreadsheetsResource.ValuesResource.UpdateRequest;

class Program
{
    static void Main(string[] args)
    {
        // Set-up part...
        if (args.Length != 4)
        {
            Console.WriteLine("Required values: <client secrets file> <spreadsheet-ID> <cell> <formula>");
            Console.WriteLine("Example: <secrets.json> <sheet ID> E1 =MAX(A1:D1)");
            return;
        }
        var secretsFile = args[0];
        var spreadsheetId = args[1];
        var cell = args[2];
        var formula = args[3];

        var secrets = File.ReadAllBytes(secretsFile);

        // Don't usually use Task<T>.Result, but this is just a demo console app...
        // we shouldn't have any deadlock worries.
        var credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
            new MemoryStream(secrets),
            new[] { SheetsService.Scope.Spreadsheets },
            "user", // Key in file store
            CancellationToken.None).Result;

        var service = new SheetsService(new BaseClientService.Initializer
        {
            HttpClientInitializer = credential,
            ApplicationName = "Google Sheets API demo"
        });

        // Interesting bit :)
        var valueRange = new ValueRange { Values = new[] { new object[] { formula } } };
        var request = service.Spreadsheets.Values.Update(valueRange, spreadsheetId, cell);
        // Pretend we're a user typing in this value...
        request.ValueInputOption = ValueInputOptionEnum.USERENTERED;
        // Get the computed value back in the response
        request.IncludeValuesInResponse = true;
        // Retrieve the value unformatted (so as a number in the JSON)
        // rather than either the uncomputed value, or the formatted value as a string
        request.ResponseValueRenderOption = ResponseValueRenderOptionEnum.UNFORMATTEDVALUE;
        var response = request.Execute();
        Console.WriteLine($"Result: {response.UpdatedData.Values[0][0]}");
    }
}