如何判断单元格值是否已通过验证

时间:2014-12-30 22:14:15

标签: validation google-apps-script google-sheets

我熟悉Google Apps脚本DataValidation对象。获取和设置验证标准。但是如何以编程方式判断单元格值是否实际有效。所以我可以在电子表格中看到小红色验证失败消息,但是通过代码可以获取单元格当前未通过验证的事实吗?

我试图看看是否有一个单元属性告诉你这个但是没有。我也寻找某种DataValidation“验证”方法 - 即根据验证规则测试一个值,但没有任何一个

有什么想法吗?这可能吗?

3 个答案:

答案 0 :(得分:3)

我已经为这个问题创建了一个解决方法,这个问题非常丑陋 - 技术上说 - 并且稍有不确定。

关于解决方法: 它的工作原理是getDataValidation()函数的Web浏览器实现允许从Google的JS代码部分访问抛出的错误。 如果验证规则拒绝对单元格的无效输入,则系统将显示可由用户编写的GAS捕获的错误消息。为了使其首先工作,必须在指定的单元格上设置拒绝值,然后必须重新输入(修改)其值,然后在此之后调用setCellValues()内置函数允许用户抓住必要的错误。 由于function getCellValidity(cell) { var origValidRule = cell.getDataValidation(); if (origValidRule == null || ! (cell.getNumRows() == cell.getNumColumns() == 1)) { return null; } var cell_value = cell.getValue(); if (cell_value === '') return true; // empty cell is always valid var is_valid = true; var cell_formula = cell.getFormula(); // Storing and checking if cell validation is set to allow invalid input with a warning or reject it var reject_invalid = ! origValidRule.getAllowInvalid(); // If invalid value is allowed (just warning), then changing validation to reject it // IMPORTANT: this will not throw an error! if (! reject_invalid) { var rejectValidRule = origValidRule.copy().setAllowInvalid(false).build(); cell.setDataValidation(rejectValidRule); } // Re-entering value or formula into the cell itself var cell_formula = cell.getFormula(); if (cell_formula !== '') { cell.setFormula(cell_formula); } else { cell.setValue(cell_value); } try { var tempValidRule = cell.getDataValidation(); } catch(e) { // Exception: The data that you entered in cell XY violates the data validation rules set on this cell. // where XY is the A1 style address of the cell is_valid = false; } // Restoring original rule if (rejectValidRule != null) { cell.setDataValidation(origValidRule.copy().setAllowInvalid(true).build()); } return is_valid; } 忽略了任何数据验证限制(截至今天),因此只能使用此方法测试单个单元格。

<强>缺点:

  • 此功能不一定需要重新检查有效性: 它在将值插入单元格后立即调用单元验证功能。 因此,此功能的结果可能有问题。
  • 代码会破坏历史,因为细胞会被改变 - 如果是的话 有效的。

我已经在Firefox和Chromium上成功测试过它。

wrap_content

我仍然建议主演由Jonathon打开的上述Google错误报告。

答案 1 :(得分:0)

对于您的问题的具体答案,Google Apps脚本中没有任何方法可以返回{。1}}的有效性,例如.isValid()。如您所述,您可以使用Range对程序设计进行逆向工程,然后解析其结果,以便再次验证Range.getDataValidations()调用的值。

这是一个很好的建议。我已向问题跟踪器添加了功能请求 - &gt; Add a Star to vote it up

答案 2 :(得分:0)

我正在使用此解决方案。简单易学,使用快速!您可能需要根据需要调整此代码。希望你喜欢

function test_corr(link,name) {
  var ss = SpreadsheetApp.openByUrl(link).getSheetByName(name);
  var values = ss.getRange(2,3,200,1).getValues();
  var types = ss.getRange(2,3,200,1).getDataValidations()
  var ans
  for (var i = 0; i < types.length; i++) {
    if (types[i][0] != null){
      var type = types[i][0].getCriteriaType()
      var dval_values = types[i][0].getCriteriaValues() 
      ans = false
      if (type == "VALUE_IN_LIST") {
        for (var j = 0; j < dval_values[0].length; j++) {
          if (dval_values[0][j] == values[i][0]) { ans = true } 
        }
      } else if (type == "NUMBER_BETWEEN") {
        if (values[i][0] >= dval_values[0] && values[i][0] <= dval_values[1]) { ans = true }
      } else if (type == "CHECKBOX") {
        if (values[i][0] == "Да" || values[i][0] == "Нет") { ans = true }
      }
      if (!ans) { return false }
    }
  }
  return true;
}