我熟悉 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/