1

私はこのような状況にあります。数か月前にスクリプトを作成しましたが、これはまだ Google サイトで実行されています。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」には、スプレッドシートをコピーする行が1行しかないことを意味します。スクリプト エディターからスクリプトを実行すると、スプレッドシートの 1 つのコピーが出力されます。サイトからスクリプトを実行すると、スプレッドシートの 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 に答える