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

时间:2014-12-09 17:14:14

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

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

For a cell I add a custom function call

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

根本没有调用函数本身。

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

function validateContent() {

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

  if (val == value) return true;

  return false;

}

4 个答案:

答案 0 :(得分:5)

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

=ISODD(C8)

在你的情况下:

=validateContent(C8)

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

尽管如此,我发现自定义函数似乎无法在验证中运行!请参阅以下示例: Example of faulty validation using custom functions

在此屏幕截图中,单元格G2使用自定义验证函数(=ssvDataVerify(G2)),其评估为TRUE但显示为无效(红色角落)!作为证明,单元格I2的数据值是=ssvDataVerify(G2)。现在验证I2是否为I2,现在显示为正确验证了!

我的结论是,目前没有实现自定义函数来进行验证。

答案 1 :(得分:4)

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

我创建了一个函数来检查字符串值,对着一个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;
  }
}

答案 2 :(得分:3)

目前,功能不能用于验证,但有一种解决方法:

  • 在某个单元格中使用自定义函数,假设 B2 =validateContent(A2)
  • 使用条件Custom Formula is - &gt;为单元格 A2 添加验证=B2

答案 3 :(得分:0)

您在这里:)

想法是在单元格被编辑后建立验证规则

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";
}