3

大家好,

我可以在处理函数中使用全局变量,但是我不能在函数中“全局”修改它们。

在下面的代码中,第一次单击后它将显示数字 1001(处理程序读取、递增并显示正确的结果)。但是,任何进一步的点击将始终显示 1001,因此处理程序会继续读取原始 globalVar 值:它没有像我预期的那样被修改。

我能做些什么来解决这个问题?

var globalVar = 1000;

function testingGlobals() {
  var app = UiApp.createApplication();
  var doc = SpreadsheetApp.getActiveSpreadsheet();
  var panel = app.createVerticalPanel().setId('panel');
  app.add(panel);
  panel.add(app.createButton(globalVar).setId("globalVar").addClickHandler(app.createServerHandler("chgGlobal").addCallbackElement(panel)));
  doc.show(app)
}

function chgGlobal(e) {
  var app = UiApp.createApplication();
  globalVar++;
  app.getElementById("globalVar").setText(globalVar);
  return app;
}
4

2 回答 2

6

您不能以这种方式增加全局变量,因为每次执行处理程序时,都会初始化全局变量然后对其进行操作。您可以使用隐藏的表单域来保存您可以在处理程序中更改的变量,并且只要应用程序打开,它将是持久的。

例如

function testingGlobals() {
  var app = UiApp.createApplication();
  var doc = SpreadsheetApp.getActiveSpreadsheet();
  var panel = app.createVerticalPanel().setId('panel');
  var myVar = app.createHidden().setValue('0').setName('myVar').setId('myVar');
  panel.add(myVar);
  app.add(panel);
  panel.add(app.createButton('0').setId("globalVar").addClickHandler(app.createServerHandler("chgGlobal").addCallbackElement(panel)));
  doc.show(app)
}

function chgGlobal(e) {
  var app = UiApp.createApplication();
  gloabalVar = parseInt(e.parameter.myVar);
  gloabalVar ++;
  app.getElementById('myVar').setValue(gloabalVar.toString());
  app.getElementById("globalVar").setText(gloabalVar);
  return app;
}
于 2012-09-23T07:20:01.233 回答
3

您可以将数据保存在 CacheService(快速但不保证)或 ScriptProperties 或 ScriptDb(慢一点,但可以保存)而不是全局属性中。特别是 ScriptDb 可以保存对象,而无需使用字符串来存储它们。

于 2012-09-24T19:21:15.403 回答