0

以下のコードは私に頭痛の種を与えています。これは、2つのラジオボタンと1つのボタンを備えた非常にシンプルなアプリケーションです。このアプリのアイデアは、選択したラジオボタンの値をスプレッドシートに記録することです。ここで、最初のラジオボタン(「1」)を選択してから2番目のラジオボタン(「2」)に変更してから「1」に戻り、「録音」ボタンをクリックすると、アプリは3回録音します。スプレッドシート。それは一種の選択を蓄積します。

私が自分自身を明確にしたかどうかはわかりませんが、問題をシミュレートする手順は次のとおりです。

1-以下のアプリケーションを実行します。2-ラジオボタン「1」を選択し、次に「2」と「1」をもう一度選択して、「記録」ボタンを押します。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);
}
4

2 に答える 2

1

通常の排他的論理和モードで機能するには、ラジオボタンの名前が同じである必要があります。ドキュメントを参照すると、標準のパネルで使用する場合にこれが必要であることがわかります。簡単な例を次に示します。

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;
}​
于 2012-06-05T21:04:08.733 に答える
1

私はあなたのコードの振る舞いを理解していませんが、それは適切ではなく、あまりにも複雑すぎると思います。

最初に、名前を「グループ」に設定する2つのラジオボタンを作成します。これは正しいですが、作成直後に、名前をそれぞれ「myRadio1」と「myRadio1」で上書きします。各ラジオボタンにサーバー変更ハンドラーを追加します。

同じ名前の2つのラジオボタンを「グループ」のままにしておくと、クリックすると自動的に互いに切り替わります。したがって、クリックハンドラーを追加する必要はありません。

それらは同じ名前「group」を共有しているため、「e.parameter.group」パラメータを使用して、それらの状態(最初のラジオボタンが選択されている場合は「false」、2番目のラジオボタンが選択されている場合は「true」)にアクセスできます。検証ボタンのクリックハンドラーのコールバック関数。

簡略化して修正したコードは次のとおりです。

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);
}
于 2012-06-07T09:09:21.950 に答える