Google Sheets API v4 получает ответы HTTP 401 для общедоступных каналов

Мне не удалось получить ответ от v4 API Google Sheets при работе с общедоступной (т. Е. «Опубликованной в Интернете» И предоставленной «всем в Интернете») таблицей.

В соответствующей документации говорится:

"Если запрос не требует авторизации (например, запрос общедоступных данных), тогда приложение должно предоставить либо ключ API, либо токен OAuth 2.0, либо и то, и другое. - любой вариант, наиболее удобный для вас ».

А чтобы предоставить ключ API, в документации указано:

«После того, как у вас есть ключ API, ваше приложение может добавить параметр запроса key = yourAPIKey ко всем URL-адресам запроса».

Итак, я должен иметь возможность получить ответ со списком листов в общедоступной электронной таблице по следующему URL-адресу:

https://sheets.googleapis.com/v4/spreadsheets/ {spreadsheetId}? key = {myAPIkey}

(с, очевидно, идентификатором и ключом, указанными в пути и строке запроса соответственно)

Однако когда я это делаю, я получаю ответ HTTP 401:

{
  error: {
    code: 401,
    message: "The request does not have valid authentication credentials.",
    status: "UNAUTHENTICATED"
  }
}

Может ли кто-нибудь еще заставить это работать против общедоступной книги? Если нет, может ли кто-нибудь, наблюдающий за этой веткой со стороны Google, прокомментировать или предоставить рабочий образец?


person Jon Shrike    schedule 19.05.2016    source источник
comment
вы используете команду GET с URL-адресом, который выглядит примерно так: GET sheet.googleapis.com/v4/spreadsheets/spreadsheetId{spreadsheetId}?key=‌ {myAPIk‌ ey}, а затем разместите его в панели навигации URL?   -  person noogui    schedule 20.05.2016
comment
При использовании схемы https токен {spreadsheetId} заменяется идентификатором общедоступной электронной таблицы, а токен {myAPIkey} заменяется действительным ключом API для моего проекта, да.   -  person Jon Shrike    schedule 20.05.2016
comment
вы пробовали мой обновленный ответ?   -  person noogui    schedule 22.06.2016


Ответы (4)


Мне удалось заставить это работать. Даже я сначала расстроился. И это не ошибка. Вот как я это сделал:

  1. Во-первых, включите их в своем GDC, чтобы избавиться от ошибок аутентификации.

-Google Apps Script Execution API

-Google Sheets API

Примечание. Убедитесь, что учетная запись Google, которую вы использовали в GDC, должна быть той же учетной записью, которую вы используете в проекте электронной таблицы, иначе вы можете получить "The API Key and the authentication credential are from different projects" сообщение об ошибке.

  1. Перейдите на страницу https://developers.google.com/oauthplayground, где вы получите токены авторизации.
  2. На шаге 1 выберите Google Sheets API v4 и выберите https://www.googleapis.com/auth/spreadsheets область, чтобы у вас были права на чтение и запись для бота.
  3. Нажмите кнопку «Авторизовать API». Разрешите аутентификацию, и вы перейдете к шагу 2.
  4. На шаге 2 нажмите кнопку Обменять код авторизации на токены. После этого переходите к шагу 3.
  5. На шаге 3 пора вставить ваш URL-запрос. Поскольку по умолчанию используется метод сервера GET, продолжайте и нажмите кнопку Отправить запрос.

Примечание. Убедитесь, что ваши URL-запросы соответствуют запросам, указанным в документах Spreadsheetv4. .

Вот мой пример запроса URL:

https://sheets.googleapis.com/v4/spreadsheets/SPREADSHEET_ID?includeGridData=false

Я получил HTTP/1.1 200 OK, и он отобразил запрошенные мной данные. Это касается всех серверных процессов Spreadsheetv4.

Надеюсь это поможет.

person noogui    schedule 20.05.2016
comment
Я просто попробовал этот подход, но получил те же результаты, что и в исходном посте. По-видимому, это может быть известная проблема, как указал Сэм. Если вы заставите его работать, пожалуйста, дайте мне знать. - person Jon Shrike; 22.05.2016
comment
Он работает только при попытке с GDC, я пытался использовать тот же токен с помощью Curl, и это не удалось. key = {API KEY} подход также не работает. Интересно, исправлено ли это! - person wabbit; 02.05.2017
comment
@wabbit, у вас возникают такие ошибки, как недостаточное разрешение или требуется вход в систему? не работает не описывает проблему. - person noogui; 02.05.2017
comment
@noogui Я попытался использовать тот же токен, сгенерированный GDC, в команде в оболочке, но он по-прежнему отображается как НЕАКТИВЕН (код: 401). Подобно тому, что упоминалось в начальном вопросе - person wabbit; 02.05.2017
comment
Что именно это дает? Похоже, это просто проверка запроса ... - person TulsaNewbie; 18.06.2019
comment
и тестирование запроса означает, что услуга доступна. Однако, читая между строк, кажется, вы хотите, чтобы я написал вам код? (у меня есть пример кода, BTW: D в одном из этих сообщений) - person noogui; 24.06.2019

Мы недавно исправили это, и теперь оно должно работать. Приносим извинения за проблемы, попробуйте еще раз.

