# 워크시트 보호 및 셀 잠금

## Content

SpreadJS를 사용하면 워크시트를 보호하여 모든 셀을 잠그고 다른 사용자가 데이터를 변경, 이동 또는 삭제하지 못하도록 할 수 있습니다. 그러나 잠긴 셀의 데이터는 여전히 복사할 수 있습니다.
**isProtected** 옵션을 **true**로 설정하여 워크시트를 보호할 수 있으며, [locked](/spreadjs/api/v18/classes/GC.Spread.Sheets.CellRange#locked) 메서드를 사용하여 셀을 잠그거나 잠금 해제할 수 있습니다.

## 보호된 워크시트에서 셀 잠금 해제

**locked** 메서드를 **false**로 설정하면 보호된 워크시트에서 특정 셀을 사용자가 편집할 수 있도록 허용할 수 있습니다.

```js
sheet.getCell(1,1, GC.Spread.Sheets.SheetArea.viewport).locked(false);
sheet.setValue(1,1,"unLocked");
sheet.getRange(-1,3, -1, 1).locked(false);
sheet.getRange(5, -1, 1, -1).locked(false);
sheet.options.isProtected = true;
```

## 보호된 워크시트에서 셀 범위 잠그기

다음 단계에 따라 보호된 워크시트에서 특정 셀 범위만 잠글 수 있습니다:

1. 사용자 지정 스타일을 생성하여 **locked** 메서드를 **false**로 설정하여 모든 셀의 잠금을 해제합니다.
2. 읽기 전용으로 설정할 특정 셀 범위만 따로 잠금 처리합니다.

```javascript
// 워크북 및 워크시트 구성
var spread = new GC.Spread.Sheets.Workbook("ss");
var sheet = spread.getActiveSheet();
// 스타일을 통해 워크시트의 모든 셀 잠금 해제
let style = new GC.Spread.Sheets.Style();
style.locked = false;
// 시트의 모든 셀에 대해 스타일을 기본 스타일로 설정
sheet.setDefaultStyle(style);
// 읽기 전용으로 설정할 셀 범위를 별도로 잠금
new GC.Spread.Sheets.CellRange(sheet, 0, 0, 13, 4).locked(true);
// 시트 보호 설정
sheet.options.isProtected = true;
```

**options.protectionOptions** 속성은 변경 가능한 영역을 지정하는 데 사용할 수 있습니다. 이 영역에는 행이나 열의 크기 조정, 드래그, 삽입 또는 삭제 등이 포함될 수 있습니다.
**isProtected** 옵션이 **true**로 설정되면 다음 속성들이 적용됩니다:

| 속성 | 설명 |
| --- | --- |
| `allowDragInsertRows` | 행 삽입 시 드래그 작업을 허용합니다. |
| `allowDragInsertColumns` | 열 삽입 시 드래그 작업을 허용합니다. |
| `allowInsertRows` | 행 삽입을 허용합니다. |
| `allowInsertColumns` | 열 삽입을 허용합니다. |
| `allowDeleteRows` | 행 삭제를 허용합니다. |
| `allowDeleteColumns` | 열 삭제를 허용합니다. |
| `allowSelectLockedCells` | 잠긴 셀 선택을 허용합니다. |
| `allowSelectUnlockedCells` | 잠금 해제된 셀 선택을 허용합니다. |
| `allowSort` | 범위 정렬을 허용합니다. |
| `allowFilter` | 범위 필터링을 허용합니다. |
| `allowEditObjects` | 플로팅 오브젝트(도형 등)의 편집을 허용합니다. |
| `allowResizeRows` | 행 크기 조정을 허용합니다. |
| `allowResizeColumns` | 열 크기 조정을 허용합니다. |
| `allowOutlineRows` | 행 그룹 확장/축소를 허용합니다. |
| `allowOutlineColumns` | 열 그룹 확장/축소를 허용합니다. |

**isProtected** 옵션이 false로 설정되면 위의 보호 옵션들은 적용되지 않습니다.

## 보호된 워크시트에서 보호 옵션 활성화

워크시트를 보호하면서 SpreadJS에서 제공하는 다양한 보호 옵션들을 활성화할 수 있습니다.

```javascript
var spread = new GC.Spread.Sheets.Workbook(document.getElementById("ss"));
var sheet = spread.getActiveSheet();
sheet.options.isProtected = true;
sheet.options.protectionOptions.allowDeleteRows = true;
sheet.options.protectionOptions.allowDeleteColumns = true;
sheet.options.protectionOptions.allowInsertRows = true;
sheet.options.protectionOptions.allowInsertColumns = true;
sheet.options.protectionOptions.allowDragInsertRows = true;
sheet.options.protectionOptions.allowDragInsertColumns = true;
sheet.options.protectionOptions.allowOutlineColumns = true;
```

> **참고**: allowInsertRows, allowInsertColumns, allowDeleteRows, allowDeleteColumns 보호 옵션은 사용자 인터페이스에서 작업을 수행할 때만 적용됩니다. 다시 말해, 이 값들은 컨텍스트 메뉴에서의 행/열 삽입 및 삭제 명령을 제한하는 데만 영향을 미칩니다.

## 보호된 그룹에 경고 메시지 설정하기

기본적으로 보호된 워크시트에서는 개요 행 또는 열 그룹을 확장하거나 축소할 수 없습니다. 이때 **invalidOperation** 이벤트가 발생하며, 다음과 같이 해당 이벤트에 바인딩하여 경고 메시지를 표시할 수 있습니다:

```javascript
// 경고 메세지 설정
spread.bind(GC.Spread.Sheets.Events.InvalidOperation, (e, args) => {
    if(args.invalidType === GC.Spread.Sheets.InvalidOperationType.groupProtected){
    args.message="Expand or Collapse operation is not allowed for a protected worksheet.";
    alert(args.message)
    }
}); 
```

## 암호로 시트 보호하기

**protect** 메서드를 사용할 때 워크시트를 보호하면서 **암호를 설정**할 수 있습니다. 이 메서드를 호출하면 **isProtected** 옵션은 자동으로 true로 설정됩니다.

```javascript
//워크시트 보호
var password = 'AddedPassword'; 
activeSheet.protect(password); 
```

이후, **unprotect** 메서드에 **암호를 인자로 전달**하여 워크시트 보호를 해제할 수 있습니다.

```javascript
// 암호를 사용하여 워크시트의 보호를 해제
if(activeSheet.hasPassword()) {
    activeSheet.unprotect(password);
} else {
    activeSheet.unprotect();
}
```

## 보호된 워크시트에서 수식 숨기기

보호된 시트에서 수식 셀의 **표시 여부를 제어**하려면 [Style ](/spreadjs/api/v18/classes/GC.Spread.Sheets.Style)클래스의 **hidden** 속성이나 [CellRange](/spreadjs/api/v18/classes/GC.Spread.Sheets.CellRange)클래스의 **hidden** 메서드를 사용할 수 있습니다.
기본적으로 **hidden** 속성은 false로 설정되어 있어 수식이 숨겨지지 않습니다. 또한 이 속성은 **SSJSON, SJS, XLSX 형식의 내보내기 및 가져오기**를 지원합니다.

**hidden** 속성은 예를 들어 KPI 데이터 생성, 연말 보너스 계산 등과 같이 직원의 자기 평가 및 상사 평가에 기반하여 계산이 이뤄지는 경우, 관련 수식을 숨기고 평가 시스템을 보호하고자 할 때 유용하게 사용됩니다.

다음은 GC.Spread.Sheets.Style 타입의 **hidden** 속성을 사용해 셀의 수식을 숨기는 코드 예시입니다:

```javascript
// 시트가 보호될 때 셀의 수식이 표시되는지 여부를 설정
activeSheet.options.isProtected = true;

// hidden 속성이 true인 스타일 생성
var style = new GC.Spread.Sheets.Style();
style.hidden = true;
activeSheet.setStyle(1, 1, style, GC.Spread.Sheets.SheetArea.viewport);

// 수식이 포함된 셀에 스타일 적용
activeSheet.setFormula(1, 1, "=SUM(1,2)");
```

또는, 아래의 코드 예시는 GC.Spread.Sheets.CellRange 타입의 **hidden** 메서드를 사용하는 방식입니다:

```javascript
// 시트가 보호될 때 셀의 수식이 표시되는지 여부를 설정
activeSheet.options.isProtected = true;
activeSheet.setFormula(1, 3, "=SUM(10,20)");
activeSheet.getRange(1, 3, GC.Spread.Sheets.SheetArea.viewport).hidden(true);
```

보호된 워크시트에서 숨겨진 속성에 의해 영향을 받는 SpreadJS 기능들:

* 셀에 **hidden** 속성이 설정되어 있을 경우, \*\*수식 입력줄(Formula bar)\*\*과 \*\*수식 편집기 패널(Formula Editor panel)\*\*은 어떤 수식도 표시하지 않습니다.
* 편집 모드에서 hidden 셀이 선택되면, \*\*입력 에디터(Input Editor)\*\*의 기본 데이터는 비어 있습니다.
* 숨겨진 셀은 수식을 복사하지 않고 결과만 복사되지만, 잘라내기(Cut) 작업은 항상 수식을 포함합니다.
* 그러나 **locked** 속성을 true로 설정하여 이를 방지할 수 있습니다.
* **showFormulas** 속성은 숨겨진 셀의 수식을 표시하지 않습니다.
* **FORMULATEXT()** 함수는 hidden 속성이 적용된 셀의 수식을 가져올 수 없습니다.

참고: **hidden**과 **locked** 속성은 아래 표와 같이 서로의 기능에 영향을 줍니다:

| 상황 | locked | hidden | 결과 |
| --- | ------ | ------ | --- |
| 시트가 보호되지 않음 | True/False | True/False | locked와 hidden 모두 적용되지 않음 |
| @rows=4:시트가 보호됨 | False | False | 셀은 편집 가능하며 수식은 정상적으로 표시됨 |
| True | False | 셀은 잠겨 있어 편집 불가, 수식은 정상적으로 표시됨 |
| False | True | 셀은 편집 가능, 수식은 숨겨짐<br>편집 모드에서 입력 박스는 기본값으로 null 표시 |
| True | True | 셀은 잠겨 있고 편집 불가, 수식은 숨겨짐 |

**제한사항**

* 테이블 시트, 간트 시트, 리포트 시트는 hidden 속성을 지원하지 않습니다.
* API를 통해 접근한 수식에는 hidden 속성이 영향을 주지 않습니다.

## 디자이너 사용하기

시트 보호(Protect Sheet) 대화상자에 접근하려면, 시트 이름이 표시된 탭 스트립에서 마우스 오른쪽 버튼을 클릭한 후, 시트 보호(Protect Sheet) 옵션을 선택합니다.
**시트 보호(Protect Sheet) 대화상자를 사용하여 워크시트를 보호 및 보호 해제하는 단계**

1. 워크시트를 보호하려면 암호를 입력하고, 시트 보호(Protect Sheet) 대화상자에서 제공된 여러 옵션을 선택하거나 선택 해제합니다.
<br>
    ![protect-sheet-dialog](https://gcdocumentsitekrblob.blob.core.windows.net/document-site-files/images/df1fe1ee-eb3c-4da7-8c20-a0d8d2b7e734/protect-sheet-dialog.e50889.png)
<br>
2. 워크시트 보호를 위한 암호를 입력하면, 암호 확인을 위한 또 다른 대화상자가 표시됩니다.
<br>
    ![confirm-protect](https://gcdocumentsitekrblob.blob.core.windows.net/document-site-files/images/df1fe1ee-eb3c-4da7-8c20-a0d8d2b7e734/confirm-protect.fa2578.png)

암호 설정이 성공적으로 완료되면 보호된 워크시트에 접근할 수는 있지만, 시트에 대한 어떤 변경도 수행할 수 없습니다.
워크시트를 보호 해제하려면 시트 보호 해제(Unprotect Sheet) 대화상자를 통해 설정한 암호를 입력하면 됩니다.
![unprotect-sheet](https://gcdocumentsitekrblob.blob.core.windows.net/document-site-files/images/df1fe1ee-eb3c-4da7-8c20-a0d8d2b7e734/unprotect-sheet.bb9b1b.png?verticalAlign=baseline)