4

我已經按照文檔列表(用於創建spreadhseet)和電子表格(用於創建工作表和添加行)的整個API。 但是,我能夠在創建後到工作表添加到等試算表,但是當我嘗試添加該行,我得到的錯誤錯誤時拋出:執行的請求失敗:https://spreadsheets.google.com/feeds/list/tj0pIc6qpEB2LtZY9mwfT-A/od6/private/full在向Google電子表格添加行時出現異常

我所提到的所有的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

如果在異常細節深入,你會發現完整的錯誤信息,告訴您請求失敗的原因。作爲替代方法,嘗試使用Fiddler捕獲HTTP流量並檢查響應的詳細信息 –

+0

在內部異常下拉菜單中,它表示{「遠程服務器返回了一個錯誤:(400)錯誤請求。」}作爲響應,StatusCode作爲System .Net.HttpStatusCode.BadRequest。這是谷歌服務器錯誤,或者我錯過了什麼? – Vacca

+0

我甚至嘗試過在電子表格上手動編寫行後刪除和行更新,但只在電子表格API上添加行功能不工作,我不認爲他們似乎是我的代碼中的任何錯誤,因爲行更新,刪除工作正常。迴應字符串是:我們'對不起,發生服務器錯誤。請稍等,然後嘗試重新加載電子表格。 - – Vacca

回答

1

正如文檔中所報告的那樣,列表提要對數據在電子表格中的佈局做了一些假設。特別是,該列表飼料對待工作表的第一行作爲標題行:

https://developers.google.com/google-apps/spreadsheets/#working_with_list-based_feeds

在你的代碼嘗試添加一排四個值:名字,姓氏,年齡和身高。如果工作表的第一行未定義這些標頭,則您的請求將無效,並且您的代碼會引發異常。

請確保您的代碼與電子表格的結構匹配,或者如果您需要動態確定標題行的內容,請使用單元源。

+0

你好, 根據你的文章,我修改了我的電子表格工作表的結構,而它的創建。但是,我仍然得到相同的錯誤。或許,如果我手動添加標題行,然後添加行(如在文檔中) ,那麼它會成功添加該行。但這是完全錯誤的,因爲我在創建工作表後無法手動插入標題行。在編程方面,流程應爲 1.創建電子表格2.添加工作表3.添加一行到工作表。我無法手動添加標題列! 請指定我是否做錯了或者是API的構建方式? – Vacca

+0

即使我試圖實現細胞飼料,我沒有發現像在細胞中添加值的任何內容,它只改變發現匹配時細胞值發生變化的細胞內容。你能指定如何添加一個單元格(首先是標題行)。 Thankx提前作出及時迴應。 – Vacca

+0

當使用單元格源時,單元格不會「添加」,因爲它們已經存在於電子表格中。使用該飼料,你可以改變任何單元格的值,包括第一行 –

9

我也掙扎着這一點,我已經找到了以下內容:

每列都有其第一行中指定的名稱。 在Google API示例中,第一列是'firstname',它在現有工作表的單元格A1中指示。

當您添加行時(如上面粘貼的示例代碼),'LocalName'屬性必須完全匹配。 此外,API的小寫字母並從列名稱中刪除空格(上帝知道爲什麼??),所以如果您將列名稱定義爲「名稱」,則API將小寫爲「名稱」並嘗試與其匹配。 所以當你添加一行時,你需要在你的代碼中定義小寫字母的列名,沒有空格。

爲了安全起見,創建一個帶有一列的工作表並將第一行單元格設置爲'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

此外,它似乎數字(例如,「1」)不能用作列名稱 –

+0

並且該下劃線將從列標題和空格中除去 –

+0

也以Java版本進行驗證。注意「columnname:」似乎也沒有工作,所以小寫沒有特殊字符的名稱是最佳的 –

1

敲我的頭在這幾個小時後, ,我發現Google API似乎有一個錯誤。如果工作表底部有空白行,則添加一行可以正常工作,API將返回適當的響應。但是,如果工作表底部沒有空白行,則會將數據正確,正確地添加到工作表底部的新行中,但Google仍會返回HTTP 400錯誤,其中包含文本「Blank rows can not be書面。」
您可以通過捕獲錯誤來檢查錯誤,檢查錯誤是否爲「空行」種類,如果是,則使用listfeed查詢來檢索剛剛添加的行。如果該查詢成功,則新行被正確添加並且可以忽略400錯誤。
我會給你我的代碼,但我正在使用PHP,所以可能沒有幫助。

+0

我浪費了這個日子,然後我找到了這個答案,謝謝 – AlwaysTraining

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); 
+0

使用CellEntry是好的,但後來使用ListEntry不工作我 –

相關問題