L’API di Google Sheets v4 riceve risposte HTTP 401 per i feed pubblici

Non riesco a ottenere una risposta dalla v4 dell’API di Google Sheets quando viene eseguita su un foglio di lavoro pubblico (ovvero “Pubblicata sul Web” e condivisa con “Chiunque sul Web”).

La documentazione pertinente afferma:

“Se la richiesta non richiede l’authorization ( come una richiesta di dati pubblici ), l’applicazione deve fornire sia la chiave API o un token OAuth 2.0, sia entrambi, qualunque sia l’opzione più conveniente per te.”

E per fornire la chiave API, la documentazione afferma:

“Dopo aver ottenuto una chiave API, l’applicazione può aggiungere il parametro di query key = yourAPIKey a tutti gli URL di richiesta.”

    Quindi, dovrei essere in grado di ottenere una risposta elencando i fogli in un foglio di calcolo pubblico al seguente URL:

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

    (con, ovviamente, l’id e la chiave forniti rispettivamente nel percorso e nella stringa di query)

    Tuttavia, quando faccio questo, ottengo una risposta HTTP 401:

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

    Qualcun altro può farlo funzionare contro una cartella di lavoro pubblica? In caso contrario, chiunque può monitorare questa discussione dal lato Google o commentare o fornire un campione funzionante?

    Sono riuscito a farlo funzionare. Anche io all’inizio ero frustrato. E questo non è un bug. Ecco come l’ho fatto:

    1. Innanzitutto, abilita questi nel tuo GDC per sbarazzarti degli errori di autenticazione.

    -Google Apps Script Execution

    – API di Google Sheets

    Nota . Assicurati che l’account Google che hai utilizzato in GDC sia lo stesso che utilizzi nel progetto Foglio di calcolo altrimenti potresti ricevere un messaggio di errore "The API Key and the authentication credential are from different projects" .

    1. Vai a https://developers.google.com/oauthplayground dove acquisirai i token di authorization.
    2. Al passaggio 1, seleziona Google Sheets API v4 e scegli l’ https://www.googleapis.com/auth/spreadsheets scope in modo da avere i permessi di lettura e scrittura bot.
    3. Fai clic sul pulsante Autorizza API. Consentire l’autenticazione e procedere al passaggio 2.
    4. Al passaggio 2, fare clic su Codice di authorization di Exchange per il pulsante token . Successivamente, vai al passaggio 3.
    5. Al passaggio 3, è ora di incollare la richiesta URL. Poiché il metodo server predefinito è GET, procedere e fare clic su Invia il pulsante richiesta .

    Nota : assicurati che le tue richieste URL siano quelle indicate nei documenti di Spreadsheetv4 .

    Ecco la mia richiesta di URL di esempio:

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

    Ho ricevuto un HTTP/1.1 200 OK e ha visualizzato i miei dati richiesti. Questo vale per tutti i processi lato server di Spreadsheetv4.

    Spero che questo ti aiuti.

    Di recente abbiamo risolto questo problema e ora dovrebbe funzionare. Ci scusiamo per i problemi, per favore riprova.

    Il documento deve essere condiviso con “Chiunque abbia il link” o “Pubblico sul Web”. (Nota: le impostazioni di pubblicazione da “File -> Pubblica sul Web” sono irrilevanti, a differenza dell’API v3.)

    Questa non è una soluzione del problema, ma penso che questo sia un buon modo per raggiungere l’objective. Sul sito http://embedded-lab.com/blog/post-data-google-sheets-using-esp8266/ ho trovato come aggiornare il foglio di calcolo con Google Apps Script. Questo è un esempio con il metodo GET. Proverò a mostrarti il ​​metodo POST con il formato JSON.

    Come POST: Crea foglio di calcolo Google, nella scheda Strumenti> Script Editor incolla il seguente script. Modificare lo script inserendo l’ID del foglio di calcolo appropriato e il nome della scheda Foglio (riga 27 e 28 nello 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 eg: 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; } } 

    Ora salva lo script e vai alla scheda Pubblica> Distribuisci come app Web .

    Esegui l’app come: Me [email protected] ,

    Chi ha accesso all’app: chiunque, anche anonimo

    Quindi per testare puoi usare l’app Postman. inserisci la descrizione dell'immagine qui

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

    Al codice sopra NuGet Newtonsoft.Json è richiesto.

    Risultato: inserisci la descrizione dell'immagine qui