# 주석

- Human documentation: [https://docs.univer.ai/ko-KR/guides/sheets/features/notes](https://docs.univer.ai/ko-KR/guides/sheets/features/notes)

- Agent Markdown: [https://docs.univer.ai/ko-KR/guides/sheets/features/notes.md](https://docs.univer.ai/ko-KR/guides/sheets/features/notes.md)

- Requested language: `ko-KR`

- Content language: `ko-KR`

- Documentation version: `1.0.4`

- Source: [sheets/features/notes.ko-KR.mdx](https://github.com/dream-num/documentation/blob/dev/content/guides/sheets/features/notes.ko-KR.mdx)

---

#### Package metadata

```json
{
  "preset": [
    {
      "client": "@univerjs/preset-sheets-note",
      "locale": "@univerjs/preset-sheets-note/locales/en-US",
      "style": "@univerjs/preset-sheets-note/lib/index.css"
    }
  ],
  "plugins": [
    {
      "client": "@univerjs/sheets-note",
      "facade": "@univerjs/sheets-note/facade"
    },
    {
      "client": "@univerjs/sheets-note-ui",
      "locale": "@univerjs/sheets-note-ui/locale/en-US",
      "style": "@univerjs/sheets-note-ui/lib/index.css"
    }
  ],
  "server": false
}
```

주석 기능을 사용하면 스프레드시트 셀에 설명을 추가해 부가 정보를 기록하거나 맥락을 제공할 수 있습니다. 다양한 주석 스타일과 작업을 지원하므로 사용자가 데이터를 더 잘 이해하고 함께 작업하는 데 도움이 됩니다.

> Interactive example: [Open the playground](/playground/sheets/notes)

## 플러그인 모드

### 설치

#### npm

```bash
npm install @univerjs/sheets-note @univerjs/sheets-note-ui
```

#### pnpm

```bash
pnpm add @univerjs/sheets-note @univerjs/sheets-note-ui
```

#### yarn

```bash
yarn add @univerjs/sheets-note @univerjs/sheets-note-ui
```

#### bun

```bash
bun add @univerjs/sheets-note @univerjs/sheets-note-ui
```

### 사용법

```typescript
import { LocaleType, mergeLocales, Univer } from '@univerjs/core'
import { UniverSheetsNotePlugin } from '@univerjs/sheets-note' // [!code ++]
import { UniverSheetsNoteUIPlugin } from '@univerjs/sheets-note-ui' // [!code ++]
import SheetsNoteUIEnUS from '@univerjs/sheets-note-ui/locale/en-US' // [!code ++]
import '@univerjs/sheets-note-ui/lib/index.css' // [!code ++]
import '@univerjs/sheets-note/facade' // [!code ++]

const univer = new Univer({
  locale: LocaleType.EN_US,
  locales: {
    [LocaleType.EN_US]: mergeLocales(
      SheetsNoteUIEnUS, // [!code ++]
    ),
  },
})

univer.registerPlugin(UniverSheetsNotePlugin) // [!code ++]
univer.registerPlugin(UniverSheetsNoteUIPlugin) // [!code ++]
```

## 프리셋 모드

### 설치

#### npm

```bash
npm install @univerjs/preset-sheets-note
```

#### pnpm

```bash
pnpm add @univerjs/preset-sheets-note
```

#### yarn

```bash
yarn add @univerjs/preset-sheets-note
```

#### bun

```bash
bun add @univerjs/preset-sheets-note
```

### 사용법

```typescript
import { UniverSheetsCorePreset } from '@univerjs/preset-sheets-core'
import UniverPresetSheetsCoreEnUS from '@univerjs/preset-sheets-core/locales/en-US'
import { UniverSheetsNotePreset } from '@univerjs/preset-sheets-note' // [!code ++]
import UniverPresetSheetsNoteEnUS from '@univerjs/preset-sheets-note/locales/en-US' // [!code ++]
import { createUniver, LocaleType, mergeLocales } from '@univerjs/presets'
import '@univerjs/preset-sheets-core/lib/index.css'
import '@univerjs/preset-sheets-note/lib/index.css' // [!code ++]

const { univerAPI } = createUniver({
  locale: LocaleType.EN_US,
  locales: {
    [LocaleType.EN_US]: mergeLocales(
      UniverPresetSheetsCoreEnUS,
      UniverPresetSheetsNoteEnUS, // [!code ++]
    ),
  },
  presets: [
    UniverSheetsCorePreset(),
    UniverSheetsNotePreset(), // [!code ++]
  ],
})
```

## Facade API

전체 Facade API 타입 정의는 [FacadeAPI](https://docs.univer.ai/ko-KR/reference/facade.md)에서 확인할 수 있습니다.

### 가져오기

> [!INFO: Plugin mode note]
> 플러그인 모드에서만 Facade 패키지를 직접 가져와야 합니다. 프리셋 모드에는 해당 Facade 패키지가 이미 포함되어 있으므로 별도로 가져올 필요가 없습니다.

```typescript
import '@univerjs/sheets-note/facade'
```

### 주석 가져오기

`FWorksheet.getNotes`를 사용하면 워크시트의 모든 주석을 가져올 수 있습니다.

```typescript
const fWorkbook = univerAPI.getActiveWorkbook()
const fWorksheet = fWorkbook.getActiveSheet()
const notes = fWorksheet.getNotes()

notes.forEach((item) => {
  const { row, col, note } = item
  console.log(`Cell ${fWorksheet.getRange(row, col).getA1Notation()} has note: ${note}`)
})
```

`FRange.getNote`를 사용하면 범위의 왼쪽 위 셀에 있는 주석을 가져올 수 있습니다.

```typescript
const fWorkbook = univerAPI.getActiveWorkbook()
const fWorksheet = fWorkbook.getActiveSheet()
const fRange = fWorksheet.getRange('A1:D10')
const note = fRange.getNote()
```

### 주석 추가 또는 업데이트

`FRange.createOrUpdateNote`를 사용하면 범위의 왼쪽 위 셀에 주석을 만들거나 기존 주석을 업데이트할 수 있습니다.

```typescript
const fWorkbook = univerAPI.getActiveWorkbook()
const fWorksheet = fWorkbook.getActiveSheet()
const fRange = fWorksheet.getRange('A1')
fRange.createOrUpdateNote({
  note: 'This is an annotation',
  width: 160,
  height: 100,
  show: true,
})
```

### 주석 삭제

`FRange.deleteNote`를 사용하면 범위의 왼쪽 위 셀에 있는 주석을 삭제할 수 있습니다.

```typescript
const fWorkbook = univerAPI.getActiveWorkbook()
const fWorksheet = fWorkbook.getActiveSheet()
const notes = fWorksheet.getNotes()

if (notes.length > 0) {
  // Remove the first annotation in the worksheet
  const { row, col } = notes[0]
  fWorksheet.getRange(row, col).deleteNote()
}

// Remove the annotation in cell C1
const fRange = fWorksheet.getRange('C1')
fRange.deleteNote()
```

### 이벤트 리스너

전체 이벤트 타입 정의는 [이벤트](https://docs.univer.ai/ko-KR/reference/facade/events.md)에서 확인할 수 있습니다.

| 이벤트 이름                  | 설명                   |
| ----------------------- | -------------------- |
| `SheetNoteAdd`          | 주석을 추가한 후 트리거됩니다     |
| `SheetNoteDelete`       | 주석을 삭제한 후 트리거됩니다     |
| `SheetNoteUpdate`       | 주석을 업데이트한 후 트리거됩니다   |
| `SheetNoteShow`         | 주석이 표시될 때 트리거됩니다     |
| `SheetNoteHide`         | 주석이 숨겨질 때 트리거됩니다     |
| `BeforeSheetNoteAdd`    | 주석을 추가하기 전에 트리거됩니다   |
| `BeforeSheetNoteDelete` | 주석을 삭제하기 전에 트리거됩니다   |
| `BeforeSheetNoteUpdate` | 주석을 업데이트하기 전에 트리거됩니다 |
| `BeforeSheetNoteShow`   | 주석을 표시하기 전에 트리거됩니다   |
| `BeforeSheetNoteHide`   | 주석을 숨기기 전에 트리거됩니다    |

##### 이벤트 리스너 예시

```typescript
// Triggered after adding an annotation
const disposable = univerAPI.addEvent(univerAPI.Event.SheetNoteAdd, (params) => {
  const { workbook, worksheet, row, col, note } = params
})

// Remove event listener using `disposable.dispose()`
```

```typescript
// Triggered before removing an annotation, can be canceled
const disposable = univerAPI.addEvent(univerAPI.Event.BeforeSheetNoteDelete, (params) => {
  const { workbook, worksheet, row, col, oldNote } = params

  // Cancel the annotation deletion operation
  params.cancel = true
})

// Remove event listener using `disposable.dispose()`
```
