2016-05-26 275 views
5

有没有人有一个很好的C#用v4 API更新单元的例子?Google Sheets API v4 C#更新单元

我从使用Google Sheets API v4的开发人员网站获取单元格值c#示例。我试图修改这个例子来更新一个值为“Tom”的单元格。我被困在SpreadSheets.Values.Update的设置中。

using Google.Apis.Auth.OAuth2; 
using Google.Apis.Sheets.v4; 
using Google.Apis.Sheets.v4.Data; 
using Google.Apis.Services; 
using Google.Apis.Util.Store; 
using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Text; 
using System.Threading; 
using System.Threading.Tasks; 

namespace GoogleSheetsAPI4_v1console 
    { 
    class Program 
    { 
     // If modifying these scopes, delete your previously saved credentials 
     // at ~/.credentials/sheets.googleapis.com-dotnet-quickstart.json 
     static string[] Scopes = { SheetsService.Scope.Spreadsheet }; 
     static string ApplicationName = "TestSpreadsheet"; 

     static void Main(string[] args) 
     { 
      UserCredential credential; 

      using (var stream = 
       new FileStream("client_secret.json", FileMode.Open, FileAccess.Read)) 
      { 
       string credPath = System.Environment.GetFolderPath(
        System.Environment.SpecialFolder.Personal); 
       credPath = Path.Combine(credPath, ".credentials/sheets.googleapis.com-dotnet-quickstart.json"); 

       credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
        GoogleClientSecrets.Load(stream).Secrets, 
        Scopes, 
        "user", 
        CancellationToken.None, 
        new FileDataStore(credPath, true)).Result; 
       Console.WriteLine("Credential file saved to: " + credPath); 
      } 

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


      // Define request parameters. 
      String spreadsheetId = "<<myspreadsheetid>>"; 
      String range = "Sheet1!D5"; // single cell D5 
      String myNewCellValue = "Tom"; 
      SpreadsheetsResource.ValuesResource.UpdateRequest request = service.Spreadsheets.Values.Update(<<what goes here?>>, spreadsheetId, range); 

      // Prints the names and majors of students in a sample spreadsheet: 
      // https://docs.google.com/spreadsheets/d/1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms/edit 
      ValueRange response = request.Execute(); 
      IList<IList<Object>> values = response.Values; 
      Console.WriteLine(values); 


     } 
    } 
} 

回答

0

我认为你有机会阅读你的表,因为我可以看到:

static string[] Scopes = { SheetsService.Scope.SpreadsheetsReadonly };

