Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. Datenpunkte in Google Spreadsheet schreiben

NEWS

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    8.9k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    2.3k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    16
    1
    3.4k

Datenpunkte in Google Spreadsheet schreiben

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
10 Beiträge 3 Kommentatoren 842 Aufrufe 5 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • P Offline
    P Offline
    paulkerl
    schrieb am zuletzt editiert von
    #1

    Hallo zusammen,

    ich suche eine möglichkeit, Datenpunkte in Google Spreadsheet zu schreiben. Dass das über die Google API funktionert steht außer Frage, die Frage ist, ob es schon jemand mit IOB realisiert hat und mir hier ggf. etwas Hilfestellung geben kann?

    Aktuell speichere ich die Daten in Influx würde einzelen Datenpunkte aber gerne gleich als Google Sheet haben anstatt aus Influx zu exportieren und in Excel/Google zu importieren.

    Vielleicht gibts hier schin das eine oder andree Projekt. Würde ich freuen.
    LG Dominik

    MartinPM 1 Antwort Letzte Antwort
    0
    • P paulkerl

      Hallo zusammen,

      ich suche eine möglichkeit, Datenpunkte in Google Spreadsheet zu schreiben. Dass das über die Google API funktionert steht außer Frage, die Frage ist, ob es schon jemand mit IOB realisiert hat und mir hier ggf. etwas Hilfestellung geben kann?

      Aktuell speichere ich die Daten in Influx würde einzelen Datenpunkte aber gerne gleich als Google Sheet haben anstatt aus Influx zu exportieren und in Excel/Google zu importieren.

      Vielleicht gibts hier schin das eine oder andree Projekt. Würde ich freuen.
      LG Dominik

      MartinPM Online
      MartinPM Online
      MartinP
      schrieb am zuletzt editiert von
      #2

      @paulkerl Das müsste doch mit ein wenig Javascript zu machen sein ...

      Ich hatte nur rudimentäre Kenntnisse von Javascript, und habe da ein paar kleine Fingerübungen bisher hinter mich gebracht ...

      Unten in der kleinen Callback-Funktion müsste der pfad auf den Datenpunkt angepasst werden, und in den Funktionsrumpf dann der Google-Api Aufruf...
      Das ist ein "Taster", deshalb wird der true state nicht einfach Quittiert, sondern, wenn es auf True gesetzt wird als Quittung gleich wieder als gelöscht gemeldet ...

      on('0_userdata.0.Puls-Rolltor', function (obj) {
        if ( (obj.state.val ==true) && ( obj.state != obj.oldState))
          PulseLcTechRel('192.168.2.47', '8080', 2);
        //  PulseLcTechRel('192.168.2.26', '8080', 1);
        setState('0_userdata.0.Puls-Rolltor', false, true/*ack*/);
      }); 
      
      

      Intel(R) Celeron(R) CPU N3000 @ 1.04GHz 8G RAM 480G SSD
      Virtualization : unprivileged lxc container (debian 12 on Proxmox 8.4.14)
      Linux pve 6.8.12-16-pve
      6 GByte RAM für den Container
      Fritzbox 6591 FW 8.03 (Vodafone Leih-Box)
      Remote-Access über Wireguard der Fritzbox

      P 1 Antwort Letzte Antwort
      0
      • MartinPM MartinP

        @paulkerl Das müsste doch mit ein wenig Javascript zu machen sein ...

        Ich hatte nur rudimentäre Kenntnisse von Javascript, und habe da ein paar kleine Fingerübungen bisher hinter mich gebracht ...

        Unten in der kleinen Callback-Funktion müsste der pfad auf den Datenpunkt angepasst werden, und in den Funktionsrumpf dann der Google-Api Aufruf...
        Das ist ein "Taster", deshalb wird der true state nicht einfach Quittiert, sondern, wenn es auf True gesetzt wird als Quittung gleich wieder als gelöscht gemeldet ...

        on('0_userdata.0.Puls-Rolltor', function (obj) {
          if ( (obj.state.val ==true) && ( obj.state != obj.oldState))
            PulseLcTechRel('192.168.2.47', '8080', 2);
          //  PulseLcTechRel('192.168.2.26', '8080', 1);
          setState('0_userdata.0.Puls-Rolltor', false, true/*ack*/);
        }); 
        
        
        P Offline
        P Offline
        paulkerl
        schrieb am zuletzt editiert von
        #3

        @martinp Hallo Martin,

        besten Dank! Ich probiere das die Tage mal aus und melde mich dann zurück.

        LG Dominik

        S 1 Antwort Letzte Antwort
        0
        • P paulkerl

          @martinp Hallo Martin,

          besten Dank! Ich probiere das die Tage mal aus und melde mich dann zurück.

          LG Dominik

          S Offline
          S Offline
          simplyclever
          schrieb am zuletzt editiert von
          #4

          @paulkerl Eine weitere einfache Möglichkeit ist per Google Form.
          Form erstellen, 3-Dots: Get Pre-Filled Link, Dummy Daten eintragen und auf "Get Link" klicken.
          Dieser Link hat dann den Pfad zur Form und endet z.B. so bei 3 Datenfeldern:
          entry.153450769=DUMMY1&entry.744858269=DUMMY2&entry.1375120589=DUMMY3

          In einemScript kann man dann diesen Link generieren mit den aktuellen Daten und per http Request abschicken.
          Die Daten landen dann Zeilenweise in einem Google Sheet und können dort weiter verarbeitet werden.
          Ich benutzte 3 solcher Forms für verschiedene Daten. Damit der Aufwand gering ist nur 1 Datenfeld, in dem ich alle Daten mit einem Trenner zusammenfasse und im Google Sheet dann mit Split wieder auseinander nehme. Alles über Array Formeln.

          P 2 Antworten Letzte Antwort
          0
          • S simplyclever

            @paulkerl Eine weitere einfache Möglichkeit ist per Google Form.
            Form erstellen, 3-Dots: Get Pre-Filled Link, Dummy Daten eintragen und auf "Get Link" klicken.
            Dieser Link hat dann den Pfad zur Form und endet z.B. so bei 3 Datenfeldern:
            entry.153450769=DUMMY1&entry.744858269=DUMMY2&entry.1375120589=DUMMY3

            In einemScript kann man dann diesen Link generieren mit den aktuellen Daten und per http Request abschicken.
            Die Daten landen dann Zeilenweise in einem Google Sheet und können dort weiter verarbeitet werden.
            Ich benutzte 3 solcher Forms für verschiedene Daten. Damit der Aufwand gering ist nur 1 Datenfeld, in dem ich alle Daten mit einem Trenner zusammenfasse und im Google Sheet dann mit Split wieder auseinander nehme. Alles über Array Formeln.

            P Offline
            P Offline
            paulkerl
            schrieb am zuletzt editiert von
            #5

            @simplyclever Oh wow! Das nenne ich mal ne smarte Lösung. Genau was ich gesucht habe!
            Danke Dir!

            LG Dominik

            1 Antwort Letzte Antwort
            0
            • S simplyclever

              @paulkerl Eine weitere einfache Möglichkeit ist per Google Form.
              Form erstellen, 3-Dots: Get Pre-Filled Link, Dummy Daten eintragen und auf "Get Link" klicken.
              Dieser Link hat dann den Pfad zur Form und endet z.B. so bei 3 Datenfeldern:
              entry.153450769=DUMMY1&entry.744858269=DUMMY2&entry.1375120589=DUMMY3

              In einemScript kann man dann diesen Link generieren mit den aktuellen Daten und per http Request abschicken.
              Die Daten landen dann Zeilenweise in einem Google Sheet und können dort weiter verarbeitet werden.
              Ich benutzte 3 solcher Forms für verschiedene Daten. Damit der Aufwand gering ist nur 1 Datenfeld, in dem ich alle Daten mit einem Trenner zusammenfasse und im Google Sheet dann mit Split wieder auseinander nehme. Alles über Array Formeln.

              P Offline
              P Offline
              paulkerl
              schrieb am zuletzt editiert von
              #6

              @simplyclever zu früh "gefreut".:grimacing:

              Der Prozess funktioniert soweit wie beschrieben. Der generierte Link erzeugt das ausgefüllt formular. Formular aber noch mit klick auf den SENDEN Button versenden um die Daten an Google zu Übermitteln.

              Wie hast Du das bei Dir gelöst? Gibts in der URL einen POST- Parameter?

              Danke und Grüße,
              Dominik

              S 1 Antwort Letzte Antwort
              0
              • P paulkerl

                @simplyclever zu früh "gefreut".:grimacing:

                Der Prozess funktioniert soweit wie beschrieben. Der generierte Link erzeugt das ausgefüllt formular. Formular aber noch mit klick auf den SENDEN Button versenden um die Daten an Google zu Übermitteln.

                Wie hast Du das bei Dir gelöst? Gibts in der URL einen POST- Parameter?

                Danke und Grüße,
                Dominik

                S Offline
                S Offline
                simplyclever
                schrieb am zuletzt editiert von
                #7

                @paulkerl Bin unterwegs und werde am Abend mal Details posten.

                Wenn Du den Google Form link (komplett ausgefüllt) einfach per copy/paste im Browser eingibts und Enter drückst, sollte ein Eintrag im ResponseSheet auftauchen.
                Genau diesen String in Blockly (oder Java) per SendHttpRequesst abschicken.

                Was mir gerade einfällt: Sonderzeichen, Umlaute etc. führen zu Problemen.
                Daher braucht man eine Javascript Funktion, die ein Encoding macht.
                Den Code packe ich auch heute Abend hier rein.

                Im Prinzip sieht es bei mir so aus:

                • Eine globale Javascript Funktion definieren, die die Daten als Parameter erhält, das Encoding übernimmt, und den http Request abschickt.
                • Eine Funktion, die die Daten holt und das globale Script aufruft.
                  Ich mache das in Blockly. Da braucht man dann noch ein lokales JS Script, in dem das globale aufgerufen wird.
                P 1 Antwort Letzte Antwort
                0
                • S simplyclever

                  @paulkerl Bin unterwegs und werde am Abend mal Details posten.

                  Wenn Du den Google Form link (komplett ausgefüllt) einfach per copy/paste im Browser eingibts und Enter drückst, sollte ein Eintrag im ResponseSheet auftauchen.
                  Genau diesen String in Blockly (oder Java) per SendHttpRequesst abschicken.

                  Was mir gerade einfällt: Sonderzeichen, Umlaute etc. führen zu Problemen.
                  Daher braucht man eine Javascript Funktion, die ein Encoding macht.
                  Den Code packe ich auch heute Abend hier rein.

                  Im Prinzip sieht es bei mir so aus:

                  • Eine globale Javascript Funktion definieren, die die Daten als Parameter erhält, das Encoding übernimmt, und den http Request abschickt.
                  • Eine Funktion, die die Daten holt und das globale Script aufruft.
                    Ich mache das in Blockly. Da braucht man dann noch ein lokales JS Script, in dem das globale aufgerufen wird.
                  P Offline
                  P Offline
                  paulkerl
                  schrieb am zuletzt editiert von
                  #8

                  @simplyclever

                  Wenn Du den Google Form link (komplett ausgefüllt) einfach per copy/paste im Browser eingibts und Enter drückst, sollte ein Eintrag im ResponseSheet auftauchen.

                  Genau das ist leider nciht der Fall. Es erscheint eine Seite mit den ausgefüllten Feldern. Damit die Werte im ResponseSheet auftauchen muss ich erst erst auf "SENDEN" drücken.

                  Bin gespannt ob in deinem Blockly/URL hier ggf. noch etwas steckt, was das Form bei Aufruf sendet.

                  Danke und Grüße,
                  Dominik

                  S 1 Antwort Letzte Antwort
                  0
                  • P paulkerl

                    @simplyclever

                    Wenn Du den Google Form link (komplett ausgefüllt) einfach per copy/paste im Browser eingibts und Enter drückst, sollte ein Eintrag im ResponseSheet auftauchen.

                    Genau das ist leider nciht der Fall. Es erscheint eine Seite mit den ausgefüllten Feldern. Damit die Werte im ResponseSheet auftauchen muss ich erst erst auf "SENDEN" drücken.

                    Bin gespannt ob in deinem Blockly/URL hier ggf. noch etwas steckt, was das Form bei Aufruf sendet.

                    Danke und Grüße,
                    Dominik

                    S Offline
                    S Offline
                    simplyclever
                    schrieb am zuletzt editiert von
                    #9

                    Das mit dem "Senden" liegt wahrscheinlich daran, dass ich etwas wichtiges vergessen habe :cry: :
                    Im Form Link steht "..view...". Das muss durch "formResponse" ersetzt werden (siehe unten).

                    Ich habe einen String Datenpunkt zum speichern der Form url. Die url sieht zum Beispiel so aus:
                    https://docs.google.com/forms/d/e/<FORM_ID>/formResponse?

                    Offensichtlich <FORM_ID> durch die eigene Id ersetzten (siehe Form Link).

                    Ein zweiter Boolean Datenpunkt (IobrokerLogEnabled) definiert, ob das logging true oder false ist.

                    Hier das globale Java Script:

                    function AddEntryToIobrokerLogGoogleForm(Script, Slogan, Description) {
                      // Update Google Form to log Iobroker data
                      if (getState("0_userdata.0.00_SmartHomeStatus.GoogleInterface.IobrokerLogEnabled").val) {
                        HttpMessage = getState("0_userdata.0.00_SmartHomeStatus.GoogleInterface.IobrokerLogUrl").val
                        HttpMessage += 'entry.1234567=';
                        HttpMessage += encodeURIComponent( String(Script) );
                        HttpMessage += '&entry.897654=';
                        HttpMessage += encodeURIComponent( String(Slogan) );
                        HttpMessage += '&entry.11223344=';
                        HttpMessage += encodeURIComponent( String(Description) );
                        // Replace all " " with "+"
                        HttpMessage = HttpMessage.replace(/ /ig, '+');
                        try {
                          require("request")(HttpMessage).on("error", function (e) {console.error(e);});
                        } 
                        catch (e) { 
                          console.error(e); 
                        }
                      }
                    
                    }
                    

                    Die Namen der Datenpunkte in getState müssen natürlich angepasst werden.

                    Ich habe hier 3 Parameter, also 3 Datenfelder; sprich 3 Spalten im Response Sheet.

                    Die HttpMessage wird zusammengesetzt aus dem url Datenpunkt, und den 3 Entries, deren Werte als Parameter übergeben werden.
                    Nicht vergessen, die IDs der Entries zu ändern! (könnte man natürlich auch über Datenpunkte machen).
                    Das "encodeURIComponent" stellt sicher, das Sonderzeichen nicht zu Problemen führen.
                    Leerzeichen würden auch nicht funktionieren, die werden durch "+" ersetzt.

                    Das Blockly sieht dann zum Beispiel so aus:
                    06d0b216-5701-4b5b-b48b-e285bd3f7ae4-image.png
                    Das ist ein sehr simples Beispiel, man kann natürlich beliebige Daten übergeben. Wie schon erwähnt setzte ich z.B. in einer anderen Form einen recht langen String aus vielen Werten mit Trennzeichen zusammen.

                    Der Inhalt der Javascript Funktion ist ein Einzeiler, es wird die globale Funktion aufgerufen:

                    AddEntryToIobrokerLogGoogleForm(script, slogan, description);
                    

                    All das könnte man sicher noch eleganter, generischer, etc. machen. So ist es zumindest simpel und läuft zuverlässig.

                    P 1 Antwort Letzte Antwort
                    0
                    • S simplyclever

                      Das mit dem "Senden" liegt wahrscheinlich daran, dass ich etwas wichtiges vergessen habe :cry: :
                      Im Form Link steht "..view...". Das muss durch "formResponse" ersetzt werden (siehe unten).

                      Ich habe einen String Datenpunkt zum speichern der Form url. Die url sieht zum Beispiel so aus:
                      https://docs.google.com/forms/d/e/<FORM_ID>/formResponse?

                      Offensichtlich <FORM_ID> durch die eigene Id ersetzten (siehe Form Link).

                      Ein zweiter Boolean Datenpunkt (IobrokerLogEnabled) definiert, ob das logging true oder false ist.

                      Hier das globale Java Script:

                      function AddEntryToIobrokerLogGoogleForm(Script, Slogan, Description) {
                        // Update Google Form to log Iobroker data
                        if (getState("0_userdata.0.00_SmartHomeStatus.GoogleInterface.IobrokerLogEnabled").val) {
                          HttpMessage = getState("0_userdata.0.00_SmartHomeStatus.GoogleInterface.IobrokerLogUrl").val
                          HttpMessage += 'entry.1234567=';
                          HttpMessage += encodeURIComponent( String(Script) );
                          HttpMessage += '&entry.897654=';
                          HttpMessage += encodeURIComponent( String(Slogan) );
                          HttpMessage += '&entry.11223344=';
                          HttpMessage += encodeURIComponent( String(Description) );
                          // Replace all " " with "+"
                          HttpMessage = HttpMessage.replace(/ /ig, '+');
                          try {
                            require("request")(HttpMessage).on("error", function (e) {console.error(e);});
                          } 
                          catch (e) { 
                            console.error(e); 
                          }
                        }
                      
                      }
                      

                      Die Namen der Datenpunkte in getState müssen natürlich angepasst werden.

                      Ich habe hier 3 Parameter, also 3 Datenfelder; sprich 3 Spalten im Response Sheet.

                      Die HttpMessage wird zusammengesetzt aus dem url Datenpunkt, und den 3 Entries, deren Werte als Parameter übergeben werden.
                      Nicht vergessen, die IDs der Entries zu ändern! (könnte man natürlich auch über Datenpunkte machen).
                      Das "encodeURIComponent" stellt sicher, das Sonderzeichen nicht zu Problemen führen.
                      Leerzeichen würden auch nicht funktionieren, die werden durch "+" ersetzt.

                      Das Blockly sieht dann zum Beispiel so aus:
                      06d0b216-5701-4b5b-b48b-e285bd3f7ae4-image.png
                      Das ist ein sehr simples Beispiel, man kann natürlich beliebige Daten übergeben. Wie schon erwähnt setzte ich z.B. in einer anderen Form einen recht langen String aus vielen Werten mit Trennzeichen zusammen.

                      Der Inhalt der Javascript Funktion ist ein Einzeiler, es wird die globale Funktion aufgerufen:

                      AddEntryToIobrokerLogGoogleForm(script, slogan, description);
                      

                      All das könnte man sicher noch eleganter, generischer, etc. machen. So ist es zumindest simpel und läuft zuverlässig.

                      P Offline
                      P Offline
                      paulkerl
                      schrieb am zuletzt editiert von
                      #10

                      @simplyclever

                      Vielen Dank!!! Ich werd mich am WE mal dransetzen. Sollte aber definitv mein Problem lösen.
                      Melde mich danach zurück.

                      VG Dominik

                      1 Antwort Letzte Antwort
                      0
                      Antworten
                      • In einem neuen Thema antworten
                      Anmelden zum Antworten
                      • Älteste zuerst
                      • Neuste zuerst
                      • Meiste Stimmen


                      Support us

                      ioBroker
                      Community Adapters
                      Donate

                      595

                      Online

                      32.4k

                      Benutzer

                      81.6k

                      Themen

                      1.3m

                      Beiträge
                      Community
                      Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                      ioBroker Community 2014-2025
                      logo
                      • Anmelden

                      • Du hast noch kein Konto? Registrieren

                      • Anmelden oder registrieren, um zu suchen
                      • Erster Beitrag
                        Letzter Beitrag
                      0
                      • Home
                      • Aktuell
                      • Tags
                      • Ungelesen 0
                      • Kategorien
                      • Unreplied
                      • Beliebt
                      • GitHub
                      • Docu
                      • Hilfe