web-dev-qa-db-fra.com

L'API v4 de Google Sheets reçoit des réponses HTTP 401 pour les flux publics

Je n'ai aucune chance d'obtenir une réponse de la v4 de l'API Google Sheets lorsque je l'utilise avec une feuille de calcul publique ("Publiée sur le Web" ET partagée avec "Tout le monde sur le Web").

La documentation pertinente indique:

"Si la demande ne nécessite pas d'autorisation (telle qu'une demande de données publiques), l'application doit alors fournir la clé API ou un jeton OAuth 2.0, ou les deux. le plus pratique pour vous. "

Et pour fournir la clé API, la documentation indique:

"Une fois que vous avez une clé API, votre application peut ajouter le paramètre de requête clé = votreAPIKey à toutes les URL de requête."

Donc, je devrais pouvoir obtenir une réponse répertoriant les feuilles d'un tableur public à l'URL suivante:

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

(avec, évidemment, l'id et la clé fournis dans le chemin et la chaîne de requête, respectivement)

Cependant, lorsque je le fais, je reçois une réponse HTTP 401:

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

Quelqu'un d'autre peut-il faire en sorte que cela fonctionne avec un classeur public? Si ce n'est pas le cas, quiconque surveille ce fil du côté de Google peut-il commenter ou fournir un exemple de travail?

13
Jon Shrike

J'ai réussi à le faire fonctionner. Même j'étais frustré au début. Et ce n'est pas un bug. Voici comment je l'ai fait:

  1. Premièrement, activez-les dans votre GDC pour éliminer les erreurs d’authentification.

-API d'exécution de script Google Apps

-API Google Sheets

Remarque: assurez-vous que le compte Google que vous avez utilisé dans GDC doit être identique à celui que vous utilisez dans le projet Spreadsheet, sans quoi un message d'erreur "The API Key and the authentication credential are from different projects" apparaîtra.

  1. Accédez à https://developers.google.com/oauthplayground où vous obtiendrez des jetons d'autorisation.
  2. À l'étape 1, choisissez API Google Sheets v4 et choisissez https://www.googleapis.com/auth/spreadsheets scope pour disposer des autorisations de lecture et d'écriture.
  3. Cliquez sur le bouton Autoriser les API. Autorisez l'authentification et vous passez à l'étape 2.
  4. À l'étape 2, cliquez sur le bouton code d'autorisation Exchange pour les jetons. Après cela, passez à l'étape 3.
  5. A l'étape 3, il est temps de coller votre demande d'URL. Comme la méthode de serveur par défaut est GET, cliquez sur bouton Envoyer le bouton de requête} _.

Note: Assurez-vous que vos demandes d'URL sont celles indiquées dans la Spreadsheetv4 docs .

Voici mon exemple de demande d'URL:

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

J'ai eu un HTTP/1.1 200 OK et il a affiché mes données demandées. Cela vaut pour tous les processus côté serveur Spreadsheetv4.

J'espère que cela t'aides.

11
noogui

Nous avons récemment corrigé cela et cela devrait maintenant fonctionner. Désolé pour les ennuis, veuillez réessayer.

Le document doit être partagé avec "Toute personne disposant du lien" ou "Public sur le Web". (Remarque: les paramètres de publication de "Fichier -> Publier sur le Web" ne sont pas pertinents, contrairement à l'API v3.)

6
Sam Berlin

Ce n'est pas une solution au problème mais je pense que c'est un bon moyen d'atteindre l'objectif. Sur le site http://embedded-lab.com/blog/post-data-google-sheets-using-esp8266/ J'ai découvert comment mettre à jour le tableur à l'aide du script Google Apps. Ceci est un exemple avec la méthode GET. Je vais essayer de vous montrer la méthode POST avec le format JSON.

Comment publier: Créez une feuille de calcul Google, dans l'onglet Outils> Editeur de script, collez le script suivant. Modifiez le script en entrant l'ID de la feuille de calcul et le nom de l'onglet Feuille appropriés (lignes 27 et 28 dans le script).

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;
  }
}

Enregistrez maintenant le script et accédez à l'onglet Publier> Déployer en tant qu'application Web.

Exécutez l'application en tant que: Me [email protected]

Qui a accès à l'application: N'importe qui, même anonyme

Ensuite, pour tester, vous pouvez utiliser l'application Postman.  enter image description here

Ou en utilisant 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;
}

Le code ci-dessus, NuGet Newtonsoft.Json, est requis.

Résultat:  enter image description here

1
Jarek

Si votre flux est public et que vous utilisez une clé API, assurez-vous de lancer une requête http GET. Dans le cas d'une requête POST, vous recevrez cette erreur . using Méthode: spreadsheets.getByDataFilter a une demande POST

0
namrata agarwal