尝试通过“SheetsService.Scope.Spreadsheet”改变“SheetsService.Scope.SpreadsheetsReadonly”或者“ SheetsService.Scope.Drive”。也许这是另一种语法......如果它不是授权问题,我不能帮助你,对不起...祝你好运我的朋友。 Ps:在Xcode(objective-c)上,您必须在修改范围后重置模拟器。对于你(C#)我不知道。

+0

你是对的,绝对不会是只读的。我已更改为“SheetsService.Scope.Spreadsheet”。 – Slim

+0

我被困在Spreadsheets.Values.Update(<< what's here?>>,spreadsheetId,range)的语法中; 参数'spreadsheetId'和'range'是字符串,而第一个参数被列为需要成为'body'。 – Slim

0

文件“Google.Apis.Sheets.v4.SpreadsheetsResource.cs”包含错误:url“https://sheets.googleapis.com/v4/spreadsheets/ {spreadsheetId}/values/{range}”not contain“?valueInputOption = RAW”。如果你正在使用本教程 https://developers.google.com/sheets/quickstart/dotnet

String spreadsheetId = "rihhgfkjhgufhgHUGUJKGHUItgUIGUIgui"; 
String range = "Config!A2:E"; 
ValueRange valueRange=new ValueRange(); 
valueRange.Range = range; 
valueRange.MajorDimension = "ROWS";//"ROWS";//COLUMNS 
var oblist=new List<object>(){12,3,4,5u,6}; 
valueRange.Values = new List<IList<object>> {oblist}; 

var url = "https://sheets.googleapis.com/v4/spreadsheets/{spreadsheetId}/values/{range}?valueInputOption=RAW".Replace("{spreadsheetId}",spreadsheetId).Replace("{range}", HttpUtility.UrlEncode(range)); 

JObject json = null; 
using (var client = new WebClient()) 
{ 
    client.Headers.Set("Authorization", "Bearer " + credential.Token.AccessToken); 
    client.Headers.Set(HttpRequestHeader.AcceptEncoding, "gzip, deflate"); 
    client.Headers.Set(HttpRequestHeader.UserAgent, "myprogram database updater google-api-dotnet-client/1.13.1.0 (gzip)"); 
    ServicePointManager.Expect100Continue = false; 
    var jsonstr = JsonConvert.SerializeObject(valueRange); 
    var jsontemp = JObject.Parse(jsonstr); 
    jsontemp.Remove("ETag"); 
    jsonstr = jsontemp.ToString(); 
    try 
    { 
     var res = client.UploadString(url, "PUT", jsonstr); 
     json = JObject.Parse(res); 
    } 
    catch (Exception) 
    { 


    } 
} 
0

确保您注释掉的代码下面一行:使用此代码是暂时的。

credPath = Path.Combine(credPath, ".credentials/sheets.googleapis.com-dotnet-quickstart.json"); 

这也是我使用语法明智,并得到它的工作。

String spreadsheetId2 = "<put yours here>"; 
String range2 = "<againyours>!F5"; 
ValueRange valueRange = new ValueRange(); 
valueRange.MajorDimension = "COLUMNS";//"ROWS";//COLUMNS 

var oblist = new List<object>() { "ello" }; 
valueRange.Values = new List<IList<object>> { oblist }; 

SpreadsheetsResource.ValuesResource.UpdateRequest update = service.Spreadsheets.Values.Update(valueRange, spreadsheetId2, range2); 
update.ValueInputOption = SpreadsheetsResource.ValuesResource.UpdateRequest.ValueInputOptionEnum.RAW; 
UpdateValuesResponse result2 = update.Execute(); 
+0

谢谢!这使它工作! – Slim

9

这是一个使用控制台编写单节单元的工作示例。谢谢大家谁协助!

using Google.Apis.Auth.OAuth2; 
using Google.Apis.Sheets.v4; 
using Google.Apis.Sheets.v4.Data; 
using Google.Apis.Services; 
using Google.Apis.Util.Store; 
using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Text; 
using System.Threading; 
using System.Threading.Tasks; 

namespace GoogleSheetsAPI4_v1console 
{ 
    class Program 
    { 
     // If modifying these scopes, delete your previously saved credentials 
     // at ~/.credentials/sheets.googleapis.com-dotnet-quickstart.json 
     static string[] Scopes = { SheetsService.Scope.Spreadsheets}; // static string[] Scopes = { SheetsService.Scope.SpreadsheetsReadonly }; 
     static string ApplicationName = "<MYSpreadsheet>"; 

     static void Main(string[] args) 
     { 
      UserCredential credential; 

      using (var stream = 
       new FileStream("client_secret.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); 
      } 

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



      String spreadsheetId2 = "<my spreadsheet ID>"; 
      String range2 = "<my page name>!F5"; // update cell F5 
      ValueRange valueRange = new ValueRange(); 
      valueRange.MajorDimension = "COLUMNS";//"ROWS";//COLUMNS 

      var oblist = new List<object>() { "My Cell Text" }; 
      valueRange.Values = new List<IList<object>> { oblist }; 

      SpreadsheetsResource.ValuesResource.UpdateRequest update = service.Spreadsheets.Values.Update(valueRange, spreadsheetId2, range2); 
      update.ValueInputOption = SpreadsheetsResource.ValuesResource.UpdateRequest.ValueInputOptionEnum.RAW; 
      UpdateValuesResponse result2 = update.Execute(); 

      Console.WriteLine("done!"); 

     } 
    } 
} 
+0

这个效果很好,但它是如何转化为BatchUpdate的一部分?即如果我想在一个请求中更新2个(命名的)范围,我该怎么做? – mcmillab

+0

你好@Slim, 这个解决方案帮了我,但我想任何解决方案,在googleDrive上创建文件 你能帮我! –

相关问题