{
  "name": "共通エラー通知",
  "nodes": [
    {
      "parameters": {
        "content": "## 使い方\n\n1. このワークフローを **Publish** する（必須。していないと下の Error Workflow 欄に出てこない）\n2. 監視したいワークフローを開き、`...` → **Settings**\n3. **Error Workflow (to notify when this one errors)** でこのワークフローを選ぶ\n\n## 通知を飛ばすには\n\n「通知の形に整える」の後ろに Slack / メール / Google Sheets などを繋ぎ、\n本文に `{{ $json.本文 }}` を入れる。個別の項目を使うなら\n`{{ $json.失敗したノード }}` のように書く。\n\n## 注意\n\n**エラー通知は本番実行でのみ発火する。** エディタの Execute workflow で\n失敗させても飛ばない。確認するときは Publish して本番の経路で失敗させること。",
        "height": 460,
        "width": 560,
        "color": 3
      },
      "id": "16f8bdcb-3026-49e9-b676-09954e0028b5",
      "name": "使い方",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -40,
        -520
      ]
    },
    {
      "parameters": {},
      "id": "a62e24db-d3b0-41d5-b355-e7699af2b213",
      "name": "エラーを受け取る",
      "type": "n8n-nodes-base.errorTrigger",
      "typeVersion": 1,
      "position": [
        0,
        0
      ]
    },
    {
      "parameters": {
        "mode": "runOnceForAllItems",
        "language": "javaScript",
        "jsCode": "// Error Trigger が受け取る内容を、通知に使いやすい形へ平たくする。\nconst e = $input.first().json;\nconst ex = e.execution ?? {};\nconst err = ex.error ?? {};\n\n// 失敗したノード名。error.node.name に入っていなければ lastNodeExecuted を使う\nconst failedNode = (err.node && err.node.name) || ex.lastNodeExecuted || '不明';\n\n// 日本時間に直す。環境のタイムゾーンに依存させない\nconst jst = new Date(new Date().getTime() + 9 * 60 * 60 * 1000)\n  .toISOString()\n  .replace('T', ' ')\n  .slice(0, 19);\n\nconst summary = {\n  ワークフロー名: (e.workflow && e.workflow.name) || '不明',\n  失敗したノード: failedNode,\n  エラー: err.message || '不明',\n  詳細: err.description || '',\n  HTTPコード: err.httpCode || '',\n  起動方法: ex.mode || '',\n  実行ID: ex.id || '',\n  実行URL: ex.url || '',\n  発生時刻: jst + ' JST',\n};\n\n// そのまま本文として送れる文字列も用意しておく\nsummary.本文 = [\n  '【n8n】ワークフローが失敗しました',\n  'ワークフロー: ' + summary.ワークフロー名,\n  '失敗したノード: ' + summary.失敗したノード,\n  'エラー: ' + summary.エラー,\n  '発生時刻: ' + summary.発生時刻,\n  summary.実行URL ? '実行を見る: ' + summary.実行URL : '',\n].filter(Boolean).join('\\n');\n\nreturn [{ json: summary }];"
      },
      "id": "f2628d4c-b102-4882-ac14-71b20a09fac0",
      "name": "通知の形に整える",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        240,
        0
      ]
    }
  ],
  "connections": {
    "エラーを受け取る": {
      "main": [
        [
          {
            "node": "通知の形に整える",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "settings": {
    "executionOrder": "v1"
  },
  "pinData": {}
}
