addTimer无法在GAS中使用全局应用程序

时间:2014-06-20 11:45:58

标签: google-apps-script

我读到了(未记录的)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,我在这里发布我的经验。

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

1 个答案:

答案 0 :(得分:1)

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

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

顺便说一下,这种方法的优点是什么?

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