Невозможно получить доступ к таблицам Google с помощью ключа api

Невозможно получить доступ к таблицам Google с использованием клиентской библиотеки v4 .net, в частности, с использованием методов обновления и добавления.

get методы работают нормально, я могу читать значения с листа. но когда я пытаюсь обновить или добавить, я получаю как

Google.GoogleApiException: 'Google.Apis.Requests.RequestError Request is missing required authentication credential. Expected OAuth 2 access token, login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project. [401] Errors [ Message[Request is missing required authentication credential. Expected OAuth 2 access token, login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.] Location[ - ] Reason[unauthorized] Domain[global] ] '

Я запускаю оба кода, используя ту же инициализацию службы, но получаю сообщение об ошибке.

вот код

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 SheetsQuickstart
{
    class Program
    {
        // If modifying these scopes, delete your previously saved credentials
    // at ~/.credentials/sheets.googleapis.com-dotnet-quickstart.json
    static string[] Scopes = { SheetsService.Scope.SpreadsheetsReadonly };
    static string ApplicationName = "Google Sheets API .NET Quickstart";
    static String spreadsheetId = "{{SpreadSheet_ID}}";
    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);
            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);
        }
        */
        // Create Google Sheets API service.
        var service = new SheetsService(new BaseClientService.Initializer()
        {
            //HttpClientInitializer = credential,
            ApplicationName = ApplicationName,
            ApiKey = "{{API_KEY}}",
        }
        );



        // Define request parameters.

        String range = "A2:E";
        //get request / for reading
        SpreadsheetsResource.ValuesResource.GetRequest request = service.Spreadsheets.Values.Get(spreadsheetId, range);
        IList<IList<Object>> val = GenerateData();
        string newRange = GetRange(service);

        //append request 
        SpreadsheetsResource.ValuesResource.AppendRequest arequest = service.Spreadsheets.Values.Append(new ValueRange() { Values = val }, spreadsheetId, newRange);

        ValueRange response = request.Execute();
        IList<IList<Object>> values = response.Values;
        if (values != null && values.Count > 0)
        {
            foreach (var row in values)
            {
                // Print columns A to E, which correspond to indices 0 to 4.
                Console.WriteLine("{0}, {1}, {2}, {3}, {4}", row[0], row[1], row[2], row[3], row[4]);
            }
        }
        else
        {
            Console.WriteLine("No data found.");
        }


        Console.Read();

        arequest.InsertDataOption = SpreadsheetsResource.ValuesResource.AppendRequest.InsertDataOptionEnum.INSERTROWS;
        arequest.ValueInputOption = SpreadsheetsResource.ValuesResource.AppendRequest.ValueInputOptionEnum.USERENTERED;

        /*
        *
        * Works till here
        *
        */

        var aresponse = arequest.Execute();

        Console.WriteLine("Inserted");
        Console.Read();
    }

    private static IList<IList<Object>> GenerateData()
    {
        List<IList<Object>> objNewRecords = new List<IList<Object>>();

        IList<Object> obj = new List<Object>();

        obj.Add("Column - 1");
        obj.Add("Column - 2");
        obj.Add("Column - 3");
        obj.Add("Column - 4");
        obj.Add("Column - 5");
        objNewRecords.Add(obj);

        return objNewRecords;
    }

    protected static string GetRange(SheetsService service)
    {
        // Define request parameters.
        // String spreadsheetId = ;
        String range = "A:E";

        SpreadsheetsResource.ValuesResource.GetRequest getRequest =
                   service.Spreadsheets.Values.Get(spreadsheetId, range);

        ValueRange getResponse = getRequest.Execute();
        IList<IList<Object>> getValues = getResponse.Values;

        int currentCount = getValues.Count() + 2;

        String newRange = "A" + currentCount + ":A";

        return newRange;
    }
}
}

person 25mhz    schedule 22.01.2018    source источник
comment
Вы устанавливаете область как SpreadsheetsReadOnly, возможно, если вы измените ее на «Таблицы», это сработает.   -  person Raphael Lima    schedule 14.06.2018


Ответы (1)


Я не уверен, что вы можете писать в лист Google с помощью ключа API, но убедитесь, что вы установили для него полный общедоступный доступ, а не просто чтение общедоступного доступа. Если это не сработает, продолжайте читать.

Ключ API используется для доступа к публичным данным. Хотя вы можете использовать его для чтения из общедоступной таблицы Google, вы не сможете писать в нее. Вероятно, это связано с отсутствием возможности авторизации с помощью ключей api.

Вам необходимо использовать oauth2 или учетную запись службы с соответствующей областью записи.

person DaImTo    schedule 22.01.2018
comment
да, похоже, что невозможно писать с ключом API, хотя я не видел никаких документов, говорящих об этом. - person 25mhz; 22.01.2018
comment
Я знаю, что вы не можете загрузить на Google диск, это имеет смысл - person DaImTo; 22.01.2018