2012-06-05 3 views
0

Код ниже дает мне головную боль. Это очень простое приложение с двумя переключателями и кнопкой. Идея этого приложения состоит в том, чтобы записать в электронную таблицу значение выбранной радиокнопки. Теперь, если я выберу 1-ю радиокнопку («один»), а затем перейду ко второму переключателю («два»), а затем вернусь к «одному» и нажмите кнопку «Запись», приложение будет записывать 3 раза в таблицу. Это как бы накапливает выбор.Странное поведение при использовании radioButton()

Не знаю, если я сделал себе ясно, но вот шаги, чтобы сымитировать вопрос:

1- Выполнить бланк; 2- Выберите радиокнопку «один», затем «два» и «один» еще раз и нажмите кнопку «Запись»; 3- Проверьте электронную таблицу на дублированные значения.

Чем больше вы будете нажимать на переключатели, тем больше дублирующихся значений будут записаны.

Любая идея, почему это происходит и как я могу преодолеть эту проблему?

function myAppFunction() { 
var mydoc = SpreadsheetApp.getActiveSpreadsheet(); 
var app = UiApp.createApplication().setTitle('Here is the title bar'); 
var panel = app.createVerticalPanel().setId('panel'); 

//using setName will give you the ability to get the value 
var myRadio1 = app.createRadioButton("group","one").setName('myRadio1').setId('myRadio1'); 
var myRadio2 = app.createRadioButton("group","two").setName('myRadio2').setId('myRadio2'); 
var button = app.createButton("Gravar").setId("record_"); 
//A label will be used to give feedback on the value of the checkBox 
var infoLabel = app.createLabel('Check the box and click submit').setId('infoLabel'); 

//handlers 
var handler = app.createServerChangeHandler('radio1'); 
handler.addCallbackElement(panel); 
myRadio1.addClickHandler(handler); 

var handler2 = app.createServerChangeHandler('radio2'); 
handler2.addCallbackElement(panel); 
myRadio2.addClickHandler(handler2); 


//put everything in the UI 
panel.add(myRadio1);  
panel.add(myRadio2); 
panel.add(button); 
panel.add(infoLabel); 

app.add(panel); 
mydoc.show(app); 
} 
function radio1(e){ 
var app = UiApp.getActiveApplication(); 
app.getElementById('myRadio2').setValue(false); 
app.getElementById('infoLabel').setText('one is: ' + e.parameter.myRadio1); 
var panel = app.getElementById("panel"); 
var button = app.getElementById("gravar"); 
var handler = app.createServerClickHandler("record_"); 
handler.addCallbackElement(panel); 
button.addClickHandler(handler); 
return app; 
} 

function radio2(e){ 
var app = UiApp.getActiveApplication(); 
app.getElementById('myRadio1').setValue(false); 
app.getElementById('infoLabel').setText('two is: ' + e.parameter.myRadio2); 
var button = app.getElementById("gravar"); 
var handler = app.createServerClickHandler("gravar_"); 
handler.addCallbackElement(app.getElementById("panel")); 
button.addClickHandler(handler); 

return app; 
} 
function record_(e) { 
var ss = SpreadsheetApp.getActiveSpreadsheet(); 
var sheet = ss.getSheetByName("Sheet1"); 
var lastRow = sheet.getLastRow(); 
var freeCell = sheet.getRange("A1").offset(lastRow, 0); 
freeCell.setValue(e.parameter.myRadio1); 
} 

ответ

1

Радио кнопка должна иметь такое же имя, чтобы работать в нормальном режиме исключающего ИЛИ, если вы обратитесь к doc вы заметите, что это требуется при использовании в стандартной панели. Вот простой пример:

