【问题标题】:How to refresh appmaker table on change in calendar event of a calendar(dynamic) on current day?如何在当天的日历(动态)的日历事件更改时刷新 appmaker 表?
【发布时间】:2019-12-10 02:43:41
【问题描述】:

我在 appmaker 中创建了一个应用程序。因为当特定日历的日历事件在当天发生任何变化时,都应该刷新一个表(即应该运行特定的 appscript 函数(客户端函数)以刷新表)。 如何设置这种类型的触发器?

我做了一些研发,发现日历API中有一个叫做watch函数的东西,但我不确定它是否对我的问题有用。

我指的是 appmaker 表格小部件。

如果设置 appscript 日历触发器,客户端刷新可能会出现问题。因为在表格上方的我的 ui 中,有一个下拉菜单可以选择 calendarId,它通过运行以下代码来刷新表格:

       var calendarId=app.pages.Events.descendants.Dropdown1.value;
       google.script.run.withSuccessHandler(function() {
         app.datasources.Events.load();
       }).getTodayEvents(calendarId); 

        /* In getTodayEvents() current day events of the calendarId are 
       fetched from that calendar and stored in DB */

这可以通过触发器从服务器端发生吗?

触发器也应该基于当前在下拉列表中选择的 calendarId。 所以 calendarId 在触发器中需要是动态的。

【问题讨论】:

    标签: google-apps-script google-calendar-api google-app-maker


    【解决方案1】:

    日历手表需要一个 webhook,当有事件修改(创建、更新、删除)时,该 webhook 将处理一些逻辑。不幸的是,App Maker 还不支持这样的事情,这里有一个关于它的讨论Calling App Maker server scripts from outside of App Maker UI。最重要的是,您需要与客户端而不是服务器进行交互,所以绝对不需要。

    在这种情况下,您可以做的最好的事情是设置一个间隔,每隔一定秒或几分钟刷新一次用户界面。

    setInterval(function(){
        app.datasources.myDatasource.load();
    },60000); //60 seconds
    

    解决此问题的更高级方法是使用 firebase 和云功能。我已经在一些项目上实施了 Firebase,并取得了可靠的结果。您可以在以下链接中阅读有关 Firebase 和云功能的更多信息:

    【讨论】:

    • 正如@Dimu 下面所说,是什么阻止他使用ScriptApp.createTrigger() 创建日历触发器?
    • @TheMaster 能否请您解释一下我应该如何通过使用这种触发器调用服务器脚本来刷新客户端?我将不胜感激!请注意这是一个 App Maker 项目。
    • 我希望客户端始终与 sql 保持同步。日历更改启动触发器 > 触发器服务器函数 > 函数更新 sql 表。即使客户端不同步,问题状态In that there is a table which should get refreshed。我不认为它指的是ui。 a particular appscript function should run to refresh the table。我相信这是一个服务器应用程序脚本功能。不过我可能错了。
    • @TheMaster 根据我使用 App Maker 的经验,如果您想查看数据库上的任何新更改,您需要手动或以编程方式刷新用户界面。问题是服务器脚本无法触发强制客户端刷新的操作,因此我认为 @DimuDesigns 建议的方法在这种情况下不可行。但是,由于 OP 假设服务器脚本可以执行这样的任务,这似乎有点令人困惑。我知道一个不可能的事实……除非我误解了 table 这个词。
    • @Morfin 猜你是对的。你能解释一下firebase/cloud功能如何/为什么会有所作为吗?如我所见,客户端的唯一方法是从客户端内部进行轮询,如您使用setInterval 所示。您是否建议轮询火力基地?
    【解决方案2】:

    这可能适用于您的用例,也可能不适用,但对于非应用程序制造商脚本项目,我会执行以下操作:

    • 通过https://script.google.com/home/my 访问您的 GSuite 开发者中心
    • 选择所需的脚本项目
    • 右侧是一个标题为“项目详细信息”的框,单击菜单图标(右上角)并选择“触发器”
    • 点击“添加触发器”按钮(右下角)
    • 在弹出的模式中选择您要运行的函数,并将事件源设置为“日历”。

    请注意,此“日历”触发器只能检测到您的主日历的更新。不会跟踪您创建的辅助日历的更改。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-14
      • 2016-03-16
      相关资源
      最近更新 更多