2016-07-06 10 views
1

ich derzeit einen Daemon-Thread ausgeführt werden, der alle Zellenwerte packt berechnet, wenn eine Änderung gibt es, und dann abhängigen Zellen in einer Schleife schreibt, das heißt:Gspread - Listener ändern?

def f(): 
    while not event.is_set(): 
     update() 
     event.wait(15) 
Thread(target=f).start() 

Dies funktioniert, aber die Anrufe get-alle geschlungen sind signifikante I/O.

Anstatt dies zu tun, wäre es viel sauberer, wenn der Thread über Änderungen von Google Tabellen benachrichtigt wurde. Gibt es eine Möglichkeit, dies zu tun?

Antwort

0

Ich konnte dies erreichen, indem eine HTTP-Anfrage ausgelöst wurde, wenn Google Tabellen eine Änderung feststellte.

Auf Google Sheets:

function onEdit (e) { 
    UrlFetchApp.fetch("http://myaddress.com"); 
} 

Python-Seite (w/Tornado)

import tornado.ioloop 
import tornado.web 

class MainHandler(tornado.web.RequestHandler): 
    def get(self): 
     on_edit() 
     self.write('Updating.') 

def on_edit(): 
    # Code here 
    pass 

app = tornado.web.Application([(r'/', MainHandler)]) 
app.listen(#port here) 
tornado.ioloop.IOLoop.current().start() 

Ich glaube nicht, diese Art von Funktionalität im Rahmen von gspread sein sollte, aber ich hoffe, Die Dokumentation hilft anderen.

1

I umformuliert my comment auf gspread Probleme GitHub suchen:

eine Änderungsmitteilung von Google Sheets Anfahrt mit Hilfe von installable triggers in Apps Script möglich ist. Sie richten eine benutzerdefinierte Funktion im Skripteditor ein und weisen dieser Funktion ein Triggerereignis zu. In dieser Funktion können Sie eine externe URL mit UrlFetchApp.fetch abrufen.

Auf der Abhörseite (Ihrem Webserver) haben Sie einen Handler für diese URL. Dieser Handler erledigt die Aufgabe. Abhängig von der Serverkonfiguration (viele Threads oder Prozesse) sollten Sie mögliche Wettlaufzustände vermeiden.

Ich habe auch nicht browsergesteuerte Updates nicht getestet. Wenn Sheets das gleiche Ereignis für diese Art von Updates auslösen, könnte es einen Fall für Endlosschleifen geben.