2016-05-26 229 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上創建文件 你能幫我! –

相關問題