【问题标题】:Gspread - Change Listener?Gspread - 更改侦听器?
【发布时间】:2016-07-06 13:54:50
【问题描述】:

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

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

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

如果不是这样做,如果线程被 Google 表格通知更改,它会更干净。有没有办法做到这一点?

【问题讨论】:

    标签: python gspread


    【解决方案1】:

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

    可以借助 Apps 脚本中的 installable triggers 从 Google 表格获取更改通知。您在脚本编辑器中设置了一个自定义函数,并为该函数分配了一个触发事件。在此函数中,您可以使用 UrlFetchApp.fetch 获取外部 url。

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

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

    【讨论】:

      【解决方案2】:

      只要 Google 表格检测到更改,我就可以通过触发 HTTP 请求来完成这项工作。

      在 Google 表格上:

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

      Python 端(带 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()
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-05-23
        • 1970-01-01
        • 1970-01-01
        • 2020-01-07
        • 2011-04-26
        • 2015-02-07
        相关资源
        最近更新 更多