在 C# 中使用 Sheets API 访问标准电子表格函数
Access standard spreadsheet functions with Sheets API in C#
我目前正在使用 C# 和 .NET 开发一个小型应用程序,我在其中尝试使用图形界面模拟电子表格,同时在 Google Drive 中更新电子表格。
我需要使用一些功能,我试图在文档中查找是否可以通过 API 访问本机功能,但没有成功。我还尝试做一个简单的 hack,将函数作为字符串直接插入单元格,就像这样(抱歉使用列表,我只是从另一个函数复制它,我尝试同时填充多个单元格),
var valuesToAppend = new List<object>() { "=MAX(A1:A5)" };
但后来我也通过了引号使其无用。
可能是周六,脑子不太灵,一直没找到解决办法。有没有人知道我是否可以轻松访问这些方法,或者我是否需要走很远的路来实现功能并在本地进行计算?
编辑:澄清一下,我希望做的是通过表格 API.[=12= 在我服务器的单元格中插入像 =MAX(range), =SUM(range) 这样的公式]
是的,你绝对可以做到。您需要为更新请求指定 ValueInputOption
为 USERENTERED
- 您可以请求在响应中返回单元格的内容(作为计算值)。
所以像这样:
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]}");
}
}
我目前正在使用 C# 和 .NET 开发一个小型应用程序,我在其中尝试使用图形界面模拟电子表格,同时在 Google Drive 中更新电子表格。
我需要使用一些功能,我试图在文档中查找是否可以通过 API 访问本机功能,但没有成功。我还尝试做一个简单的 hack,将函数作为字符串直接插入单元格,就像这样(抱歉使用列表,我只是从另一个函数复制它,我尝试同时填充多个单元格),
var valuesToAppend = new List<object>() { "=MAX(A1:A5)" };
但后来我也通过了引号使其无用。
可能是周六,脑子不太灵,一直没找到解决办法。有没有人知道我是否可以轻松访问这些方法,或者我是否需要走很远的路来实现功能并在本地进行计算?
编辑:澄清一下,我希望做的是通过表格 API.[=12= 在我服务器的单元格中插入像 =MAX(range), =SUM(range) 这样的公式]
是的,你绝对可以做到。您需要为更新请求指定 ValueInputOption
为 USERENTERED
- 您可以请求在响应中返回单元格的内容(作为计算值)。
所以像这样:
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]}");
}
}