

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 코드
<a name="actions-code"></a>

Quick Automate의 코드 작업을 사용하면 표준 자동화 작업이 지원하는 것 이상으로 Python 코드 블록을 사용하여 사용자 지정 로직을 구현할 수 있습니다. 복잡한 데이터 변환 및 계산에 적합하며 제한된 Python 환경 내에서 실행되어 보안을 유지합니다.

**두 가지 유형의 코드 작업:**
+ **한 줄 표현식:** 값을 반환하지 않고 변수를 수정하는 빠른 한 줄 작업
+ **사용자 지정 코드 블록:** 파라미터 및 반환 값이 있는 복잡한 로직을 위한 다중 라인 Python 함수

**코드 작업을 사용해야 하는 경우:**

다음과 같은 경우 코드 블록을 사용합니다.
+ 표준 작업에서 사용할 수 없는 복잡한 데이터 변환 수행
+ 사용자 지정 비즈니스 로직 또는 계산 구현
+ 데이터 구조(목록, 사전, JSON) 처리 또는 조작
+ 사용자 지정 방식으로 날짜, 시간 및 시간대 작업
+ 복잡한 패턴으로 문자열 구문 분석 또는 형식 지정
+ 여러 작업을 하나의 코드 블록으로 통합하여 자동화 성능 최적화

**코드 작업을 사용하지 않을 경우:**

다음과 같은 경우 코드 블록을 피합니다.
+ 사용 사례에 대한 표준 자동화 작업이 이미 있습니다.
+ 작업은 기본 제공 작업에 충분히 간단합니다.
+ 외부 APIs( 대신 REST API 통합 사용).
+ 파일 시스템 또는 데이터베이스에 액세스해야 합니다(적절한 통합 사용).

**코드 작업에 액세스하는 방법:**

코드 블록은 여러 인터페이스를 통해 사용할 수 있습니다.
+ **작업 패널(권장):**
  + 자동화 빌더에서 자동화를 엽니다.
  + 오른쪽의 작업 패널을 클릭합니다.
  + 코드 작업 섹션에서 "사용자 지정 코드 블록"을 찾습니다.
  + 코드 블록을 자동화 워크플로로 끌어서 놓기
+ **어시스턴트를 사용하여 빌드:**
  + 어시스턴트가 사용자 지정 코드가 필요하다고 판단할 때 계획 생성 중에 사용 가능
  + 어시스턴트는 복잡한 작업을 위한 코드 블록을 자동으로 제안합니다.
  + 사용자 지정 로직 요구 사항을 설명하여 코드 블록을 요청할 수 있습니다.

**사용 가능한 작업:**

## 한 줄 표현식
<a name="single-line-expressions"></a>

한 줄 표현식은 값을 반환하지 않고 작업을 수행하는 한 줄 Python 문을 실행합니다. 목록에 추가, 사전 업데이트 또는 상태를 수정하는 간단한 계산 수행과 같은 기존 변수를 빠르게 수정하는 데 적합합니다.

**속성:**
+ 표현식(필수): 실행할 Python 표현식(예: "my\_list.append('new item')")

**예**:
+ **목록에 추가**

  ```
  my_list.append("1")
  my_list.append(new_item)
  ```
+ **목록 항목 제거**

  ```
  task_list.remove(completed_task)
  ```

## 사용자 지정 코드 블록
<a name="custom-code-block"></a>

사용자 지정 코드 블록은 복잡한 로직을 실행하고, 파라미터를 수락하고, 값을 반환하는 다중 라인 Python 함수입니다. 표준 자동화 작업과 단일 라인 표현식이 요구 사항에 충분하지 않은 경우 대체 옵션입니다.

**속성:**
+ **함수 제목(필수):** 코드 블록의 이름 식별자(예: "Calculate\_Total")
+ **함수(필수):** 사용자 지정 로직이 포함된 Python 코드 블록입니다.
  + 1단계: 파라미터 정의
    + "편집" 버튼을 클릭하여 코드 편집기를 엽니다.
    + 파라미터 패널에서 "추가"를 클릭하여 새 파라미터를 생성합니다.
    + 자동화 변수와 일치하는 파라미터 이름을 입력합니다.
    + 파라미터는 함수 인수로 사용할 수 있습니다.
  + 2단계: Python 코드 작성
+ **반환 값(선택 사항):** 함수의 출력을 저장할 변수 이름입니다.
  + 필요한 코드 블록 구조를 따릅니다(아래 참조).
  + 함수 내에서 사용자 지정 로직 구현
  + 승인된 라이브러리 및 내장 함수만 사용
  + 데이터를 출력해야 하는 경우 반환 문 포함

