【问题标题】:Button firing only once Google Apps Script按钮仅触发一次 Google Apps 脚本
【发布时间】:2013-05-14 05:06:05
【问题描述】:

我试图让一个按钮多次触发(即多次单击),但它似乎不起作用。任何帮助将不胜感激。理论上它应该触发多次,但是当我在日志中检查它时它只会触发一次

function a 
{
...
 var addcolumnspanel = app.createHorizontalPanel().setId("addcolumnspanel");
  var addbuttonhandler = app.createServerHandler("addcolumn");
  var addbutton = app.createButton().setId("btnaddcolumn").setText("Add another column").addClickHandler(addbuttonhandler);  

...
return app;
}

function addcolumn()
{
...//Do some stuff
return app;
}

这是一个更精确的代码示例

//set global var
var counter = 1; 
var ss = SpreadsheetApp.getActiveSpreadsheet();
//Set up the Menu bar 
function onOpen() {
//  Logger.clear();
  var menuEntries = [ {name: "demo", functionName: "myFunction"}];
  ss.addMenu("Demo", menuEntries);

}

function myFunction() {

  var myapp = UiApp.createApplication().setHeight(430).setWidth(800);;
  var button = myapp.createButton("Clicky");
  var myhandler = myapp.createServerHandler("secondfunction");
  var myhandler = button.addClickHandler(myhandler)
  myapp.add(button);
  ss.show(myapp);
}

function secondfunction()
{
  counter++;
   Logger.log(counter);

}

【问题讨论】:

  • “多次开火”是什么意思?只有当用户手动点击按钮时才会调用addcolumn()函数
  • 是的,它只会在我第一次点击时触发。这意味着我每第二次点击它就不会触发。
  • 请提供更多代码!问题可能出在“做一些事情”这一行......
  • 完成。这个例子似乎不起作用。它应该增加我的计数器,但它没有。

标签: google-apps-script


【解决方案1】:

好的。问题出在计数器变量上。您不能在 Apps 脚本中以这种方式使用全局变量。请参阅this answer 了解更多信息。您可以使用 ScriptProperties 或 CacheService 作为替代方案。

var ss = SpreadsheetApp.getActiveSpreadsheet();
//Set up the Menu bar 
function onOpen() {
//  Logger.clear();
  var menuEntries = [ {name: "demo", functionName: "myFunction"}];
  ss.addMenu("Demo", menuEntries);
  // Store your counter in CacheService as a string.
  CacheService.getPrivateCache().put('counter','1',3600); 
}

function myFunction() {

  var myapp = UiApp.createApplication().setHeight(430).setWidth(800);;
  var button = myapp.createButton("Clicky");
  var myhandler = myapp.createServerHandler("secondfunction");
  var myhandler = button.addClickHandler(myhandler)
  myapp.add(button);
  ss.show(myapp);
}

function secondfunction()
{
   var cache = CacheService.getPrivateCache();
   var counter = parseInt(cache.get('counter'));
   counter ++; 
   cache.put('counter', counter.toString());
   Logger.log(counter);

}

【讨论】:

  • 是的,这是正确的。它在缓存服务中效果不佳,在 ScriptProperties 中效果很好,但来自 SQL 世界,我仍在为 ScriptDB 语法苦苦挣扎:例如存储一个值 ob = {counter:1},然后尝试将其取回并更新在不使用 .query({}) 拉动整个数据库的情况下的值 指针会有所帮助,但感谢您澄清这一点。奇怪的全局变量并不是我们通常认为的传统编程中的全局变量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多