Gspread - 更改监听器?

Gspread - Change Listener?

我目前 运行 一个守护线程,它获取所有单元格值,计算是否有变化,然后在循环中写出依赖单元格,即:

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

这可行,但循环的 get-all 调用很重要 I/O。

与其这样做,不如通过 Google Sheets 通知线程更改会干净得多。有办法吗?

我在 gspread GitHub 的问题上改写了 my comment

installable triggers in Apps Script. You set up a custom function in the Scripts editor and assign a trigger event for this function. In this function you can fetch an external url with UrlFetchApp.fetch 的帮助下,可以从 Google 表格中获取更改通知。

在监听端(您的网络服务器),您将拥有一个处理程序 url。这个处理程序将完成这项工作。根据服务器配置(许多线程或进程)确保避免可能的竞争条件。

此外,我还没有测试非浏览器触发的更新。如果表格针对此类更新触发相同的事件,则可能会出现无限循环。

只要 Google Sheets 检测到更改,我就可以通过触发 HTTP 请求来实现此功能。

在 Google 张上:

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

Python-侧(带龙卷风)

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()

我认为这种功能不应该在 gspread 的范围内,但我希望文档对其他人有所帮助。