繁体   English   中英

在数据验证中使用自定义函数

[英]Using a custom function in Data Validation

我正在尝试使用在 Google Script 中开发的自定义函数来验证电子表格中的值。

对于一个单元格,我添加了一个自定义函数调用

但是我得到了一个回应:有一个问题“输入一个满足公式的值:=validateContent()”

函数本身根本没有被调用。

我是否使用自定义函数将 Google 电子表格验证推得太远了?
我期待我的函数返回 true 或 false,它是如何工作的?

function validateContent() {

  var val = SpreadsheetApp.getActiveSpreadsheet().getActiveCell().getValue();

  if (val == value) return true;

  return false;

}

首先,要验证当前单元格输入,遵循 google 建议的模式很有用:

=ISODD(C8)

在你的情况下:

=validateContent(C8)

验证生成器足够智能,可以将单元格引用正确转换为所有其他单元格! 即,如果此验证应用于 C8:C100,则单元格 C42 的验证将读取=ISODD(C42)

尽管如此,我发现自定义函数似乎在验证中不起作用! 请参阅以下示例:使用自定义函数的错误验证示例

在此屏幕截图中,单元格 G2 使用自定义验证函数( =ssvDataVerify(G2) ),其计算结果为 TRUE 但显示为无效(红角)! 作为证明,单元格 I2 的数据值为=ssvDataVerify(G2) 现在验证如果 I2 是 =I2,现在显示为正确验证!

我得出的结论是,当前没有实现自定义函数来处理验证。

我也相信自定义函数不适用于数据验证。

我创建了一个函数来根据 RegExp 列表检查字符串值,但它不起作用:

function vaidate(){
  var range = SpreadsheetApp.getActive().getRange('A1');
  var validation = SpreadsheetApp.newDataValidation().requireFormulaSatisfied('=checkValid(A1)').build();
  range.setDataValidation(validation);
}


function checkValid(text){
  var regexs = [/\|{2,}/g,/\.{2,}/g,];
  var valid = true;
  for(var i=0;i<regexs.length;i++){
    if(testString(text,regexs[i])){
      valid = false;
      break;
    }
  }
  return valid;
}

function testString(str, regex){
  try{
     var localRegex = regex;
     return localRegex.test(str);
  }catch(e) {
    return false;
  }
}

目前,无法在验证中使用函数,但有一个解决方法:

  • 在某些单元格中使用您的自定义函数,假设B2 : =validateContent(A2)
  • 使用条件Custom Formula is单元格A2添加验证 -> =B2

干得好 :)

这个想法是在编辑单元格后构建验证规则

function onEdit(e){
  const isValid = validateValue(e.value);
  const rule = SpreadsheetApp
  .newDataValidation("Yep")
   // You can use any function but i believe you only need to use "EQ" with boolean 
  .requireFormulaSatisfied('=EQ("'+isValid+'","TRUE")')
   // Your help message
  .setHelpText('Please Enter "123" :P')
   // Building the rule 
  .build();
  e.range.setDataValidation(rule);
}

function validateValue(value){
  // do what ever you want ;)
  return value === "123";
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM