# 워크시트 보호 및 셀 잠금

## Content

SpreadJS를 사용하면 워크시트를 보호하여 모든 셀을 잠그고 다른 사용자가 데이터를 변경, 이동 또는 삭제하지 못하도록 할 수 있습니다. 그러나 잠긴 셀의 데이터는 여전히 복사할 수 있습니다.
**isProtected** 옵션을 **true**로 설정하여 워크시트를 보호할 수 있으며, [locked](/spreadjs/api/v19/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` | 열 그룹 확장/축소를 허용합니다. |
| `allowUsePivotTable` | 피벗테이블의 편집을 허용합니다. |

**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/v19/classes/GC.Spread.Sheets.Style)클래스의 **hidden** 속성이나 [CellRange](/spreadjs/api/v19/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** 속성이 설정되어 있을 경우, **수식 입력줄**과 **수식 편집기 패널**은 어떤 수식도 표시하지 않습니다.
* 편집 모드에서 hidden 셀이 선택되면, **입력 에디터** 기본 데이터는 비어 있습니다.
* 숨겨진 셀은 수식을 복사하지 않고 결과만 복사되지만, 잘라내기 작업은 항상 수식을 포함합니다.
* 그러나 **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 속성이 영향을 주지 않습니다.
알겠습니다. 요청하신 대로 MD 형식을 그대로 유지하면서 한국어로 번역해 드리겠습니다.

---

## 보호된 워크시트에서 피벗테이블 사용 활성화

SpreadJS는 `allowUsePivotTable` 속성을 통해 보호된 워크시트에서도 제한된 피벗테이블 상호작용을 허용합니다.

* `true`로 설정하면 사용자가 피벗테이블을 수정할 수 있습니다.
* `false`로 설정하면 대부분의 편집 작업이 제한되지만 일부 기본 작업은 여전히 가능합니다.

> type=note
> **참고:**
>
> * 피벗테이블 보호는 **UI 수준 작업에만** 적용됩니다. 코드로 수행되는 API 기반 수정은 제한되지 않습니다.
> * `allowUsePivotTable` 옵션은 워크시트 보호가 활성화된 경우(`isProtected = true`)에만 적용됩니다.
> * UI를 통해 보호된 피벗테이블을 수정해야 하는 경우, 일시적으로 보호를 해제한 후 업데이트를 수행하고 다시 보호를 적용하세요.

> type=info
> **팁:**
> `allowUsePivotTable` 속성은 런타임에서 변경할 수 있어, 시트를 완전히 다시 초기화하지 않고도 상호작용 수준을 조정할 수 있습니다.

다음 섹션에서는 코드 예제와 보호 상태에서 활성화되는 피벗테이블 기능을 자세히 나열한 표를 제공합니다.

```javascript
var spread = new GC.Spread.Sheets.Workbook(document.getElementById("ss"));
var sheet = spread.getActiveSheet();
sheet.options.isProtected = true;
sheet.options.protectionOptions.allowUsePivotTable = false;
```

**보호 모드에서 편집 가능한 기능**
워크시트가 보호된 경우(`isProtected = true` 및 `allowUsePivotTable = false`)에도 다음 피벗테이블 작업은 여전히 가능합니다.

| **기능**         | **설명**                      |
| -------------- | --------------------------- |
| 피벗테이블 이름 변경    | 피벗테이블 인스턴스 이름을 변경합니다.       |
| 소계 유형 변경       | 소계 계산 방식을 수정합니다.            |
| 데이터 없음 표시      | 빈 셀 표시 방식을 제어합니다.           |
| 필드 소계 위치       | 개별 필드의 소계 위치를 조정합니다.        |
| 필드 영역 및 인덱스 설정 | 피벗테이블 영역 내에서 필드 위치를 재배치합니다. |
| 확장 및 축소        | 그룹화된 항목을 확장하거나 축소합니다.       |
| 필터 초기화         | 적용된 필터를 제거합니다.              |
| 필터             | 값 또는 레이블 필터를 적용합니다.         |
| 정렬             | 필드 정렬 옵션을 변경합니다.            |
| 필드 끌어서 놓기      | 허용된 피벗테이블 영역 내에서 필드를 이동합니다. |

**사용 불가 기능 (자동으로 비활성화됨)**
다음 작업들은 피벗테이블 데이터 또는 구조를 수정하려면 보호 해제 모드가 필요합니다.

1. **레이아웃 및 표시 구성**

* 모든 피벗테이블 옵션
* 레이아웃 및 스타일 구성
* 반복 필드 레이블
* 필드 서식
* 데이터 표시 방식
* 피벗테이블 소계 위치
* 테마
* 총계

2. **계산 및 필드 작업**

* 필드 계산
* 항목 계산
* 조건부 서식

3. **데이터 및 구조 작업**

* 데이터 원본 업데이트 또는 변경
* 모두 지우기
* 그룹화
* 피벗테이블 삭제
* 슬라이서 및 타임라인(필터 컨트롤)
## 디자이너 사용하기

시트 보호(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)