3

説明は簡単です。3つのチェックボックスがあり、3つ目のチェックボックスは、選択時に他のすべてを選択する必要があります(チェックを外すと、それらも選択解除します)。これはすべてグリッド内にある必要があります。HTMLや他の言語は使用できませんが、GoogleAppsScriptを使用できます。

これはおそらくあなたにとって簡単な作業ですが、私はjavascriptと英語の両方で多くの苦労をしています。とにかくここにコードがあります:

function checkboxes() {
  var range = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = range.getSheetId();
  var myapp = UiApp.createApplication().setTitle('Title').setWidth(1000).setHeight(100);
  var mygrid = myapp.createGrid(3, 3).setCellPadding(5).setCellSpacing(5);

  //One
  mygrid.setWidget(0, 0, myapp.createLabel('One').setId('One'));
  mygrid.setWidget(0, 1, myapp.createCheckBox().setName('One'));

  //Two
  mygrid.setWidget(1, 0, myapp.createLabel('Two').setId('Two'));
  mygrid.setWidget(1, 1, myapp.createCheckBox().setName('Two'));

  var handler1 = myapp.createClientHandler().forTargets(myapp.getElementById('One')).setValue(true).forTargets(myapp.getElementById('Two')).setValue(true);

  //Last
  mygrid.setWidget(2, 0, myapp.createLabel('Last').setId('Last'));
  mygrid.setWidget(2, 1, myapp.createCheckBox().setName('Last').OnClickHandler(handler1));
  //...
}
4

3 に答える 3

1

クライアントハンドラーで可能な回避策は次のとおりです:(テスト済み)

個人的には、id で変数を取得する代わりに、ウィジェットの作成に変数を使用する方が簡単で明確だと思います...数行のコードを書くだけですが、読みやすいです ;-)

function checkboxes() {
  var range = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = range.getSheetId();
  var app = UiApp.createApplication().setTitle('Title').setWidth(200).setHeight(150);
  var grid = app.createGrid(4, 3).setCellPadding(5).setCellSpacing(5);

  //One
  var one = app.createCheckBox().setName('One');
  grid.setWidget(0, 0, app.createLabel('One').setId('One'));
  grid.setWidget(0, 1, one);

  //Two
  var two = app.createCheckBox().setName('Two')
  grid.setWidget(1, 0, app.createLabel('Two').setId('Two'));
  grid.setWidget(1, 1, two);

  //three
  var three = app.createCheckBox().setName('Three')
  grid.setWidget(2, 0, app.createLabel('Three').setId('Three'));
  grid.setWidget(2, 1, three);
  //...
  var r1 = app.createRadioButton('radio').setHTML('All');
  var r2 = app.createRadioButton('radio').setHTML('None');
  grid.setWidget(3, 0, r1)
  grid.setWidget(3, 1, r2)

  var Chandler1 = app.createClientHandler().forTargets(one,two,three).setValue(true)
  r1.addClickHandler(Chandler1)
  var Chandler2 = app.createClientHandler().forTargets(one,two,three).setValue(false)
  r2.addClickHandler(Chandler2)
  app.add(grid)
  var doc = SpreadsheetApp.getActive()
  doc.show(app)
}

EDIT : Henrique のコメントに従ってください (非常に賢い !! ありがとう) ここでは、正常に動作する「完全な checkBoxes」バージョンがあります ;-)

