我已经跟踪了整个API的文档列表(用于创建spreadhseet)和电子表格(用于创建工作表和添加行)。 但是,我可以在创建后将一个工作表添加到spreadhseet,但是当我尝试添加该行时,我会收到错误消息:执行请求失败:https://spreadsheets.google.com/feeds/list/tj0pIc6qpEB2LtZY9mwfT-A/od6/private/full
我已经提到了所有OAuth范围和所需的凭据,但无法解决此异常。 剩下的工作正常,比如创建谷歌电子表格和添加工作表。 我只是复制粘贴谷歌代码。
// 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);
答案 0 :(得分:9)
我也很努力,我发现了以下内容:
每列都有一个在第一行中指定的名称。 在Google API示例中,第一列是“firstname”,它在现有工作表的单元格A1中指示。
当您添加行时(如上面粘贴的示例代码中),“LocalName”属性必须完全匹配。 还有API小写并从列名中删除空格(天知道为什么??),所以如果你将列名定义为'Name',API会将其小写为'name'并尝试匹配它。 因此,当您添加行时,您需要在代码中定义小写的列名,不能为空格。
为了安全起见,创建一个包含一列的工作表,并将第一行单元格设置为'name'。 现在使用您的身份验证运行示例代码,并尝试添加只有一个条目的行,如下所示:
ListEntry row = new ListEntry();
row.Elements.Add(new ListEntry.Custom() { LocalName = "name", Value = "John" });
这不起作用
row.Elements.Add(new ListEntry.Custom() { LocalName = "Name", Value = "John" });
答案 1 :(得分:2)
您需要首先创建/确保工作表的标题行:
CellQuery cellQuery = new CellQuery(worksheet.CellFeedLink);
CellFeed cellFeed = service.Query(cellQuery);
CellEntry cellEntry = new CellEntry(1, 1, "firstname");
cellFeed.Insert(cellEntry);
cellEntry = new CellEntry(1, 2, "lastname");
cellFeed.Insert(cellEntry);
cellEntry = new CellEntry(1, 3, "age");
cellFeed.Insert(cellEntry);
cellEntry = new CellEntry(1, 4, "height");
cellFeed.Insert(cellEntry);
答案 2 :(得分:1)
正如文档中所报告的,列表提要对数据在电子表格中的布局方式做了一些假设。特别是,列表提要将工作表的第一行视为标题行:
https://developers.google.com/google-apps/spreadsheets/#working_with_list-based_feeds
在您的代码中,您尝试添加一个包含四个值的行:firstname,lastname,age和height。如果工作表的第一行没有定义这些标题,那么您的请求将无效,您的代码将抛出异常。
如果您需要动态确定标题行的内容,请确保您的代码与电子表格的结构相匹配或使用单元格Feed。
答案 3 :(得分:1)
在敲了几个小时之后,我发现Google API似乎有一个错误。如果工作表底部有空行,添加行可以正常工作,并且API会返回适当的响应。但是,如果工作表底部没有空白行,那么您的数据会正确且正确地添加到工作表底部的新行中,但Google仍然会返回包含“空行不能为空”的文本的HTTP 400错误写的。“
您可以通过捕获错误来解决此错误,检查错误是否为“空行”类型,如果是,则使用listfeed查询来检索刚刚添加的行。如果该查询成功,则正确添加新行,并且可以忽略400错误
我会给你我的代码,但我在使用PHP,所以可能没用。