我熟悉Google Apps脚本DataValidation对象。获取和设置验证标准。但是如何以编程方式判断单元格值是否实际有效。所以我可以在电子表格中看到小红色验证失败消息,但是通过代码可以获取单元格当前未通过验证的事实吗?
我试图看看是否有一个单元属性告诉你这个但是没有。我也寻找某种DataValidation“验证”方法 - 即根据验证规则测试一个值,但没有任何一个
有什么想法吗?这可能吗?
答案 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;
}