【问题标题】:Using a custom function in Data Validation在数据验证中使用自定义函数
【发布时间】:2014-12-09 17:14:14
【问题描述】:

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

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

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

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

function validateContent() {

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

  if (val == value) return true;

  return false;

}

【问题讨论】:

  • 对不起。我以为我已经发表了评论。 C8 细胞只是一个例子。它可以是我想要验证的任何单元格。
  • 有一个函数可以将其与不同的源进行比较并返回真或假取决于它是否有效。如前所述,该函数甚至还没有被调用。

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


【解决方案1】:

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

=ISODD(C8)

在你的情况下:

=validateContent(C8)

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

不过,我发现自定义函数在验证中似乎不起作用!请参见以下示例:

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

我得出的结论是,当前自定义函数未实现用于验证。

【讨论】:

  • 这是真的,但是您可以执行上述操作,其中另一列保存自定义函数的输出并设置验证公式以检查在这种情况下 I 列的相应行 == TRUE。即“=(I2 == TRUE)”
  • 我认为这不是使用验证生成器所需的正确方法
【解决方案2】:

目前,函数不能用于验证,但有一个解决方法:

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

【讨论】:

    【解决方案3】:

    我还认为自定义函数不适用于数据验证。

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

    【讨论】:

    • 嘿 Spyros Theodosis,你终于让它工作了吗?希望如此。你能这么好心地分享一下吗?谢谢
    【解决方案4】:

    给你:)

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-25
      • 2010-10-01
      • 2023-01-24
      相关资源
      最近更新 更多