2016-12-28 47 views
3

我有两种方法。一种是从Google Sheets中读取数据,另一种是给单个单元格添加一个值(但我实际上想将数据附加到最后一行,但是,我将首先以1条记录开始)。 btnLoadAttendance完美工作,但当我在textbox1.Text中输入内容时,在“UpdateValuesResponse result2 = update.Execute();”我得到一个错误,像这样:请求的认证范围不足。 [403] c#

Request had insufficient authentication scopes. [403] 

我发现这里的答案“Request had insufficient authentication scopes [403] when update cell spreadsheet”,说有关评论一些行。我尝试评论该行,但它不适合我。我仍然得到同样的错误。下面是我的代码:

WORKING

private void btnLoadAttendance_Click(object sender, EventArgs e) 
    { 
      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); 
      } 

      var service = new SheetsService(new BaseClientService.Initializer() 
      { 
       HttpClientInitializer = credential, 
       ApplicationName = ApplicationName, 
      }); 

      String spreadsheetId = "1b64mhUgdeRzGyJF4NfAPhkFY7br3c0o9rJ9mMnDBTR8"; 
      String range = "Sheet1!A2:D"; 
      SpreadsheetsResource.ValuesResource.GetRequest request = 
        service.Spreadsheets.Values.Get(spreadsheetId, range); 

      ValueRange response = request.Execute(); 
      IList<IList<Object>> values = response.Values; 
      if (values != null && values.Count > 0) 
      { 
       foreach (var x in values) 
       { 

        dgvAttendance.Rows.Add(x[0], x[1], x[2], x[3]); 
       } 
      } 
      else 
      { 
       MessageBox.Show("No data found."); 
      } 
     } 

不工作

private void btnAddData_Click(object sender, System.EventArgs e) 
     { 
      string[] Scopes = { SheetsService.Scope.SpreadsheetsReadonly }; 
      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); 
      } 

      var service = new SheetsService(new BaseClientService.Initializer() 
      { 
       HttpClientInitializer = credential, 
       ApplicationName = ApplicationName, 
      }); 

      String spreadsheetId = "1b64mhUgdeRzGyJF4NfAPhkFY7br3c0o9rJ9mMnDBTR8/edit"; 
      String range = "Sheet1!F5"; // update the F5 cell 

      //ValueRange response = request.Execute(); 
      ValueRange valueRange = new ValueRange(); 
      valueRange.MajorDimension = "COLUMNS"; //Rows or Columns 

      var oblist = new List<object>() { textBox1.Text }; 
      valueRange.Values = new List<IList<object>> { oblist }; 

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

你的帮助是非常赞赏。

回答

2

我只是在我需要的

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

改变

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

我花了一整天!

+0

你也拯救了我的生命。 –

2
  1. 首先删除证书文件.credentials存储在C/sheets.googleapis.com-DOTNET-quickstart.json:\用户\ Documents.credentials。
  2. 更改用于从

    string[] Scopes = { SheetsService.Scope.SpreadsheetsReadonly }; 从谷歌电子表格读取单元范围变量

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

  3. 的代码执行后,API将再次进行身份验证,然后问题将得到解决。