【问题标题】:addTimer not working with global app in GASaddTimer 不适用于 GAS 中的全局应用程序
【发布时间】:2025-11-23 18:05:02
【问题描述】:

我阅读了(未记录的)addTmer 并希望使用它来更新 UI。

Auto refresh Google Apps Scripts webapp UI? 的示例运行良好

// This code works
function doGet(e)
{
 var app = UiApp.createApplication().setTitle('Test addTimer - createApplication in doget');
 var appLocal = app;

  var handler = appLocal.createServerHandler("update");
  appLocal.addTimer(handler , 4000);

  var label = appLocal.createLabel(new Date()).setId("label"); 
  appLocal.add(label);

  return appLocal;
}

function update(e)
{
  var appLocal = UiApp.getActiveApplication();
//  var appLocal = app;
  appLocal.getElementById("label").setText(new Date());
  var handler = appLocal.createServerHandler("update");
  appLocal.addTimer(handler , 1000);

  return appLocal;
}

但是,如果我将 createApplication 从 doGet() 移出到全局变量中,则会在运行时发生“意外错误”。 如果没有 addTimer,可以将 createApplication 从 doget() 移到全局范围内。

// This code will crash at runtime
 var app = UiApp.createApplication().setTitle('Test addTimer , createApplication outside doGet');

function doGet(e)
{ 
  var appLocal = app;

  var handler = appLocal.createServerHandler("update");
  appLocal.addTimer(handler , 4000);

  var label = appLocal.createLabel(new Date()).setId("label"); 
  appLocal.add(label);

  return appLocal;
}

function update(e)
{
  var appLocal = UiApp.getActiveApplication();
//  var appLocal = app;
  appLocal.getElementById("label").setText(new Date());
  var handler = appLocal.createServerHandler("update");
  appLocal.addTimer(handler , 1000);

  return appLocal;
}

正如我所看到的全球使用

var app = createApplication();

我想更多的人也想使用 addTimer,我在这里发布我的经验。

也许有人可以解释为什么这是一个问题。

【问题讨论】:

    标签: google-apps-script


    【解决方案1】:

    当您在任何函数之外调用服务时,每次调用任何函数时都会执行此调用,也就是说,当调用 doGet 时,以及调用处理函数时以及计时器触发脚本执行时.

    这意味着您正在调用UiApp.createApplication() 2 次(甚至更多)...这不是一个好主意,会产生“意外错误”。

    顺便问一下,这种方法有什么好处?

    Uiapp 旨在与主服务调用和处理程序一起使用,每个处理程序都使用getActiveApplication() 获取活动实例,为什么要尝试以不同的方式使用它?

    【讨论】:

    • 如果你定义一个全局变量 var app = UiApp.createApplication(); UiApp.createApplication() 真的会被调用 X 次吗?那确实是非常低效的。使用全局变量的好处是您可以在每个函数中使用 'app' 而无需添加 var app = UiApp.getActiveApplication();在每个功能中。我已经更改了它=,它可以工作。
    • 是的,它会运行多次。您可以使用电子表格轻松验证这一点,并在“全局”调用中更改单元格颜色,并在调用任何函数时查看工作表。