function checkboxes2() {
  var range = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = range.getSheetId();
  var app = UiApp.createApplication().setTitle('checkBoxes test').setWidth(200).setHeight(150);
  var grid = app.createGrid(4, 3).setCellPadding(5).setCellSpacing(5);

  var one = app.createCheckBox().setName('One');
  grid.setWidget(0, 0, app.createLabel('One').setId('One'));
  grid.setWidget(0, 1, one);

  var two = app.createCheckBox().setName('Two')
  grid.setWidget(1, 0, app.createLabel('Two').setId('Two'));
  grid.setWidget(1, 1, two);

  var allP = app.createVerticalPanel()
  var allA = app.createCheckBox().setName('allA');
  var allB = app.createCheckBox().setName('allB').setVisible(false);
  var allP = app.createVerticalPanel().add(allA).add(allB);
  grid.setWidget(2, 0, app.createLabel('All').setId('all'));
  grid.setWidget(2, 1, allP);

  var ChandlerA = app.createClientHandler().forTargets(one,two,allB).setValue(true).forTargets(allB).setVisible(true).forEventSource().setVisible(false);
  allA.addClickHandler(ChandlerA)
  var ChandlerB = app.createClientHandler().forTargets(one,two,allA).setValue(false).forTargets(allA).setVisible(true).forEventSource().setVisible(false);
  allB.addClickHandler(ChandlerB)
  app.add(grid)
  var doc = SpreadsheetApp.getActive()
  doc.show(app)
}
于 2012-07-19T19:06:49.933 に答える
1

前回試したときは、チェックボックスで ClientHandlers 検証を使用することはできませんでした。したがって、より遅いサーバーハンドラーに固執する必要があるため、ユーザーが何かが行われていることを知るために、小さな無限の進行状況の gif を追加する必要がある場合があります。

私が使用するソリューションの例を次に示します。

function mygui() {
  var imgUrl = 'https://f0839004-a-62cb3a1a-s-sites.googlegroups.com/site/hgabreu/files/ajax-loader.gif';
  //I may remove this image from this url at any time. Host yours in a place you control

  var app = UiApp.createApplication().setTitle('CheckAll example');
  var panel = app.createVerticalPanel();

  var boxes = ['Example 1', 'Test', 'Last check'];
  var groupName = 'myCheckBoxes';

  var groupAll = groupName+','+boxes.length;
  var image = app.createImage(imgUrl).setId(groupName+',img').setVisible(false);
  var checkAll = app.createCheckBox("Check All").setId(groupAll).setName(groupAll).addValueChangeHandler(
    app.createServerHandler('checkAll_').addCallbackElement(panel)).addValueChangeHandler(
      app.createClientHandler().forEventSource().setVisible(false).forTargets(image).setVisible(true));

  panel.add(checkAll).add(image);
  for( var i in boxes )
    panel.add(app.createCheckBox(boxes[i]).setId(groupName+','+i));

  SpreadsheetApp.getActive().show(app.add(panel));
}

function checkAll_(e) {
  var app = UiApp.getActiveApplication();
  var p = e.parameter; //just shortening
  var checkState = p[p.source] == 'true';
  var parts = p.source.split(',');
  var groupName = parts[0];
  var size = +parts[1];
  for( var i = 0; i < size; ++i )
    app.getElementById(groupName+','+i).setValue(checkState);
  app.getElementById(groupName+',img').setVisible(false);
  app.getElementById(p.source).setVisible(true);
  return app;
}
于 2012-07-13T19:47:24.020 に答える
0

今日、私はついにあなたのコードを見る時間がありました。あなたのサポートに感謝します。

あなたがコメントで言ったように、私は画像をまったく必要としないので、関数 mygui からそれを取り出そうとしています。それができるかどうか見てみましょう:

function mygui() {
  var app = UiApp.createApplication().setTitle('CheckAll example');
  var panel = app.createVerticalPanel();

  var boxes = ['Example 1', 'Test', 'Last check'];
  var groupName = 'myCheckBoxes';

  var groupAll = groupName+','+boxes.length;
  var checkAll = app.createCheckBox("Check All").setId(groupAll).setName(groupAll).addValueChangeHandler(
    app.createServerHandler('checkAll_').addCallbackElement(panel));

  panel.add(checkAll);
  for( var i in boxes )
    panel.add(app.createCheckBox(boxes[i]).setId(groupName+','+i));

  SpreadsheetApp.getActive().show(app.add(panel));
}

行番号 2、3、および 8 をキャンセルしてから、行番号 9 および 10 を切り詰めました。これで、予期しないエラーが発生したため、エラー メッセージに対応することができます。

于 2012-07-19T16:34:13.587 に答える