2014-12-30 35 views
0

我熟悉Google Apps腳本DataValidation對象。獲取和設置驗證標準。但是如何以編程方式告訴單元格值是否真的有效。因此,我可以在電子表格中看到小紅色的驗證失敗消息,但是單元格當前驗證失敗的事實是否可以通過代碼獲取?Google應用程序腳本 - 如何判斷單元格值是否已通過驗證

我試圖看看是否有一個單元屬性告訴你,但沒有。此外,我尋找某種DataValidation「驗證」方法 - 即根據驗證規則測試一個值,但沒有任何內容

任何想法?這可能嗎??

非常感謝

克里斯

+0

可以使用'onEdit()'函數,該函數在每次編輯圖紙時都會運行。 [Google文檔 - onEdit()](https://developers.google.com/apps-script/guides/triggers/#onedit) –

回答

0

具體回答你的問題,有谷歌Apps腳本內沒有方法將返回的Range如.isValid()的有效性。正如你所說的,你可以使用Range.getDataValidations()來逆向工程一個程序化的程序,然後解析結果以再次驗證Range.getValues()調用的值。

這是一個很好的建議。我向問題跟蹤器添加了功能請求 - >Add a Star to vote it up

+0

已投票並感謝您:-) – kiwichris

1

我爲此問題創建了一個解決方法,該工作以非常難看的技術說法和稍微未確定的方式工作。

關於解決方法: 它工作經驗的基礎上認爲catch()功能的Web瀏覽器實現允許從谷歌的JS代碼部分訪問引發的錯誤。 如果一個單元格的無效輸入被驗證規則拒絕,那麼系統將顯示一條錯誤消息,該消息可由用戶編寫的GAS捕獲。爲了使其工作首先必須在指定單元格上設置拒絕值,則必須重新輸入(修改)其值,然後在此之後 - 在調用getDataValidation()內置函數後允許用戶捕獲必要的錯誤。 只有單個單元格可以使用此方法進行測試,因爲setCellValues()忽略了任何數據驗證限制(截至今天)。

缺點:

  • 有效性不會必然重新檢查該功能: 它調用值插入到細胞後右側的單元格驗證功能。 因此此功能的結果可能有問題。
  • 代碼混亂了歷史,因爲單元格將被更改 - 如果它們是 有效。

我已經在Firefox和Chromium上成功測試過它。

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

我還是建議主演由Jonathon開的上面的Google bug報告。

相關問題