Google apps script 使用ClientHandler.validateMatches方法。

Google apps script 使用ClientHandler.validateMatches方法。,google-apps-script,Google Apps Script,我试图使用ClientHandler.validateMatches()方法来隐藏/显示和启用/禁用ui的某些元素。我添加了两个clienthandler,但实际上只有一个看起来像预期的那样执行。代码如下: function doGet(e) { var app = UiApp.createApplication(); var grid = createAdultInfoGrid(135, 8); app.add(grid); return app; } /* Element

我试图使用ClientHandler.validateMatches()方法来隐藏/显示和启用/禁用ui的某些元素。我添加了两个clienthandler,但实际上只有一个看起来像预期的那样执行。代码如下:

function doGet(e) {
  var app = UiApp.createApplication();
  var grid = createAdultInfoGrid(135, 8);

  app.add(grid);
  return app;
}

/* Element id for adult-specific information grid element */
var GRID_ADULTS_ID = 'G_AdultInfo';
/* Element id for driver status field */
var PARTICIPANT_DRIVER_ID = 'P_IsDriver';
/* Element id for seatbelt count field */
var PARTICIPANT_SEATBELT_COUNT_ID = 'P_BeltCount';
/* Element id for seatbelt count status message field */
var PARTICIPANT_SEATBELT_MSG_ID = 'P_BeltCountMsg';

/**
 * Creates a new grid for display of adult-specific information using the GRID_ADULTS_ID constant as its id
 * @param pLblWidth - the width to be used for labels
 * @param pCellPadding - the value to be used for cell padding in the resulting grid
 */
function createAdultInfoGrid(pLblWidth, pCellPadding) {
  Logger.log("Creating adult participant information grid . . .");
  var app = UiApp.getActiveApplication();
  var grid = app.createGrid(2, 3).setId(GRID_ADULTS_ID).setCellPadding(pCellPadding);

  Logger.log("Creating listbox - driver . . .");
  var lstBoxDriver = app.createListBox().setId(PARTICIPANT_DRIVER_ID).setName('DriverStatus');
  lstBoxDriver.setVisibleItemCount(1);
  lstBoxDriver.addItem('Yes');
  lstBoxDriver.addItem('No');  
  lstBoxDriver.setItemSelected(0, true);

  Logger.log("Creating textbox - seatbelts . . .");
  var txtBoxSeatBelts = app.createTextBox().setId(PARTICIPANT_SEATBELT_COUNT_ID).setValue('2');
  var labelBeltStatus = app.createLabel('Please enter a number between 1 and 15.').setId(PARTICIPANT_SEATBELT_MSG_ID).setWidth(pLblWidth * 2).setVisible(false);
  var driverYesHandler = app.createClientHandler()
      .validateMatches(lstBoxDriver, '([Yy][Ee][Ss]){1}')
      .forTargets(txtBoxSeatBelts)
      .setText('')
      .setEnabled(true)
      .setVisible(true)
      .setStyleAttribute("color", "black")
      .setStyleAttribute("background", "white")
      .forTargets(labelBeltStatus)
      .setVisible(false);

  var driverNoHandler = app.createClientHandler()
      .validateMatches(lstBoxDriver, '([Nn][Oo]){1}')
      .forTargets(txtBoxSeatBelts)
      .setText('0')
      .setEnabled(false)
      .setVisible(true)
      .setStyleAttribute("color", "black")
      .setStyleAttribute("background", "white")
      .forTargets(labelBeltStatus)
      .setVisible(false);

  lstBoxDriver.addChangeHandler(driverYesHandler);
  lstBoxDriver.addChangeHandler(driverNoHandler);

  Logger.log("Adding listbox - driver . . .");
  grid.setWidget(0, 0, app.createLabel('I am willing to drive:').setWidth(pLblWidth));
  grid.setWidget(0, 1, lstBoxDriver);

  Logger.log("Adding textbox - seatbelts . . .");
  grid.setWidget(1, 0, app.createLabel('Seatbelts:').setWidth(pLblWidth));
  grid.setWidget(1, 1, txtBoxSeatBelts);
  grid.setWidget(1, 2, labelBeltStatus);

  app.close();
  return grid;
}
在浏览器中访问时,我可以将列表框从“是”更改为“否”,并且ClientHandler可以工作(文本设置为0,字段被禁用,等等)。但是,当列表框从“否”更改为“是”时,不会执行预期的操作-表单仍处于相同的状态。我已经尝试使用“Yes”和“No”作为regex模式,并指定了“I”标志——还尝试使用validateNotMatch()方法,但没有效果。在对默认值进行第一次更改后,似乎不会捕获该事件。如有任何建议,将不胜感激

提前感谢,
dgg查看打开的错误。
clienthandler和listbox存在一个bug,因此不管验证如何,处理程序都会启动。因此,您的两个处理程序都在启动,并且由于您的“No”处理程序是最后添加的,所以它是最后运行的处理程序。您可以通过颠倒添加changeholders的顺序来证明这一点。

似乎已经存在了足够长的时间,最好能找到一个解决方案。据说第1226号问题就是这样。