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

Мне не повезло получить ответ от v4 API Google Таблиц при работе с общедоступной (т.е. "Публикацией в Интернете" и с общей таблицей "Любой в Интернете" ).

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

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

И для предоставления ключа API в документации указано:

"После того, как у вас есть ключ API, ваше приложение может добавить ключ запроса query = 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 либо комментировать, либо предоставлять рабочий образец?

Ответ 1

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

  • Сначала включите их в своем GDC, чтобы избавиться от ошибок проверки подлинности.

-Google Apps Script API выполнения

-Google Sheets API

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

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

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

Здесь мой пример URL-запроса:

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

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

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

Ответ 2

Мы недавно исправили это, и теперь он должен работать. Извините за проблемы, повторите попытку.

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

Ответ 3

Это не решение проблемы, но я думаю, что это хороший способ достичь цели. На сайте http://embedded-lab.com/blog/post-data-google-sheets-using-esp8266/ Я нашел, как обновлять таблицу с помощью Google Apps Script. Это пример метода 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;
  }
}

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

Выполните приложение как: Me [email protected],

Кто имеет доступ к приложению: любой, даже анонимный

Затем, чтобы проверить, вы можете использовать приложение Postman. enter image description here

Или используя 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.

Результат: enter image description here