I have followed the entire API for document list (for creating spreadhseet) and spreadsheet (for creating worksheet and adding rows). However, I am able to add a worksheet to a spreadhseet after its creation, but when i try to add the row, i get the error excpetion: Execution of request failed: https://spreadsheets.google.com/feeds/list/tj0pIc6qpEB2LtZY9mwfT-A/od6/private/full
I have mentioned all the OAuth scopes and required credentials, but unable to solve this exception. The rest of things are working fine like creation of google spreadsheet and adding a worksheet too. I am just copy pasting the google code.
// setUp the confirguration for OAuth 2.0
string clientID = "********.apps.googleusercontent.com";
string clientSecret = "*******************";
string scope = "https://docs.google.com/feeds/ https://docs.googleusercontent.com/ https://spreadsheets.google.com/feeds/";
string redirectURI = "urn:***:wg:oauth:2.0:oob";
// setup the OAuth 2.0 object
OAuth2Parameters parameters = new OAuth2Parameters(); // to hold all the parameters
parameters.ClientId = clientID; // setup the clientID
parameters.ClientSecret = clientSecret; // setup the clientSecret
parameters.RedirectUri=redirectURI; // setup the redirectURI
//setup the authurization URL
parameters.Scope = scope; // set the scope
string authorizationURL = OAuthUtil.CreateOAuth2AuthorizationUrl(parameters);
Console.WriteLine(authorizationURL);
Console.WriteLine("Please visit the URL above to authorize your OAuth " + "request token. Once that is complete, type in your access code to "
+ "continue...");
parameters.AccessCode = Console.ReadLine();
// get the access token
OAuthUtil.GetAccessToken(parameters);
string accessToken = parameters.AccessToken;
Console.WriteLine("Cosole Access token " + accessToken);
//make Auth Request to Google
GOAuth2RequestFactory factory = new GOAuth2RequestFactory(null, "SampleSpreadSheetApp-V1", parameters);
// DocumentsService service = new DocumentsService("SampleSpreadSheetApp-V1");
service.RequestFactory = factory;
//---------------------------------------------------------------------
GOAuth2RequestFactory requestFactory =
new GOAuth2RequestFactory(null, "MySpreadsheetIntegration-v1", parameters);
SpreadsheetsService service = new SpreadsheetsService("MySpreadsheetIntegration-v1");
service.RequestFactory = requestFactory;
SpreadsheetQuery query = new SpreadsheetQuery();
SpreadsheetFeed feed = service.Query(query);
if (feed.Entries.Count == 0)
{
Console.WriteLine("no spreadsheets present here");
}
// TODO: Choose a spreadsheet more intelligently based on your
// app's needs.
SpreadsheetEntry spreadsheet = (SpreadsheetEntry)feed.Entries[0];
Console.WriteLine(spreadsheet.Title.Text);
// Get the first worksheet of the first spreadsheet.
// TODO: Choose a worksheet more intelligently based on your
// app's needs.
WorksheetFeed wsFeed = spreadsheet.Worksheets;
WorksheetEntry worksheet = (WorksheetEntry)wsFeed.Entries[0];
if (wsFeed.Entries.Count == 0)
{
Console.WriteLine("no worksheets present here");
}
// Define the URL to request the list feed of the worksheet.
AtomLink listFeedLink = worksheet.Links.FindService(GDataSpreadsheetsNameTable.ListRel, null);
// Fetch the list feed of the worksheet.
ListQuery listQuery = new ListQuery(listFeedLink.HRef.ToString());
ListFeed listFeed = service.Query(listQuery);
// Create a local representation of the new row.
ListEntry row = new ListEntry();
row.Elements.Add(new ListEntry.Custom() { LocalName = "firstname", Value = "Joe" });
row.Elements.Add(new ListEntry.Custom() { LocalName = "lastname", Value = "Smith" });
row.Elements.Add(new ListEntry.Custom() { LocalName = "age", Value = "26" });
row.Elements.Add(new ListEntry.Custom() { LocalName = "height", Value = "176" });
// Send the new row to the API for insertion.
service.Insert(listFeed, row);
I also struggled with this and I've found the following:
Each column has a name that is specified in the first row. In Google API example the first column is 'firstname' and it is indicated in cell A1 of an existing worksheet.
When you're adding rows (like in the example code you pasted above) the 'LocalName' property must exactly match. Also the API lower-cases and removes spaces from the column name (God knows why??), so if you define your column name as 'Name' the API will lower case it to 'name' and try to match to it. So when you add a row you need to define in your code the column name in lower-case, no spaces.
Just to be on the safe side create a worksheet with one column and set the first row cell to be 'name'. Now run the example code with your authentication and try to add a row with only one entry, like so:
ListEntry row = new ListEntry();
row.Elements.Add(new ListEntry.Custom() { LocalName = "name", Value = "John" });
And this will not work
row.Elements.Add(new ListEntry.Custom() { LocalName = "Name", Value = "John" });
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With