사용자 정의 유효성 검사

이 샘플에서는 워크시트에서 사용자 정의 데이터 유효성 검사를 사용하는 방법을 보여 줍니다.

제목, 입력 메시지, 오류 메시지 등과 같은 유효성 검사기를 사용자 정의할 수 있습니다. 이러한 설정을 사용하면 셀에 입력할 수 있는 데이터와 입력해야 하는 데이터를 알 수 있으며 데이터가 잘못된 경우 메시지가 표시됩니다. validator 개체를 사용할 경우 해당 속성을 설정할 수 있습니다. 예: 잘못된 데이터를 입력하면 컨트롤이 ValidationError 이벤트를 트리거합니다. 예:
var spreadNS = GC.Spread.Sheets; window.onload = function () { var spread = new GC.Spread.Sheets.Workbook(document.getElementById("ss"), {sheetCount: 2}); initSpread(spread); }; function initSpread(spread) { var self = this; var sheet = spread.getSheet(0); spread.options.highlightInvalidData = true; var validatorTypes = "DateValidator"; _getElementById("validatorTab2").style.display = 'none'; _getElementById("validatorTab3").style.display = 'none'; _getElementById("isIntTab").style.display = 'none'; _getElementById("dogear-position").style.display = 'none'; _getElementById("icon-position").style.display = 'none'; _getElementById("iconFile").style.display = 'none'; var updateValidatorTab = function (validatorTypes) { switch (validatorTypes) { case "DateValidator": _getElementById("validatorTab1").style.display = 'block'; _getElementById("isIntTab").style.display = 'none'; _getElementById("validatorTab2").style.display = 'none'; _getElementById("validatorTab3").style.display = 'none'; break; case "ListValidator": _getElementById("validatorTab3").style.display = 'block'; _getElementById("validatorTab2").style.display = 'none'; _getElementById("validatorTab1").style.display = 'none'; break; case "FormulaListValidator": case "FormulaValidator": _getElementById("validatorTab2").style.display = 'block'; _getElementById("validatorTab1").style.display = 'none'; _getElementById("validatorTab3").style.display = 'none'; break; case "NumberValidator": _getElementById("validatorTab1").style.display = 'block'; _getElementById("isIntTab").style.display = 'block'; _getElementById("validatorTab2").style.display = 'none'; _getElementById("validatorTab3").style.display = 'none'; break; case "TextLengthValidator": _getElementById("validatorTab1").style.display = 'block'; _getElementById("isIntTab").style.display = 'none'; _getElementById("validatorTab2").style.display = 'none'; _getElementById("validatorTab3").style.display = 'none'; break; } }; _getElementById("highlighticon").addEventListener("change", function () { var file = this.files[0]; var reader = new FileReader(); if(file){ reader.readAsDataURL(file); reader.onloadend = function (e) { self.imageBase64 = this.result; }; } }); _getElementById("highlightType").addEventListener('change',function () { switch(this.value){ case 'circle':{ _getElementById("dogear-position").style.display = 'none'; _getElementById("icon-position").style.display = 'none'; _getElementById("iconFile").style.display = 'none'; break; } case 'dogear':{ _getElementById("dogear-position").style.display = ''; _getElementById("icon-position").style.display = 'none'; _getElementById("iconFile").style.display = 'none'; break; } case 'icon':{ _getElementById("dogear-position").style.display = 'none'; _getElementById("icon-position").style.display = ''; _getElementById("iconFile").style.display = ''; break; } } }); _getElementById("validatorTypes").addEventListener('change',function () { validatorTypes = this.value; updateValidatorTab(validatorTypes); }); _getElementById("validatorComparisonOperator").addEventListener('change',function () { var operatorType = this.value; switch (operatorType) { case '6': case '7': _getElementById("txtValidatorValue2").style.display = 'block'; break; default: _getElementById("txtValidatorValue2").style.display = 'none'; break; } }); _getElementById("btnSetValidator").addEventListener('click',function () { var gcdv = spreadNS.DataValidation; var ddv = null; var v1 = _getElementById("txtValidatorValue1").value; var v2 = _getElementById("txtValidatorValue2").value; switch (validatorTypes) { case "DateValidator": ddv = gcdv.createDateValidator(parseInt(_getElementById("validatorComparisonOperator").value), new Date(v1), new Date(v2)); break; case "FormulaListValidator": ddv = gcdv.createFormulaListValidator(_getElementById("txtValidatorValue").value); break; case "FormulaValidator": ddv = gcdv.createFormulaValidator(_getElementById("txtValidatorValue").value); break; case "ListValidator": ddv = gcdv.createListValidator(_getElementById("txtListValidatorValue").value); ddv.inCellDropdown(_getElementById("ckbIncellDropDown").checked); break; case "NumberValidator": if (_getElementById("chkIsInteger").checked) { ddv = gcdv.createNumberValidator(parseInt(_getElementById("validatorComparisonOperator").value), isNaN(v1) ? v1 : parseInt(v1), isNaN(v2) ? v2 : parseInt(v2), true); } else { ddv = gcdv.createNumberValidator(parseInt(_getElementById("validatorComparisonOperator").value), isNaN(v1) ? v1 : parseFloat(v1), isNaN(v2) ? v2 : parseFloat(v2), false); } break; case "TextLengthValidator": ddv = gcdv.createTextLengthValidator(parseInt(_getElementById("validatorComparisonOperator").value), isNaN(v1) ? v1 : parseInt(v1), isNaN(v2) ? v2 : parseInt(v2)); break; } if (ddv != null) { ddv.errorMessage(_getElementById("txtErrorMessage").value); ddv.errorStyle(parseInt(_getElementById("validatorErrorStyles").value)); ddv.errorTitle(_getElementById("txtErrorTitle").value); ddv.showErrorMessage(_getElementById("chkShowError").checked); ddv.ignoreBlank(_getElementById("chkValidatorIgnoreBlank").checked); ddv.showInputMessage(_getElementById("ckbShowInputMessage").checked); ddv.inputTitle(_getElementById("txtInputTitle").value); ddv.inputMessage(_getElementById("txtInputMessage").value); var highLightStyle = _getElementById("highlightType").value; var dogearPosition = _getElementById("dogearPositionOption").value; var iconPosition = _getElementById("iconPositionOption").value; var highlightStyleColor = _getElementById("highlightColor").value; if (highLightStyle === "circle") { ddv.highlightStyle({ type: GC.Spread.Sheets.DataValidation.HighlightType.circle, color: highlightStyleColor }); } else if (highLightStyle === "dogear" && dogearPosition === "Top Left") { ddv.highlightStyle({ type: GC.Spread.Sheets.DataValidation.HighlightType.dogEar, color: highlightStyleColor, position: GC.Spread.Sheets.DataValidation.HighlightPosition.topLeft }); } else if (highLightStyle === "dogear" && dogearPosition === "Top Right") { ddv.highlightStyle({ type: GC.Spread.Sheets.DataValidation.HighlightType.dogEar, color: highlightStyleColor, position: GC.Spread.Sheets.DataValidation.HighlightPosition.topRight }); } else if (highLightStyle === "dogear" && dogearPosition === "Bottom Left") { ddv.highlightStyle({ type: GC.Spread.Sheets.DataValidation.HighlightType.dogEar, color: highlightStyleColor, position: GC.Spread.Sheets.DataValidation.HighlightPosition.bottomLeft }); } else if (highLightStyle === "dogear" && dogearPosition === "Bottom Right") { ddv.highlightStyle({ type: GC.Spread.Sheets.DataValidation.HighlightType.dogEar, color: highlightStyleColor, position: GC.Spread.Sheets.DataValidation.HighlightPosition.bottomRight }); } else if (highLightStyle === "icon" && iconPosition === "Outside Left") { ddv.highlightStyle({ type: GC.Spread.Sheets.DataValidation.HighlightType.icon, color: highlightStyleColor, position: GC.Spread.Sheets.DataValidation.HighlightPosition.outsideLeft, image: self.imageBase64 }); } else if (highLightStyle === "icon" && iconPosition === "Outside Right") { ddv.highlightStyle({ type: GC.Spread.Sheets.DataValidation.HighlightType.icon, color: highlightStyleColor, position: GC.Spread.Sheets.DataValidation.HighlightPosition.outsideRight, image: self.imageBase64 }); } var ss = GC.Spread.Sheets.findControl(document.getElementById('ss')); var sheet = ss.getActiveSheet(); sheet.suspendPaint(); var sels = sheet.getSelections(); for (var i = 0; i < sels.length; i++) { var sel = getActualRange(sheet, sels[i]); sheet.setDataValidator(sel.row, sel.col, sel.rowCount, sel.colCount, ddv); } sheet.resumePaint(); } }); _getElementById("chkValidatorIgnoreBlank").addEventListener('change',function () { var ss = GC.Spread.Sheets.findControl(document.getElementById('ss')); var sheet = ss.getActiveSheet(); var sels = sheet.getSelections(); for (var i = 0; i < sels.length; i++) { var sel = getActualRange(sheet, sels[i]); for (var r = 0; r < sel.rowCount; r++) { for (var c = 0; c < sel.colCount; c++) { var dv = sheet.getDataValidator(sel.row + r, sel.col + c); if (dv) { dv.ignoreBlank(this.checked); } } } } }); _getElementById("chkShowError").addEventListener('change',function () { var ss = GC.Spread.Sheets.findControl(document.getElementById('ss')); var sheet = ss.getActiveSheet(); var checked = _getElementById("chkShowError").checked; if (checked) { ss.bind(spreadNS.Events.ValidationError, function (event, data) { var dv = data.validator; if (dv) { alert(dv.errorMessage()); } }); } else { ss.unbind(spreadNS.Events.ValidationError); } }); _getElementById("btnClearValidator").addEventListener('click',function () { var sheet = spread.getActiveSheet(); var sels = sheet.getSelections(); for (var i = 0; i < sels.length; i++) { var sel = getActualRange(sheet, sels[i]); sheet.setDataValidator(sel.row, sel.col, sel.rowCount, sel.colCount, null); } }); spread.bind(GC.Spread.Sheets.Events.EnterCell, function (e, args) { var sheet = spread.getActiveSheet(); var activeRow = sheet.getActiveRowIndex(); var activeCol = sheet.getActiveColumnIndex(); var dataValidator = sheet.getDataValidator(activeRow, activeCol); var validatorTypes = _getElementById("validatorTypes"); if (dataValidator) { var type = dataValidator.type(); switch (type) { case 1: case 2: validatorTypes = "NumberValidator"; break; case 3: var condition = dataValidator.condition(); if (condition && condition.formula()) { validatorTypes = "FormulaListValidator"; } else { validatorTypes = "ListValidator"; } break; case 4: validatorTypes = "DateValidator"; break; case 6: validatorTypes = "TextLengthValidator"; break; case 7: validatorTypes = "FormulaValidator"; break; } validatorTypes.value = validatorTypes; updateValidatorTab(validatorTypes); _getElementById("validatorComparisonOperator").value = dataValidator.comparisonOperator(); _getElementById("txtValidatorValue1").value = dataValidator.value1(); _getElementById("txtValidatorValue2").value = dataValidator.value2(); _getElementById("txtValidatorValue").value = dataValidator.value1(); _getElementById("txtListValidatorValue").value = dataValidator.value1(); _getElementById("chkIsInteger").setAttribute('checked', type === 1); _getElementById("ckbShowInputMessage").setAttribute('checked', dataValidator.showInputMessage()); _getElementById("txtInputTitle").value = dataValidator.inputTitle(); _getElementById("txtInputMessage").value = dataValidator.inputMessage(); _getElementById("chkShowError").setAttribute('checked', dataValidator.showErrorMessage()); _getElementById("chkValidatorIgnoreBlank").setAttribute('checked', dataValidator.ignoreBlank()); _getElementById("txtErrorTitle").value = dataValidator.errorTitle(); _getElementById("txtErrorMessage").value = dataValidator.errorMessage(); _getElementById("validatorErrorStyles").value = dataValidator.errorStyle(); } }); } function getActualRange(sheet, range) { var row = range.row, rowCount = range.rowCount; if (row === -1) { row = 0; rowCount = sheet.getRowCount(); } var col = range.col, colCount = range.colCount; if (col === -1) { col = 0; colCount = sheet.getColumnCount(); } return new GC.Spread.Sheets.Range(row, col, rowCount, colCount); } function _getElementById(id){ return document.getElementById(id); }
<!doctype html> <html style="height:100%;font-size:14px;"> <head> <meta name="spreadjs culture" content="ko-kr"/> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <link rel="stylesheet" type="text/css" href="$DEMOROOT$/ko/purejs/node_modules/@mescius/spread-sheets/styles/gc.spread.sheets.excel2013white.css"> <script src="$DEMOROOT$/ko/purejs/node_modules/@mescius/spread-sheets/dist/gc.spread.sheets.all.min.js" type="text/javascript"></script> <script src="$DEMOROOT$/ko/purejs/node_modules/@mescius/spread-sheets-resources-ko/dist/gc.spread.sheets.resources.ko.min.js" type="text/javascript"></script> <script src="$DEMOROOT$/spread/source/js/license.js" type="text/javascript"></script> <script src="app.js" type="text/javascript"></script> <link rel="stylesheet" type="text/css" href="styles.css"> </head> <body> <div class="sample-tutorial"> <div id="ss" class="sample-spreadsheets"></div> <div class="options-container"> <p> Select a cell or range of cells in the sheet then use the options below to create a data validator for that cell(s). You can also set the input message that displays when the user tries to edit the cell(s) as well as the error message that shows if the input does not fit the conditions. </p> <div class="option-row"> <select id="validatorTypes"> <option value="DateValidator" selected>DateValidator</option> <option value="FormulaListValidator">FormulaListValidator</option> <option value="FormulaValidator">FormulaValidator</option> <option value="ListValidator">ListValidator</option> <option value="NumberValidator">NumberValidator</option> <option value="TextLengthValidator">TextLengthValidator</option> </select> </div> <div id="validatorTab1"> <div class="option-row"> <select id="validatorComparisonOperator"> <option value="6" selected>Between</option> <option value="7">NotBetween</option> <option value="0">EqualTo</option> <option value="1">NotEqualTo</option> <option value="2">GreaterThan</option> <option value="4">LessThan</option> <option value="3">GreaterThanOrEqualTo</option> <option value="5">LessThanOrEqualTo</option> </select> </div> <div class="option-row"> <input class="normal-input" id="txtValidatorValue1" type="text" placeholder="Value1"/> </div> <div class="option-row"> <input class="normal-input" id="txtValidatorValue2" type="text" placeholder="Value2"/> </div> <div class="option-row" id="isIntTab"> <input class="normal-input" id="chkIsInteger" type="checkbox"/><label for="chkIsInteger">Is Integer</label> </div> </div> <div class="option-row" id="validatorTab2"> <input class="normal-input" type="text" id="txtValidatorValue" placeholder="Value1" /> </div> <div class="option-row" id="validatorTab3"> <input class="normal-input" type="text" id="txtListValidatorValue" placeholder="(eg:1,2,3,4,5)" /> <input class="normal-input" type="checkbox" id="ckbIncellDropDown" checked="checked" /> <label for="ckbIncellDropDown">Show In-Cell DropDown</label> </div> <div class="option-row"> <input class="normal-input" type="checkbox" checked="checked" id="ckbShowInputMessage" /> <label for="ckbShowInputMessage">Show InputMessage</label> </div> <div class="option-row"> <label>Title:</label> <input class="normal-input" type="text" id="txtInputTitle" placeholder="Title"/> </div> <div class="option-row"> <label>Input Message:</label> <input class="normal-input" type="text" id="txtInputMessage" placeholder="Input Message"/> </div> <div class="option-row"> <input class="normal-input" id="chkShowError" type="checkbox" /> <label for="chkShowError">ShowErrorMessage</label> </div> <div class="option-row"> <input class="normal-input" id="chkValidatorIgnoreBlank" type="checkbox" /> <label for="chkValidatorIgnoreBlank">IgnoreBlank</label> </div> <div class="option-row"> <input class="normal-input" id="txtErrorTitle" type="text" placeholder="ErrorTitle"/> </div> <div class="option-row"> <input class="normal-input" id="txtErrorMessage" type="text" placeholder="ErrorMessage"/> </div> <div class="option-row"> <select id="validatorErrorStyles"> <option value="0" selected>Stop</option> <option value="1">Warning</option> <option value="2">Information</option> </select> </div> <div class="option-row"> <label>Custom HighlightStyle:</label> <select id="highlightType"> <option selected="selected" value="circle" data-bind="text: res.dataValidationDialog.circle"> Circle </option> <option value="dogear" data-bind="text: res.dataValidationDialog.dogear"> Dogear </option> <option value="icon" data-bind="text: res.dataValidationDialog.icon"> Icon </option> </select> </div> <div class="option-row"> <input class="normal-input" id="highlightColor" type="text" placeholder="HighlightColor"/> </div> <div id="dogear-position" class="option-row"> <label>Dogear Position:</label> <select id="dogearPositionOption"> <option value="Top Left" data-bind="text: res.dataValidationDialog.topLeft"> Top Left </option> <option value="Top Right" data-bind="text: res.dataValidationDialog.topRight"> Top Right </option> <option value="Bottom Right" data-bind="text: res.dataValidationDialog.bottomRight"> Bottom Right </option> <option value="Bottom Left" data-bind="text: res.dataValidationDialog.bottomLeft"> Bottom Left </option> </select> </div> <div id="icon-position" class="option-row"> <label>Icon Position:</label> <select id="iconPositionOption"> <option value="Outside Left" data-bind="text: res.dataValidationDialog.outsideLeft"> Outside Left </option> <option value="Outside Right" data-bind="text: res.dataValidationDialog.outsideRight"> Outside Right </option> </select> </div> <div id="iconFile" class = "option-row"> <input id="highlighticon" type="file" accept="image/*"> </div> <div class = "option-row"> <input class="normal-input" id="btnSetValidator" type="button" value="Set Validator" /> </div> <div class = "option-row"> <input class="normal-input" id="btnClearValidator" type="button" value="Clear Validator" /> </div> </div> </div> </body> </html>
.sample-tutorial { position: relative; height: 100%; overflow: hidden; } .sample-spreadsheets { width: calc(100% - 280px); height: 100%; overflow: hidden; float: left; } .options-container { float: right; width: 280px; padding: 12px; height: 100%; box-sizing: border-box; background: #fbfbfb; overflow: auto; } .option-row { font-size: 14px; padding: 5px; margin-top: 5px; } .normal-input { display: block; padding: 4px 6px; box-sizing: border-box; width: 100%; } select { display: block; padding: 4px 6px; box-sizing: border-box; width: 100%; } input[type = checkbox] { display: inline-block; width: auto; } body { position: absolute; top: 0; bottom: 0; left: 0; right: 0; }