3

描述很简单:我有三个复选框,第三个必须在选中时选中所有其他复选框(一旦取消选中,也必须取消选中它们)。所有这些都必须在一个网格中,我不能使用 html 或任何其他语言,只能使用 Google Apps 脚本。

这对你来说可能是一个简单的任务,但我在 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

上次我尝试使用带有复选框的 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 回答
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)
}

编辑:按照 Henrique 的评论(非常聪明!!谢谢),这里有一个“完整的复选框”版本,效果很好;-)

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 回答
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 回答