簡體   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