我熟悉Google Apps腳本DataValidation對象。獲取和設置驗證標準。但是如何以編程方式告訴單元格值是否真的有效。因此,我可以在電子表格中看到小紅色的驗證失敗消息,但是單元格當前驗證失敗的事實是否可以通過代碼獲取?Google應用程序腳本 - 如何判斷單元格值是否已通過驗證
我試圖看看是否有一個單元屬性告訴你,但沒有。此外,我尋找某種DataValidation「驗證」方法 - 即根據驗證規則測試一個值,但沒有任何內容
任何想法?這可能嗎??
非常感謝
克里斯
我熟悉Google Apps腳本DataValidation對象。獲取和設置驗證標準。但是如何以編程方式告訴單元格值是否真的有效。因此,我可以在電子表格中看到小紅色的驗證失敗消息,但是單元格當前驗證失敗的事實是否可以通過代碼獲取?Google應用程序腳本 - 如何判斷單元格值是否已通過驗證
我試圖看看是否有一個單元屬性告訴你,但沒有。此外,我尋找某種DataValidation「驗證」方法 - 即根據驗證規則測試一個值,但沒有任何內容
任何想法?這可能嗎??
非常感謝
克里斯
具體回答你的問題,有谷歌Apps腳本內沒有方法將返回的Range
如.isValid()的有效性。正如你所說的,你可以使用Range.getDataValidations()
來逆向工程一個程序化的程序,然後解析結果以再次驗證Range.getValues()
調用的值。
這是一個很好的建議。我向問題跟蹤器添加了功能請求 - >Add a Star to vote it up。
已投票並感謝您:-) – kiwichris
我爲此問題創建了一個解決方法,該工作以非常難看的技術說法和稍微未確定的方式工作。
關於解決方法: 它工作經驗的基礎上認爲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報告。
可以使用'onEdit()'函數,該函數在每次編輯圖紙時都會運行。 [Google文檔 - onEdit()](https://developers.google.com/apps-script/guides/triggers/#onedit) –