

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# コード
<a name="actions-code"></a>

Quick Automate のコードアクションを使用すると、Python コードブロックを使用してカスタムロジックを実装でき、標準のオートメーションアクションがサポートする範囲を超えます。複雑なデータ変換や計算に適しており、セキュリティを維持するために制限された Python 環境内で実行されます。

**2 種類のコードアクション:**
+ **単一行式:** 値を返さずに変数を変更する 1 行の高速オペレーション
+ **カスタムコードブロック:** パラメータと戻り値を含む複雑なロジックの複数行 Python 関数

**コードアクションを使用するタイミング:**

次の必要がある場合は、コードブロックを使用します。
+ 標準アクションでは利用できない複雑なデータ変換を実行する
+ カスタムビジネスロジックまたは計算を実装する
+ データ構造 (リスト、ディクショナリ、JSON) を処理または操作する
+ 日付、時刻、タイムゾーンをカスタムで操作する
+ 複雑なパターンを持つ文字列を解析またはフォーマットする
+ 複数のアクションを 1 つのコードブロックに統合して自動化パフォーマンスを最適化する

**コードアクションを使用しない場合:**

次の場合、コードブロックは避けてください。
+ ユースケースの標準オートメーションアクションが既に存在します
+ オペレーションは、組み込みアクションに十分シンプルです。
+ 外部 APIs とやり取りする必要があります (代わりに REST API 統合を使用)
+ ファイルシステムまたはデータベースにアクセスする必要がある (適切な統合を使用)

**コードアクションにアクセスする方法:**

コードブロックは、複数のインターフェイスを介して使用できます。
+ **アクションパネル (推奨):**
  + Automation Builder でオートメーションを開く
  + 右側のアクションパネルをクリックします。
  + コードアクションセクションで「カスタムコードブロック」を見つけます。
  + コードブロックをオートメーションワークフローにドラッグアンドドロップする
+ **Assistant でビルドする:**
  + アシスタントがカスタムコードが必要と判断した場合に、プラン生成時に使用可能
  + アシスタントが複雑なオペレーションのコードブロックを自動的に提案する
  + カスタムロジックのニーズを記述することで、コードブロックをリクエストできます。

**利用可能なアクション:**

## 単一行式
<a name="single-line-expressions"></a>

単一行式は、値を返さずにオペレーションを実行する 1 行の 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    }
  ```
+ 正規表現を使用したパターンマッチングとテキスト操作 (E メールアドレス、電話番号の検証など)

  ```
  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"
          }
  ```