Update a Cell with C# and Sheets API v4

前端 未结 6 884
甜味超标
甜味超标 2020-12-15 18:33

Does anyone have a good C# example for updating a cell with the v4 API?

I have the get cell values c# example from the developer website working with Google Sheets A

相关标签:
6条回答
  • 2020-12-15 19:00

    For anyone else that finds this thread. I got the exception below:

    Exception Details: Google.GoogleApiException: Google.Apis.Requests.RequestError 'valueInputOption' is required but not specified [400] Errors [ Message['valueInputOption' is required but not specified] Location[ - ] Reason[badRequest] Domain[global]]

    Solved with:

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

    Source:

    https://stackoverflow.com/a/38841369/3850405

    However this caused my data to get a single quote (') before the value I entered, like this:

    After reading the documentation I saw that the examples used "valueInputOption": "USER_ENTERED":

    https://developers.google.com/sheets/api/samples/writing#write_to_multiple_ranges

    After switching to ValueInputOptionEnum.USERENTERED everything worked as expected.

    updateRequest.ValueInputOption = SpreadsheetsResource.ValuesResource.UpdateRequest.ValueInputOptionEnum.USERENTERED;
    
    0 讨论(0)
  • 2020-12-15 19:06

    First Create value range object like given below:

    Google.Apis.Sheets.v4.Data.ValueRange requestBody = new Google.Apis.Sheets.v4.Data.ValueRange();
    
    0 讨论(0)
  • 2020-12-15 19:07

    Here is a working example using a console to write a singe cell. Thank you everyone who assisted !!

    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 讨论(0)
  • 2020-12-15 19:11

    The file "Google.Apis.Sheets.v4.SpreadsheetsResource.cs" contains error: url "https://sheets.googleapis.com/v4/spreadsheets/{spreadsheetId}/values/{range}" not contains "?valueInputOption=RAW". Use this code temporarily:

    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 讨论(0)
  • 2020-12-15 19:18

    If you are using this tutorial https://developers.google.com/sheets/quickstart/dotnet Ensure you comment out the following line of code.

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

    Also this is what I used syntax wise and got it working.

    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 讨论(0)
  • 2020-12-15 19:19

    I think you just have access to read your sheet because I can see :

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

    Try to change "SheetsService.Scope.SpreadsheetsReadonly" by "SheetsService.Scope.Spreadsheet" or by "SheetsService.Scope.Drive". Maybe it's another syntax... If it's not a problem of authorization I can't help you, sorry... Good luck my friend.

    Ps: On Xcode (objective-c) you must reset the simulator after modification of scope. For you (C#) I don't know.

    0 讨论(0)
提交回复
热议问题