我有这种情况。我几个月前做过一个仍在谷歌网站上运行的脚本。 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份副本。
您认为问题在哪里?为什么谷歌网站脚本编辑器执行与嵌入谷歌网站的脚本执行之间存在不同的行为?
提前谢谢
答案 0 :(得分:1)
这是我们正在积极研究的已知错误。运行超过30秒的处理程序可能最多被调用3次。看到这个问题:
http://code.google.com/p/google-apps-script-issues/issues/detail?id=1504
答案 1 :(得分:0)
不确定这是您问题的实际原因,但方法createServerClickHandler()
在list of deprecated members,所以我建议按照建议更换它。
应该是这样的:(当然两个处理程序的修改相同; - )
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个服务器处理程序时,你不能确定哪个将首先执行。它还提供了更好的用户体验,因为它具有即时响应性(嗯,这是我的观点; - )