function radiotest() { 
    var app = UiApp.createApplication(); 
    var panel = app.createVerticalPanel(); 
    var radioValue = app.createTextBox(); 
     radioValue.setId("radioValue").setName("radioValue").setVisible(false); 
    for(var i = 1; i < 10; i++){ 
    var name = 'choice '+i; 
    var handler = app.createClientHandler().forTargets(radioValue).setText(name); 
    panel.add(app.createRadioButton('radio',name).addValueChangeHandler(handler)); 
    } 
    panel.add(radioValue); 
    var getit=app.createButton("Valide").setId("val"); 
    panel.add(getit)     
    var handler = app.createServerHandler("valide") 
    handler.addCallbackElement(panel) 
    getit.addClickHandler(handler); 
    app.add(panel); 
SpreadsheetApp.getActiveSpreadsheet().show(app);// show app 
} 
// 
function valide(e){ ;// This function is called when key "validate" is pressed 
    var sh = SpreadsheetApp.getActiveSheet(); 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var RadioButton = e.parameter.radioValue;    
    sh.getRange('A1').setValue(RadioButton); 
    var app = UiApp.getActiveApplication(); 
    return app; 
}​ 
+0

Привет Serge INSAS. Спасибо за ответ. Но как это можно сделать при использовании GUI Builder? Я создал приложение с помощью GUI Builder, и там были добавлены переключатели. –

+0

идея такая же, вы можете взглянуть на [этот пример] (https://docs.google.com/spreadsheet/ccc?key=0AnqSFd3iikE3dFZ2ajhKblJxUlBFTU1pdjUtZVdLTWc#gid=0) перейти к сценарию в строке 464, где я установил чтобы ClientHandlers разрешали записывать значения радиоблока в текстовое поле. Затем значение считывается серверомHandler в этом текстовом поле. –

+0

Oooops, строка 456 ... not 464 ... btw гораздо проще установить обработчики в скрипте, чем в графическом интерфейсе, поэтому я обычно так делаю. –

1

Я не понимаю поведение вашего кода, но я думаю, что это не подходит и слишком сложным.

Сначала вы создаете два переключателя, которые назначают свое имя «группе», что правильно, но сразу же после создания вы переписываете свои имена соответственно «myRadio1» и «myRadio1», что не является ошибкой, но не полезно, поскольку это заставляет вас добавлять обработчик изменения сервера на каждый переключатель.

Если вы оставите два переключателя с одинаковым названием «группа», они автоматически переключаются между собой, когда вы нажимаете на них. Таким образом, вам не потребуется добавлять к ним обработчик кликов.

Поскольку они имеют одно и то же имя: «группа», вы сможете получить доступ к их состоянию («false», если выбрана первая радиокнопка, «истина», если выбрана вторая), используя «e.parameter». group "в функции обратного вызова обработчика нажатия кнопки подтверждения.

Вот ваш код упрощен и исправлено:

function myAppFunction() { 
    var mydoc = SpreadsheetApp.getActiveSpreadsheet(); 
    var app = UiApp.createApplication().setTitle('Here is the title bar'); 
    var panel = app.createVerticalPanel().setId('panel'); 

    // Create the radio buttons and add it to the panel 
    var myRadio1 = app.createRadioButton("group","one"); 
    var myRadio2 = app.createRadioButton("group","two"); 
    panel.add(myRadio1);  
    panel.add(myRadio2); 

    // Create the apply button, add click handler and add it to the panel 
    var button = app.createButton("Gravar").addClickHandler(app.createServerHandler("record_").addCallbackElement(panel)); 
    panel.add(button); 

    // Create the label and add it to panel 
    var infoLabel = app.createLabel('Check the box and click submit'); 
    panel.add(infoLabel); 

    // Add the panel in the GUI 
    app.add(panel); 

    // Show the GUI in the spreadsheet 
    mydoc.show(app); 
} 

function record_(e) { 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet = ss.getSheetByName("Sheet1"); 
    var lastRow = sheet.getLastRow(); 
    var freeCell = sheet.getRange("A1").offset(lastRow, 0); 
    freeCell.setValue(e.parameter.group); 
} 
+0

Ваше право по принципу, но ваш код будет работать только с 2 кнопками ... Если вас интересуют радиобаты, пожалуйста, посмотрите [этот пост] (http://stackoverflow.com/questions/11444798/how- для-знаю-which-radio-button-is), где представлены некоторые решения. –