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

标签 validation google-apps-script google-sheets

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

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

有任何想法吗?这可能吗??

最佳答案

我创建了一个 解决方法 对于这个问题,它的工作方式非常丑陋 - 从技术上说 - 并且略微不确定。

关于解决方法:
它的工作原理是基于 catch() 的 Web 浏览器实现的经验。函数允许访问从 Google 的 JS 代码部分抛出的错误。
如果单元格中的无效输入被验证规则拒绝,则系统将显示一条错误消息,用户编写的 GAS 可捕获该消息。为了使其首先工作,必须在指定的单元格上设置拒绝值,然后必须重新输入(修改)其值,然后 - 在此之后 - 调用 getDataValidation()内置函数允许用户捕捉必要的错误。
使用此方法只能测试单个电池,如 setCellValues()忽略任何数据验证限制(截至今天)。

缺点:

  • 不一定要重新检查此功能的有效性:
    它在值插入单元格后立即调用单元格验证函数。
    因此该函数的结果可能是错误的。
  • 由于单元格将被更改,代码会弄乱历史记录 - 如果它们被更改
    有效的。

  • 我已经在 Firefox 和 Chromium 上成功测试了它。
    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;
    }
    

    我仍然建议在上面由 Jonathon 打开的 Google 错误报告中加星。

    关于validation - 如何判断单元格值是否已通过验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27713365/

    相关文章:

    php - 模型更新时的 Laravel 必填字段

    javascript - 从 Google Apps 脚本网页上的 HTML Canvas 获取数据 URI

    javascript - Google 电子表格上的时间戳

    javascript - 如何在 Apps 脚本中展平和转置数组

    javascript - 从电子表格公式中提取有效单元格引用的正则表达式

    asp.net-mvc-3 - 自定义错误消息不适用于 asp net mvc 3 中的日期时间验证

    php - Cakephp 3 - 如何在验证过程中检索 'Table' 类中的当前登录用户?

    validation - 验证数据时抛出异常是好还是坏主意?

    javascript - 无法在谷歌应用程序脚本中使用记录器记录值

    google-apps-script - 如何将一个谷歌工作表复制到另一个不同的谷歌工作表