2016-05-26 17 views
5

Czy ktoś ma dobry przykład C# do aktualizacji komórki za pomocą interfejsu API V4?Google Sheets API v4 C# aktualizacja komórki

Mam pobrać wartość komórki C# przykład ze strony programisty współpracującej z Google Sheets API v4. Próbuję zmodyfikować przykład, aby zaktualizować komórkę o wartości "Tom". Utknąłem w ustawieniach dla 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); 


     } 
    } 
} 

Odpowiedz

0

myślę, że po prostu mieć dostęp do odczytu arkusz bo widzę:

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

Spróbuj zmienić „SheetsService.Scope.SpreadsheetsReadonly” przez „SheetsService.Scope.Spreadsheet” lub " SheetsService.Scope.Drive ". Może to inna składnia ... Jeśli to nie jest problem autoryzacji, nie mogę ci pomóc, przepraszam ... Powodzenia, mój przyjacielu.

Ps: Na Xcode (cel-c) należy zresetować symulator po modyfikacji zakresu. Dla ciebie (C#) Nie wiem.

+0

Masz rację, zdecydowanie nie byłbyś tylko do odczytu. Zmieniłem na "SheetsService.Scope.Spreadsheet". – Slim

+0

Utknąłem na składni dla Arkuszy kalkulacyjnych. Values.Update (<< co tu jest? >>, spreadsetetId, zakres); Parametry "spreadsheetId" i "range" są ciągami, podczas gdy pierwszy paremeter jest wymieniany jako "body". – Slim

0

Plik "Google.Apis.Sheets.v4.SpreadsheetsResource.cs" zawiera błąd: url "https://sheets.googleapis.com/v4/spreadsheets/ {spreadsheetId}/values ​​/ {range}" nie zawiera "? ValueInputOption = RAW". Użyj tego kodu tymczasowo:

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

Jeśli używasz tego samouczka https://developers.google.com/sheets/quickstart/dotnet Upewnij wykomentuj następującą linię kodu.

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

Również to użyłem składni i sprawiłem, że działa.

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

Dziękujemy! To sprawiło, że działało! – Slim

9

Oto przykład pracy z użyciem konsoli do napisania pojedynczej komórki. Dziękuję wszystkim, którzy pomagali !!

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

działa to dobrze, ale jak to się dzieje, aby być częścią BatchUpdate? tj. jeśli chciałbym zaktualizować 2 zakresy (nazwane) w jednym zapytaniu, w jaki sposób miałbym to zrobić? – mcmillab

+0

Witaj @Slim, To rozwiązanie pomogło mi, ale chcę rozwiązania, które tworzy plik na googleDrive Czy możesz mi pomóc! –

Powiązane problemy