**코드 블록 구조**

모든 코드 블록은 다음과 같은 특정 형식을 따라야 합니다.

```
@code_block()
def your_function_name(parameter1, parameter2, parameter3):
-------------------------------------------------------------------------------------
    """
    Optional: Add a docstring describing what your function does
    """
    # Your custom logic here
    result = parameter1 + parameter2 + parameter3

    return result
```

**기본 제공 Python 함수 및 가져오기**

모든 표준 Python 내장 함수는 가져오기 없이 사용할 수 있습니다(len, str, int 등).

**승인된 표준 라이브러리(보안 제한)**

코드 블록은 다음 표준 라이브러리만 가져올 수 있습니다.
+ `base64` - Base64 인코딩/디코딩
+ `datetime` - 날짜 및 시간 작업
+ `json` - JSON 구문 분석 및 생성
+ `math` - 수학 함수
+ `re` - 정규식
+ `zoneinfo` - 시간대 처리

**참고**  
위에 나열된 라이브러리 이외의 표준 라이브러리는 가져올 수 없습니다.
타사 라이브러리를 설치하거나 가져올 수 없습니다. `pip install`는 코드 블록에서 지원되지 않습니다.

**제한 사항 **
+ 라이브러리 액세스가 제한된 제한된 Python 환경. 실행 환경은 Python 3.10의 하위 집합인 RestrictedPython을 기반으로 합니다.
+ 코드 블록은 다른 코드 블록 또는 작업을 호출할 수 없습니다.

**모범 사례**
+ 코드 블록을 단순하고 집중적으로 유지
+ 설명 함수 이름 사용
+ 사용 가능한 경우 항상 사전 구축된 작업을 선호합니다.
+ 집중 디버깅 옵션이 제한되어 있으므로 코드 블록을 철저히 테스트합니다.)

**사용 사례 예**
+ 수학 작업(원형 속성 계산 - 반경을 파라미터로 사용

  ```
  def function
  (radius):
  
      return {
          "radius": radius,
          "diameter": 2 * radius,
          "circumference": round(2 * math.pi * radius, 2),
          "area": round(math.pi * radius ** 2, 2)
      }
  ```
+ 현재 날짜/시간 가져오기

  ```
  def function
  ():
  
      now = datetime.datetime.now()
  
      return {
          "current_date": now.strftime("%Y-%m-%d"),
          "current_time": now.strftime("%H:%M:%S"),
          "formatted": now.strftime("%B %d, %Y at %I:%M %p"),
          "iso_format": now.isoformat(),
          "timestamp": now.timestamp()
      }
  ```
+ 날짜 차이 계산 - 파라미터로 시작 날짜 및 종료 날짜 계산

  ```
  def function
  _(start_date_str, end_date_str):
  
  # Parse date strings (format: YYYY-MM-DD)_
      start = datetime.datetime.strptime(start_date_str, "%Y-%m-%d")
      end = datetime.datetime.strptime(end_date_str, "%Y-%m-%d")
  
      _# Calculate difference_
      difference = end - start
      return {
          "days": difference.days,
          "weeks": difference.days // 7,
          "start": start_date_str,
          "end": end_date_str    }
  ```
+ 정규식을 사용한 패턴 일치 및 텍스트 조작(이메일 주소, 전화번호 등 검증)

  ```
  def function
  (email, phone, zip_code):
  
      email_pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
      phone_pattern = r'^\d{3}-\d{3}-\d{4}$'
      zip_pattern = r'^\d{5}(-\d{4})?$'
  
      return {
          "email_valid": bool(re.match(email_pattern, email)),
          "phone_valid": bool(re.match(phone_pattern, phone)),
          "zip_valid": bool(re.match(zip_pattern, zip_code))
      }
  ```
+ 목록 작업(필터 및 변환 목록)

  ```
  def function
  (numbers, threshold):
  
      # Filter numbers above threshold and calculate statistics
      filtered = [n for n in numbers if n > threshold]
  
      if filtered:
          return {
              "filtered_numbers": filtered,
              "count": len(filtered),
              "sum": sum(filtered),
              "average": sum(filtered) / len(filtered),
              "min": min(filtered),
              "max": max(filtered)
          }
      else:
          return {
              "filtered_numbers": [],
              "count": 0,
              "message": "No numbers above threshold"
          }
  ```