Документ должен быть предоставлен «всем, у кого есть ссылка» или «всем в Интернете». (Примечание: настройки публикации из «Файл -> Опубликовать в Интернете» не имеют значения, в отличие от API v3.)

person Sam Berlin    schedule 19.05.2016
comment
Спасибо, Сэм. Я с нетерпением жду исправления. - person Jon Shrike; 19.05.2016
comment
Итак, какой обходной путь сейчас? Это все еще не работает, и я не могу найти никаких документов из версии 3 о том, как этого добиться. - person JVG; 31.05.2016
comment
@JonShrike - извините, на данный момент единственный обходной путь - передать токен аутентификации ... который не является обходным решением. - person Sam Berlin; 07.06.2016
comment
@JonShrike, теперь это должно работать, пожалуйста, посмотрите правки к моему ответу. Извините за задержку! - person Sam Berlin; 14.06.2016
comment
Я передаю апитокен, но он по-прежнему говорит, что в запросе отсутствует требуемый токен аутентификации. Лист общедоступен. - person The Muffin Man; 14.04.2017
comment
@SamBerlin мне все еще кажется сломанным - person tayl0rs; 28.09.2017
comment
@ SamBerlin это сломано для меня - person Bennett Talpers; 13.12.2017
comment
@ sww314 - Ошибка, которую вы указали, относится к письму, этот вопрос относится к чтению. Запросы на чтение работают нормально только с апики. - person Sam Berlin; 28.02.2018

Это не решение проблемы, но я считаю, что это хороший способ достичь цели. На сайте http://embedded-lab.com/blog/post-data-google-sheets-using-esp8266/ Я узнал, как обновить электронную таблицу с помощью скрипта Google Apps. Это пример с методом GET. Я постараюсь показать вам метод POST с форматом JSON.

Как выполнить POST: Создайте электронную таблицу Google, на вкладке Инструменты> Редактор скриптов вставьте следующий скрипт. Измените сценарий, введя соответствующий идентификатор электронной таблицы и имя вкладки «Лист» (строки 27 и 28 в сценарии).

function doPost(e)
{
  var success = false;
  if (e != null)
  {
    var JSON_RawContent = e.postData.contents;
    var PersonalData = JSON.parse(JSON_RawContent);

    success = SaveData(
      PersonalData.Name, 
      PersonalData.Age, 
      PersonalData.Phone
    );
  }
  // Return plain text Output
    return ContentService.createTextOutput("Data saved: " + success);
}

function SaveData(Name, Age, Phone)
{
  try 
  {
    var dateTime = new Date();

    // Paste the URL of the Google Sheets starting from https thru /edit
    // For e.g.: https://docs.google.com/---YOUR SPREADSHEET ID---/edit 
    var MyPersonalMatrix = SpreadsheetApp.openByUrl("https://docs.google.com/spreadsheets/d/---YOUR SPREADSHEET ID---/edit");
    var MyBasicPersonalData = MyPersonalMatrix.getSheetByName("BasicPersonalData");


    // Get last edited row
    var row = MyBasicPersonalData.getLastRow() + 1;

    MyBasicPersonalData.getRange("A" + row).setValue(Name);
    MyBasicPersonalData.getRange("B" + row).setValue(Age); 
    MyBasicPersonalData.getRange("C" + row).setValue(Phone); 

    return true;
  }
  catch(error) 
  {
    return false;
  }
}

Теперь сохраните сценарий и перейдите на вкладку Опубликовать> Развернуть как веб-приложение.

Запустите приложение как: Я [email protected],

У кого есть доступ к приложению: Кто угодно, даже анонимно

Затем для тестирования вы можете использовать приложение Postman. введите здесь описание изображения

Или используя UWP:

private async void Button_Click(object sender, RoutedEventArgs e)
{
    using (HttpClient httpClient = new HttpClient())
    {
        httpClient.BaseAddress = new Uri(@"https://script.google.com/");
        httpClient.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
        httpClient.DefaultRequestHeaders.AcceptEncoding.Add(new System.Net.Http.Headers.StringWithQualityHeaderValue("utf-8"));
        string endpoint = @"/macros/s/---YOUR SCRIPT ID---/exec";

        try
        {
            PersonalData personalData = new PersonalData();
            personalData.Name = "Jarek";
            personalData.Age = "34";
            personalData.Phone = "111 222 333";

            HttpContent httpContent = new StringContent(JsonConvert.SerializeObject(personalData), Encoding.UTF8, "application/json");
            HttpResponseMessage httpResponseMessage = await httpClient.PostAsync(endpoint, httpContent);
            if (httpResponseMessage.IsSuccessStatusCode)
            {
                string jsonResponse = await httpResponseMessage.Content.ReadAsStringAsync();
            //do something with json response here
            }
        }
        catch (Exception ex)
        {

        }
    }
}

public class PersonalData
{
    public string Name;
    public string Age;
    public string Phone;
}

Для вышеуказанного кода требуется NuGet Newtonsoft.Json.

Результат:  введите здесь описание изображения

person Jarek    schedule 24.03.2018

Если ваш канал является общедоступным и вы используете ключ api, убедитесь, что вы отправляете HTTP-запрос GET. В случае запроса POST вы получите эту ошибку. Я столкнулся с таким же. Получение данных с помощью метода: spreadsheets.getByDataFilter имеет запрос POST

person namrata agarwal    schedule 12.02.2019