User Tools

Site Tools


lolin:envoyer_des_donnees_dans_une_feuille_de_calcul_google

Envoyer des données vers une feuille de calcul google

Adresse de l'éditeur de script : https://script.google.com/

Doc google sur les web app avec google script : https://developers.google.com/apps-script/guides/web

ID de la feuille de calcul : dans l'url genre https://docs.google.com/spreadsheets/d/ici-il-y-a-l-id-de-la-feuille-de-calcul/edit

Il est à noter qu'on utilise ici un format d'url avec url?data=donnée-1&data=données-2&data=donnée-3 pour obtenir une séquence { data:['donnée-1','donnée-2','donnée-3'] } (voir dans la doc google ci-dessus e.queryString et e.parameters.

déploiement et autorisations

En haut à droite de l'éditeur, il y a un bouton déploiement > nouveau déploiement > web app

Bien penser à autoriser « tout le monde » et à vérifier en faisant déploiement > gérer les déploiement, sinon il y a risque de redirection vers la page de connexion à google.

Google script

function doGet(e) {
   /* Une des deux fonctions possibles pour une web app,
   ici celle pour une requête get vers la web-app */

   // on essaie d'exécuter ce qui suit :
   try {
      // on sélectionne le classeur
      var doc = SpreadsheetApp.openById('ID-DU-DOCUMENT-A-INSERER-ICI');

      // la feuille de calcul
      var feuille = doc.getSheetByName("NOM-DE-LA-FEUILLE-DE-CALCUL");

      // on les insère
      feuille.appendRow( e.parameters.data );

      // Pour pouvoir déployer sous forme de web app il faut retourner une sortie HTML
      // Ici on indique juste que tout est ok.
      return HtmlService.createHtmlOutput('ok');
   
   // en cas d'erreur on affiche l'erreur dans la sortie HTML   
   } catch (e) {
      // Pour pouvoir déployer sous forme de web app il faut retourner une sortie HTML
      return HtmlService.createHtmlOutput('erreur : ' + e);
   }
}

code Lolin d1 mini

/* 
 * source : https://github.com/esp8266/Arduino/blob/master/libraries/ESP8266HTTPClient/examples/BasicHttpsClient/BasicHttpsClient.ino
 * attention, normalement il faudrait le « fingerprint » du certificat ssl de la page à charger dans le code
 * ici on utilise le mode insecure qui ne vérifie pas le certificat en face
*/

#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
// la librairie suivante fait partie de la librairie ESP8266HTTPClient (appremment ?)
#include <WiFiClientSecureBearSSL.h>

const char* ssid = "ssid-de-votre-reseau";
const char* mot_de_passe = "mot-de-passe-wifi";
const char* url = "url-de-l-app-web"

WiFiClient wifiClient;
 
void setup() {
  
  Serial.begin(115200);
  delay(10);
 
  // Connect WiFi
  Serial.println();
  Serial.println();
  Serial.print("Tentative de connexion à ");
  Serial.println(ssid);
  
  WiFi.hostname("D1MINI"); // le nom sur le réseau ?
  WiFi.begin(ssid, mot_de_passe);

  // tant qu'on est pas connecté
  while (WiFi.status() != WL_CONNECTED) {

    // un « . » dans le monteur toutes les 0.5 secondes
    delay(500);
    Serial.print(".");
  }

  // une fois connecté
  Serial.println("");
  Serial.println("connexion WiFi établie");
 
  // impression de l'adresse IP
  Serial.print("Adresse IP : ");
  Serial.print(WiFi.localIP());
}

void loop() {
  // on attend la connexion WiFi
  if (WiFi.status() == WL_CONNECTED) {
    
    // ?
    std::unique_ptr<BearSSL::WiFiClientSecure>client(new BearSSL::WiFiClientSecure);

    // on ne vérifie pas l'empreinte (fingerprint)
    // l'exemple source le fait, mais cela veut dire qu'il faut chercher à l'avance l'empreinte du site
    // et la mettre ici, la changer quand elle change
    client->setInsecure();

    HTTPClient https;

    Serial.print("[HTTPS] début de la requête...\n");
    if (https.begin(*client, "https://script.google.com/macros/s/ici-mettre-l-id-/exec?data=je&data=suis&data=une&data=d1mini")) {  // HTTPS

      Serial.print("[HTTPS] GET...\n");
      // on début la connexion et on envoie l'en-tête HTTP
      int httpCode = https.GET();

      // httpCode will be negative on error
      if (httpCode > 0) {
        // HTTP header has been send and Server response header has been handled
        Serial.printf("[HTTPS] GET... code: %d\n", httpCode);

        // file found at server
        if (httpCode == HTTP_CODE_OK || httpCode == HTTP_CODE_MOVED_PERMANENTLY ) {
          String payload = https.getString();
          Serial.println(payload);
        
        // ici du code que j'avais mis pour comprendre ce qu'affichait la page alors que j'avais un code 302 car mon application n'était pas accessible à tous et donc me redirigeait vers la page de login de google  
        } else if ( httpCode == 302 ) {
          Serial.println("--------");
          Serial.println("code 302");

          Serial.println("--------");
          Serial.println("headers");
          //rien
          for(int i = 0; i< https.headers(); i++){
            Serial.println( https.header(i) );
          }

          Serial.println("--------");
          Serial.println("content");
          Serial.println(https.getString());
          
          Serial.println("--------");
        }
      } else {
        Serial.printf("[HTTPS] GET... failed, error: %s\n", https.errorToString(httpCode).c_str());
      }

      https.end();
    } else {
      Serial.printf("[HTTPS] Impossible de se connecter\n");
    }
  }

  Serial.println("30 secondes avant le prochain essai...");
  delay(30000);
}
lolin/envoyer_des_donnees_dans_une_feuille_de_calcul_google.txt · Last modified: 2021/09/29 10:41 by leo