マルチレベル費用承認と経費精算の自動化

上級

これは自動化ワークフローで、21個のノードを含みます。主にIf, Set, Code, Gmail, Slackなどのノードを使用。 JotForm、Slack、および Google Sheets を使用した多段階費用承認と精算の自動化

前提条件
  • Googleアカウント + Gmail API認証情報
  • Slack Bot Token または Webhook URL
  • Google Sheets API認証情報

カテゴリー

-
ワークフロープレビュー
ノード接続関係を可視化、ズームとパンをサポート
ワークフローをエクスポート
以下のJSON設定をn8nにインポートして、このワークフローを使用できます
{
  "meta": {
    "instanceId": "277842713620d9f5554de3b1518b865a152c8c4db680008bd8aec536fc18b4a8",
    "templateCredsSetupCompleted": true
  },
  "nodes": [
    {
      "id": "2eb6d9f2-7f9d-453f-a548-cf2660f7248c",
      "name": "JotFormトリガー",
      "type": "n8n-nodes-base.jotFormTrigger",
      "position": [
        -1120,
        -16
      ],
      "webhookId": "expense-submission",
      "parameters": {
        "form": "252860582136459"
      },
      "credentials": {
        "jotFormApi": {
          "id": "W7O1b225FpOwkwDT",
          "name": "JotForm account-Deepanshi"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "0798c2b1-7ed5-45ce-a26c-2e8f7ada6a43",
      "name": "フォームデータ解析",
      "type": "n8n-nodes-base.code",
      "position": [
        -864,
        -16
      ],
      "parameters": {
        "jsCode": "// Parse form data and prepare for processing\nconst formData = $input.first().json;\n\nreturn {\n  json: {\n    submissionId: formData.submissionID || Date.now().toString(),\n    employeeName: formData.employeeName || formData.q3_employeeName,\n    employeeEmail: formData.employeeEmail || formData.q4_employeeEmail,\n    employeeId: formData.employeeId || formData.q5_employeeId,\n    amount: parseFloat(formData.amount || formData.q6_amount),\n    category: formData.category || formData.q7_category,\n    merchant: formData.merchant || formData.q8_merchant,\n    date: formData.date || formData.q9_date,\n    description: formData.description || formData.q10_description,\n    receiptUrl: formData.receiptUrl || formData.q11_receipt,\n    submittedAt: new Date().toISOString()\n  }\n};"
      },
      "typeVersion": 2
    },
    {
      "id": "df2085e9-dc08-4f25-a99e-009e2340b47c",
      "name": "ポリシー検証",
      "type": "n8n-nodes-base.code",
      "position": [
        -672,
        -16
      ],
      "parameters": {
        "jsCode": "// Company policy rules and validation\nconst data = $input.first().json;\n\nconst policy = {\n  maxAmounts: {\n    meals: 75,\n    travel: 500,\n    office_supplies: 200,\n    software: 1000,\n    entertainment: 150,\n    other: 100\n  },\n  approvedCategories: ['meals', 'travel', 'office_supplies', 'software', 'entertainment'],\n  autoApproveThreshold: 100,\n  managerApprovalThreshold: 500\n};\n\nconst amount = data.amount;\nconst category = data.category;\n\nlet policyViolations = [];\nlet requiresApproval = 'auto';\n\nif (!policy.approvedCategories.includes(category)) {\n  policyViolations.push('Category not approved');\n}\n\nif (policy.maxAmounts[category] && amount > policy.maxAmounts[category]) {\n  policyViolations.push('Amount exceeds category limit');\n}\n\nif (amount < policy.autoApproveThreshold && policyViolations.length === 0) {\n  requiresApproval = 'auto';\n} else if (amount >= policy.autoApproveThreshold && amount < policy.managerApprovalThreshold) {\n  requiresApproval = 'manager';\n} else if (amount >= policy.managerApprovalThreshold) {\n  requiresApproval = 'director';\n}\n\nreturn {\n  json: {\n    ...data,\n    policyViolations: policyViolations,\n    isCompliant: policyViolations.length === 0,\n    requiresApproval: requiresApproval,\n    status: 'pending'\n  }\n};"
      },
      "typeVersion": 2
    },
    {
      "id": "4ac52b34-7a64-49f5-b368-43d8b99bcab3",
      "name": "違反チェック",
      "type": "n8n-nodes-base.if",
      "position": [
        -464,
        -16
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 1,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "condition1",
              "operator": {
                "type": "number",
                "operation": "equals"
              },
              "leftValue": "={{ $json.policyViolations.length }}",
              "rightValue": 0
            }
          ]
        }
      },
      "typeVersion": 2
    },
    {
      "id": "9d132c2f-7f99-4b36-b543-27131702460c",
      "name": "却下設定",
      "type": "n8n-nodes-base.set",
      "position": [
        -272,
        144
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "status",
              "name": "status",
              "type": "string",
              "value": "rejected"
            },
            {
              "id": "rejectionReason",
              "name": "rejectionReason",
              "type": "string",
              "value": "=Policy violations: {{ $json.policyViolations.join(', ') }}"
            }
          ]
        }
      },
      "typeVersion": 3.3
    },
    {
      "id": "47566677-5342-4b26-9974-793526a59bd9",
      "name": "自動ルーティング",
      "type": "n8n-nodes-base.if",
      "position": [
        -272,
        -176
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "condition1",
              "operator": {
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $json.requiresApproval }}",
              "rightValue": "auto"
            }
          ]
        }
      },
      "typeVersion": 2
    },
    {
      "id": "c0b971bc-a5ce-48b6-978c-54ae02112505",
      "name": "自動承認",
      "type": "n8n-nodes-base.set",
      "position": [
        -64,
        -272
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "status",
              "name": "status",
              "type": "string",
              "value": "approved"
            },
            {
              "id": "approvedBy",
              "name": "approvedBy",
              "type": "string",
              "value": "System (Auto-Approved)"
            },
            {
              "id": "approvedAt",
              "name": "approvedAt",
              "type": "string",
              "value": "={{ new Date().toISOString() }}"
            }
          ]
        }
      },
      "typeVersion": 3.3
    },
    {
      "id": "eef387ab-bee8-4570-8cca-26ccbd30abeb",
      "name": "マネージャールーティング",
      "type": "n8n-nodes-base.if",
      "position": [
        -64,
        -80
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "condition1",
              "operator": {
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $json.requiresApproval }}",
              "rightValue": "manager"
            }
          ]
        }
      },
      "typeVersion": 2
    },
    {
      "id": "74152681-2cf6-4e76-aabb-87ae00a86048",
      "name": "Slackマネージャー",
      "type": "n8n-nodes-base.slack",
      "position": [
        144,
        -224
      ],
      "webhookId": "61c90b37-cd59-4332-b0c6-0f8f15004d43",
      "parameters": {
        "text": "=New Expense Approval Required\nEmployee: {{ $json.employeeName }}\nAmount: ${{ $json.amount }}\nCategory: {{ $json.category }}",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "list",
          "value": "C01234567"
        },
        "otherOptions": {}
      },
      "credentials": {
        "slackApi": {
          "id": "piPcLxWbLrndcGhp",
          "name": "Slack account - Deepanshi"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "e05fba8b-60e5-4438-9f7a-cd828bace8b8",
      "name": "Slackディレクター",
      "type": "n8n-nodes-base.slack",
      "position": [
        144,
        -16
      ],
      "webhookId": "eba016eb-5ad8-4d29-822e-9038e73a0733",
      "parameters": {
        "text": "=High-Value Expense - Director Approval\nEmployee: {{ $json.employeeName }}\nAmount: ${{ $json.amount }}\nCategory: {{ $json.category }}",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "list",
          "value": "C98765432"
        },
        "otherOptions": {}
      },
      "credentials": {
        "slackApi": {
          "id": "piPcLxWbLrndcGhp",
          "name": "Slack account - Deepanshi"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "b7a58104-fc21-485a-8c93-edb1dc253b2b",
      "name": "Sheetsへの記録",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        336,
        -64
      ],
      "parameters": {
        "columns": {
          "value": {},
          "schema": [],
          "mappingMode": "autoMapInputData",
          "matchingColumns": [
            "submissionId"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "appendOrUpdate",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "YOUR_GOOGLE_SHEET_ID"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "Kz2DdSp11rxqwlFt",
          "name": "Google Sheets account - Deepanshi"
        }
      },
      "typeVersion": 4.4
    },
    {
      "id": "1af29bbe-b3ee-42ee-91a9-388b70659c48",
      "name": "承認確認",
      "type": "n8n-nodes-base.if",
      "position": [
        544,
        -64
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "condition1",
              "operator": {
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $json.status }}",
              "rightValue": "approved"
            }
          ]
        }
      },
      "typeVersion": 2
    },
    {
      "id": "0e8c5d12-fee3-4c7d-bc16-77a79e39befe",
      "name": "却下メール",
      "type": "n8n-nodes-base.gmail",
      "position": [
        752,
        0
      ],
      "webhookId": "fe2cb3ee-3c0f-4429-ac5c-9482a923f808",
      "parameters": {
        "sendTo": "={{ $json.employeeEmail }}",
        "message": "=Hi, Your expense for {{ $json.amount}} has been rejected as it did not matches with the company's validation policy.",
        "options": {},
        "subject": "=Expense Rejected - ${{ $json.amount }}"
      },
      "credentials": {
        "gmailOAuth2": {
          "id": "PIMDNhXNj8Zyiz3G",
          "name": "Gmail account - Deepanshi"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "1b5d88c6-fe8f-4984-9e9e-19789ba76c60",
      "name": "承認済み",
      "type": "n8n-nodes-base.gmail",
      "position": [
        752,
        -192
      ],
      "webhookId": "fe2cb3ee-3c0f-4429-ac5c-9482a923f808",
      "parameters": {
        "sendTo": "={{ $json.employeeEmail }}",
        "message": "Hi, Your expense for {{ $json.Amount }} has been approved",
        "options": {},
        "subject": "=Expense Approved - ${{ $json.amount }}"
      },
      "credentials": {
        "gmailOAuth2": {
          "id": "PIMDNhXNj8Zyiz3G",
          "name": "Gmail account - Deepanshi"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "6382a19b-08de-4466-9013-696d5ffac4db",
      "name": "付箋",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1200,
        -208
      ],
      "parameters": {
        "height": 432,
        "content": "📩 Trigger: New Expense Submission\nCaptures employee expense details \nand receipt upload from JotForm.\nCreate your form for free on [JotForm using this link](https://www.jotform.com/?partner=mediajade) \n"
      },
      "typeVersion": 1
    },
    {
      "id": "5b890f09-277e-41e6-9628-dd6907b14e5f",
      "name": "付箋1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -912,
        -160
      ],
      "parameters": {
        "width": 192,
        "content": "🧾 Parse & Normalize Data\nExtracts key fields (name, email, amount, \ncategory, merchant, receipt URL) \nfor further processing.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "fe3ea799-b6f3-48f4-bbc4-96623e1e8256",
      "name": "付箋2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -720,
        112
      ],
      "parameters": {
        "width": 208,
        "height": 192,
        "content": "⚙️ Policy Validation\nChecks compliance against company rules:\n- Allowed categories\n- Max amount limits\n- Auto/Manager/Director approval routing\n"
      },
      "typeVersion": 1
    },
    {
      "id": "11112b1f-af67-4c7c-86cc-b4ccfe83a249",
      "name": "付箋3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -512,
        -160
      ],
      "parameters": {
        "width": 176,
        "content": "🚫 Compliance Check\nIf violations exist → reject\nElse → continue for approval routing\n"
      },
      "typeVersion": 1
    },
    {
      "id": "054e826f-590f-4de0-8ccd-d299d2f6e044",
      "name": "付箋4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -288,
        -368
      ],
      "parameters": {
        "width": 576,
        "height": 496,
        "content": "⚡ Routing Decision\nDetermines if expense should be:\n- Auto-approved\n- Sent for manager approval\n- Sent for director approval\n"
      },
      "typeVersion": 1
    },
    {
      "id": "6ebce30b-f8d7-4bf2-bdf3-6f33b8363a55",
      "name": "付箋5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        320,
        -224
      ],
      "parameters": {
        "width": 208,
        "height": 384,
        "content": "📊 Audit Logging\nAppends expense status, \napprover details, and decision \nto Google Sheets for tracking.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "f5e44753-7705-41e1-bdac-0158deea26ab",
      "name": "付箋6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        544,
        -384
      ],
      "parameters": {
        "width": 384,
        "height": 576,
        "content": "🔍 Approval Check\nBranches workflow to send \napproval or rejection emails \nbased on final status.\n"
      },
      "typeVersion": 1
    }
  ],
  "pinData": {},
  "connections": {
    "47566677-5342-4b26-9974-793526a59bd9": {
      "main": [
        [
          {
            "node": "c0b971bc-a5ce-48b6-978c-54ae02112505",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "eef387ab-bee8-4570-8cca-26ccbd30abeb",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "1af29bbe-b3ee-42ee-91a9-388b70659c48": {
      "main": [
        [
          {
            "node": "1b5d88c6-fe8f-4984-9e9e-19789ba76c60",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "0e8c5d12-fee3-4c7d-bc16-77a79e39befe",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "c0b971bc-a5ce-48b6-978c-54ae02112505": {
      "main": [
        [
          {
            "node": "b7a58104-fc21-485a-8c93-edb1dc253b2b",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "b7a58104-fc21-485a-8c93-edb1dc253b2b": {
      "main": [
        [
          {
            "node": "1af29bbe-b3ee-42ee-91a9-388b70659c48",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "eef387ab-bee8-4570-8cca-26ccbd30abeb": {
      "main": [
        [
          {
            "node": "74152681-2cf6-4e76-aabb-87ae00a86048",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "e05fba8b-60e5-4438-9f7a-cd828bace8b8",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "9d132c2f-7f99-4b36-b543-27131702460c": {
      "main": [
        [
          {
            "node": "b7a58104-fc21-485a-8c93-edb1dc253b2b",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "74152681-2cf6-4e76-aabb-87ae00a86048": {
      "main": [
        [
          {
            "node": "b7a58104-fc21-485a-8c93-edb1dc253b2b",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "e05fba8b-60e5-4438-9f7a-cd828bace8b8": {
      "main": [
        [
          {
            "node": "b7a58104-fc21-485a-8c93-edb1dc253b2b",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "2eb6d9f2-7f9d-453f-a548-cf2660f7248c": {
      "main": [
        [
          {
            "node": "0798c2b1-7ed5-45ce-a26c-2e8f7ada6a43",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "0798c2b1-7ed5-45ce-a26c-2e8f7ada6a43": {
      "main": [
        [
          {
            "node": "df2085e9-dc08-4f25-a99e-009e2340b47c",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "df2085e9-dc08-4f25-a99e-009e2340b47c": {
      "main": [
        [
          {
            "node": "4ac52b34-7a64-49f5-b368-43d8b99bcab3",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "4ac52b34-7a64-49f5-b368-43d8b99bcab3": {
      "main": [
        [
          {
            "node": "47566677-5342-4b26-9974-793526a59bd9",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "9d132c2f-7f99-4b36-b543-27131702460c",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
よくある質問

このワークフローの使い方は?

上記のJSON設定コードをコピーし、n8nインスタンスで新しいワークフローを作成して「JSONからインポート」を選択、設定を貼り付けて認証情報を必要に応じて変更してください。

このワークフローはどんな場面に適していますか?

上級

有料ですか?

このワークフローは完全無料です。ただし、ワークフローで使用するサードパーティサービス(OpenAI APIなど)は別途料金が発生する場合があります。

ワークフロー情報
難易度
上級
ノード数21
カテゴリー-
ノードタイプ8
難易度説明

上級者向け、16ノード以上の複雑なワークフロー

作成者
Jitesh Dugar

Jitesh Dugar

@jiteshdugar

AI Automation Specialist - OpenAI, CRM & Automation Expert with a solid understanding of various tools that include Zapier, Make, Zoho CRM, Hubspot, Google Sheets, Airtable, Pipedrive, Google Analytics, and more.

外部リンク
n8n.ioで表示

このワークフローを共有

カテゴリー

カテゴリー: 34