1

我有这种情况。几个月前我做了一个脚本,它仍在谷歌网站上运行。doGet 函数是:

    function doGet(e) {
  var myapp = UiApp.createApplication();


 var mygrid = myapp.createGrid(5, 2);
  var listboxAssociazione=myapp.createListBox().setId("listboxAssociazione").setName("listboxAssociazione");
  var labelAssociazione=myapp.createLabel("Associazione").setId("Associazione");
  var listboxMeseFatturato=myapp.createListBox().setId("listboxMeseFatturato").setName("listboxMeseFatturato");
  var labelMeseFatturato=myapp.createLabel("Mese da fatturare").setId("Mese da fatturare");
  var listboxAnnoFatturato=myapp.createListBox().setId("listboxAnnoFatturato").setName("listboxAnnoFatturato");
  var labelAnnoFatturato=myapp.createLabel("Anno").setId("Anno");
  var buttonCalcola=myapp.createButton().setText("Calcola").setId("CalcolaFattura");
  var labelLavoroInCorso=myapp.createLabel("").setId("labelLavoroInCorso").setStyleAttribute('color', 'blue');


  mygrid.setWidget(0, 0,labelAssociazione);
  mygrid.setWidget(0, 1, listboxAssociazione);
  mygrid.setWidget(1, 0, labelMeseFatturato);
  mygrid.setWidget(1, 1, listboxMeseFatturato);
  mygrid.setWidget(2, 0, labelAnnoFatturato);
  mygrid.setWidget(2, 1, listboxAnnoFatturato); 
  mygrid.setWidget(3, 1, buttonCalcola);
  mygrid.setWidget(4, 1, labelLavoroInCorso);

  var p=DocsList.getFolders();
  var totcartelle = p.length;
  var trovato= false;
  var cartellaAssociazioni;
  for(var j=0;j<totcartelle && trovato==false;j++){
    var prova=p[j].getId();
    if(p[j].getId()=="0B-H4Ioaio5w5YTg3MGFkOWQtMzYzNy00ZTFhLWEzY2YtZTVlNzIwYWJhMmJm"){
    trovato=true;
     cartellaAssociazioni=p[j]; 
    }

  }

  var cartelle =cartellaAssociazioni.getFolders();
   var lunghezza = cartelle.length;
  for(var i = 0; i < lunghezza; i++) //these arrays are zero based it looks like
   { var prova=cartelle[i].getName();
    listboxAssociazione.addItem(prova); 
   }


  //Aggiunta dei mesi alla listbox
  listboxMeseFatturato.addItem("Gennaio");
  listboxMeseFatturato.addItem("Febbraio");
  listboxMeseFatturato.addItem("Marzo");
  listboxMeseFatturato.addItem("Aprile");
  listboxMeseFatturato.addItem("Maggio");
  listboxMeseFatturato.addItem("Giugno");
  listboxMeseFatturato.addItem("Luglio");
  listboxMeseFatturato.addItem("Agosto");
  listboxMeseFatturato.addItem("Settembre");
  listboxMeseFatturato.addItem("Ottobre");
  listboxMeseFatturato.addItem("Novembre");
  listboxMeseFatturato.addItem("Dicembre");

  //Aggiunta dell'anno di fatturazione
  var d= new Date();
  var annoAttuale=parseInt(d.getFullYear());
  listboxAnnoFatturato.addItem(""+annoAttuale);
  listboxAnnoFatturato.addItem(""+(annoAttuale-1));


  var formpanel=myapp.createFormPanel().setId("form");


  var serverClickHandler = myapp.createServerClickHandler('GeneraFattura');
  serverClickHandler.addCallbackElement(formpanel);
  buttonCalcola.addClickHandler(serverClickHandler);

  var serverClickHandlerStatus = myapp.createServerClickHandler('ChangeStatus');
  serverClickHandlerStatus.addCallbackElement(formpanel);
  buttonCalcola.addClickHandler(serverClickHandlerStatus);




  formpanel.add(mygrid);
  myapp.add(formpanel);
  return myapp;
}


//Function to disable the button to avoid double click
function ChangeStatus(e){
  var app = UiApp.getActiveApplication();
  app.getElementById("labelLavoroInCorso").setText("Attendere! Calcolo della richiesta di pagamento in corso...");
  app.getElementById("CalcolaFattura").setEnabled(false);
  return app;
}

现在我的问题是,当我单击站点中的“Calcola”按钮时,似乎“GeneraFattura”函数运行了许多随机次数而不是 1。

如果我使用我给出的相同 3 参数从 Google 站点中的脚本编辑器运行相同的函数

var valoreAssociazione = "Volley";
var valoreMese="May";
var valoreAnno = "2012";

而不是上面的表格,它可以正常工作。

当我说它工作正常时,我的意思是在“GeneraFattura”函数中,我只有一行复制电子表格。如果我从脚本编辑器运行脚本,则输出是电子表格的一份副本,如果我从站点运行脚本,我会得到电子表格的 5 6 份副本。

您认为问题出在哪里?为什么 google 站点脚本编辑器执行和嵌入在 google 站点中的脚本执行之间存在不同的行为?

先感谢您

4

2 回答 2

1

这是我们正在积极处理的已知错误。运行超过 30 秒的处理程序最终可能会被调用多达 3 次。看到这个问题:

http://code.google.com/p/google-apps-script-issues/issues/detail?id=1504

于 2012-07-03T15:16:02.187 回答
0

不确定这是您问题的实际原因,但该方法createServerClickHandler()已弃用的成员列表中,因此我建议按照建议替换它。

应该是这样的:( 当然,两个处理程序的修改相同;-)

  var serverClickHandler = myapp.createServerHandler('GeneraFattura');
  buttonCalcola.addClickHandler(serverClickHandler);
  serverClickHandler.addCallbackElement(formpanel);

注意:我还建议使用另一种方法来避免使用客户端处理程序多次单击您的按钮。它可以是这样的:

    //Client Handler to disable the button to avoid double click (insert in the UI definition function)
      var msg = app.getElementById("labelLavoroInCorso").setText("Attendere! Calcolo della richiesta di pagamento in corso...").setVisible(false);
      var Clienthandler = app.createClientHandler()
         .forEventSource().setEnabled(false);
         .forTargets(msg).setVisible(true);
         buttonCalcola.addClickHandler(Clienthandler)
    // then at the end of the serverhandler function you will have to re-enable the button and setVisible(false) the message

编辑:客户端处理程序的兴趣在于它立即生效,当您使用 2 个服务器处理程序时,您无法确定哪个将首先执行。由于即时响应能力,它还提供了更好的用户体验(嗯,这是我的观点 ;-)

于 2012-07-03T09:43:53.497 回答