自動テストの実行とステータス更新

上級

これは自動化ワークフローで、27個のノードを含みます。主にIf, Set, Code, ClickUp, GoogleDriveなどのノードを使用。 Google Drive、スプレッドシート、ClickUp 結果記録を統合した自動化ワークフロー テスト ランナー

前提条件
  • Google Drive API認証情報
  • Google Sheets API認証情報

カテゴリー

-
ワークフロープレビュー
ノード接続関係を可視化、ズームとパンをサポート
ワークフローをエクスポート
以下のJSON設定をn8nにインポートして、このワークフローを使用できます
{
  "id": "ZI6iraWt5DF3ohnS",
  "meta": {
    "instanceId": "8443f10082278c46aa5cf3acf8ff0f70061a2c58bce76efac814b16290845177",
    "templateCredsSetupCompleted": true
  },
  "name": "Automated Test Run and Status Update",
  "tags": [],
  "nodes": [
    {
      "id": "ebbca67b-a5e8-47a6-b0f0-0e01a2cf0c90",
      "name": "「ワークフロー実行」クリック時",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        -576,
        0
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "f90f0568-e7ab-451c-bfe9-7151835fec62",
      "name": "付箋",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -384,
        208
      ],
      "parameters": {
        "width": 304,
        "height": 368,
        "content": "## 🔄 Execute Target Workflow Under Test\n**Action:**  \n- Calls and executes the \"Archive Payment Receipts\" workflow as a sub-process.  \n**Description:**  \n- Runs the specified workflow and waits for its completion.  \n- Configured to continue execution even if the sub-workflow encounters errors.  \n- Captures the output (including any error objects) for validation in subsequent steps.  \n- Critical for automated regression testing and CI/CD pipelines."
      },
      "typeVersion": 1
    },
    {
      "id": "f5de02c6-f686-402f-90df-80bc60151c1c",
      "name": "付箋1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -96,
        -480
      ],
      "parameters": {
        "height": 448,
        "content": "## ✅ Test Result Evaluation (Pass/Fail Check)\n**Action:**  \n- Determines whether the sub-workflow executed successfully or failed.  \n**Description:**  \n- Checks if an \"error\" field exists in the returned JSON data.  \n- **True Path (No Error):** Routes to success logging branch.  \n- **False Path (Error Exists):** Routes to failure logging and error reporting branch.  \n- Acts as the decision gateway for all downstream reporting actions."
      },
      "typeVersion": 1
    },
    {
      "id": "3af7b28f-f3a6-45af-a3c0-49d0d867290d",
      "name": "テスト結果評価",
      "type": "n8n-nodes-base.if",
      "position": [
        -16,
        0
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "loose"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "c9f7e963-a035-4c64-82ef-f870f1d6587c",
              "operator": {
                "type": "string",
                "operation": "notExists",
                "singleValue": true
              },
              "leftValue": "={{$json[\"error\"]}}",
              "rightValue": ""
            }
          ]
        },
        "looseTypeValidation": true
      },
      "typeVersion": 2.2
    },
    {
      "id": "c9ded697-7e80-4c9d-ae63-b34dd83a4b4b",
      "name": "成功テスト結果のフォーマット",
      "type": "n8n-nodes-base.set",
      "position": [
        384,
        -208
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "e70c3468-0767-470a-b780-7e17188788c2",
              "name": "status",
              "type": "string",
              "value": "✅ Passed"
            },
            {
              "id": "6b01dbe6-137a-46d0-b909-0c863d25e3a1",
              "name": "tested_workflow",
              "type": "string",
              "value": "Retention Tracking Post-Hire"
            },
            {
              "id": "5ca7a3ff-f30a-4ab4-9a54-b33188458d7a",
              "name": "",
              "type": "string",
              "value": ""
            },
            {
              "id": "f6f5dd9b-379c-4e96-b74f-d394f0e9d83f",
              "name": "timestamp",
              "type": "string",
              "value": "=={{$now}}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "0df832de-9809-4c05-944b-1ab8e62fb6ff",
      "name": "付箋2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1232,
        -704
      ],
      "parameters": {
        "height": 448,
        "content": "## ☁️ Archive Success Report to Google Drive\n**Action:**  \n- Uploads the success test report file to a designated Google Drive folder.  \n**Description:**  \n- Stores test results in the \"resume store\" folder for centralized access.  \n- File name dynamically includes workflow name, status, and timestamp.  \n- Provides a permanent record of successful test executions.  \n- Supports compliance and audit trail requirements."
      },
      "typeVersion": 1
    },
    {
      "id": "18671bfd-775b-42e6-a64e-3921ffee5961",
      "name": "付箋3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        960,
        -640
      ],
      "parameters": {
        "height": 384,
        "content": "## 📦 Convert Success Report to Text File\n**Action:**  \n- Transforms the formatted text into a downloadable .txt file.  \n**Description:**  \n- Prepares the success report for upload to Google Drive.  \n- File naming includes workflow name, status, and timestamp for easy identification.  \n- Supports long-term archival and audit requirements."
      },
      "typeVersion": 1
    },
    {
      "id": "90db750f-6254-40d3-8755-4b22c377f3c3",
      "name": "付箋4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        640,
        -640
      ],
      "parameters": {
        "height": 400,
        "content": "## 📄 Generate Success Report Text\n**Action:**  \n- Formats test result data into a human-readable text report.  \n**Description:**  \n- Concatenates workflow name, pass status, and timestamp into a structured text block.  \n- Output is used for file creation and task updates.  \n- Ensures consistent formatting across all reporting channels."
      },
      "typeVersion": 1
    },
    {
      "id": "fcce2d0a-4f68-49c5-a1e6-87be0cadb94b",
      "name": "付箋5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        288,
        -672
      ],
      "parameters": {
        "height": 448,
        "content": "## 🎯 Format Success Test Result\n**Action:**  \n- Structures the test outcome data for successful workflow execution.  \n**Description:**  \n- Creates a standardized result object containing:  \n  - Status: \"✅ Passed\"  \n  - Tested Workflow Name: \"Retention Tracking Post-Hire\"  \n  - Timestamp: Current execution time  \n- Prepares data for archival and notification in subsequent nodes."
      },
      "typeVersion": 1
    },
    {
      "id": "48482dbc-5fa7-47d6-8f4e-94f4f7cecf3c",
      "name": "付箋6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        320,
        384
      ],
      "parameters": {
        "height": 448,
        "content": "## ❌ Format Failed Test Result\n**Action:**  \n- Structures the test outcome data for failed workflow execution.  \n**Description:**  \n- Creates a standardized result object containing:  \n  - Status: \"❌ Failed\"  \n  - Tested Workflow Name: \"Retention Tracking Post-Hire\"  \n  - Timestamp: Current execution time  \n- Ensures failure details are captured for debugging and audit trails."
      },
      "typeVersion": 1
    },
    {
      "id": "163d4cae-b9b2-4317-867e-d5b3ad1d4173",
      "name": "失敗テスト結果のフォーマット",
      "type": "n8n-nodes-base.set",
      "position": [
        368,
        224
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "e70c3468-0767-470a-b780-7e17188788c2",
              "name": "status",
              "type": "string",
              "value": "❌ Failed"
            },
            {
              "id": "6b01dbe6-137a-46d0-b909-0c863d25e3a1",
              "name": "tested_workflow",
              "type": "string",
              "value": "Retention Tracking Post-Hire"
            },
            {
              "id": "f6f5dd9b-379c-4e96-b74f-d394f0e9d83f",
              "name": "timestamp",
              "type": "string",
              "value": "=={{$now}}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "5040deb0-6db6-40c8-9cad-f8637dd2f9fa",
      "name": "成功レポートテキスト生成",
      "type": "n8n-nodes-base.code",
      "position": [
        736,
        -208
      ],
      "parameters": {
        "jsCode": "return [\n  {\n    json: {\n      text: `Workflow: ${$json.tested_workflow}\nStatus: ${$json.status}\nTimestamp: ${$json.timestamp}`\n    }\n  }\n];\n"
      },
      "typeVersion": 2
    },
    {
      "id": "2b1741e8-7258-4f28-b050-57dc4545692b",
      "name": "付箋7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1232,
        416
      ],
      "parameters": {
        "height": 400,
        "content": "## ☁️ Archive Failure Report to Google Drive\n**Action:**  \n- Uploads the failure test report file to a designated Google Drive folder.  \n**Description:**  \n- Stores test results in the \"resume store\" folder alongside success reports.  \n- Enables team members to review failed test runs without accessing n8n directly.  \n- Facilitates root cause analysis and troubleshooting."
      },
      "typeVersion": 1
    },
    {
      "id": "8e5de5e8-71a1-4a74-b1a9-df712153c9db",
      "name": "付箋8",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        944,
        416
      ],
      "parameters": {
        "height": 352,
        "content": "## 📦 Convert Failure Report to Text File\n**Action:**  \n- Transforms the formatted text into a downloadable .txt file.  \n**Description:**  \n- Prepares the failure report for upload to Google Drive.  \n- File naming convention matches success reports for consistent organization.  \n- Critical for post-mortem analysis and debugging."
      },
      "typeVersion": 1
    },
    {
      "id": "54f6ba7c-b99c-40c3-a0ec-14bfd933ca2c",
      "name": "付箋9",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        672,
        400
      ],
      "parameters": {
        "height": 368,
        "content": "## 📄 Generate Failure Report Text\n**Action:**  \n- Formats test result data into a human-readable text report.  \n**Description:**  \n- Concatenates workflow name, fail status, and timestamp into a structured text block.  \n- Mirrors the success report structure for consistency.  \n- Enables quick identification of failed test runs in logs and notifications."
      },
      "typeVersion": 1
    },
    {
      "id": "6637cf99-13de-4668-bb63-ea921dccc182",
      "name": "失敗レポートテキスト生成",
      "type": "n8n-nodes-base.code",
      "position": [
        736,
        224
      ],
      "parameters": {
        "jsCode": "return [\n  {\n    json: {\n      text: `Workflow: ${$json.tested_workflow}\nStatus: ${$json.status}\nTimestamp: ${$json.timestamp}`\n    }\n  }\n];\n"
      },
      "typeVersion": 2
    },
    {
      "id": "1140f35d-1fc6-4dab-b7a5-4ac118ea4a6d",
      "name": "成功レポートをテキストファイルに変換",
      "type": "n8n-nodes-base.convertToFile",
      "position": [
        1024,
        -208
      ],
      "parameters": {
        "options": {},
        "operation": "toText",
        "sourceProperty": "=text"
      },
      "typeVersion": 1.1
    },
    {
      "id": "57b36b45-ebfb-4e36-8b3d-79641f1831a9",
      "name": "失敗レポートをテキストファイルに変換",
      "type": "n8n-nodes-base.convertToFile",
      "position": [
        1008,
        224
      ],
      "parameters": {
        "options": {},
        "operation": "toText",
        "sourceProperty": "=text"
      },
      "typeVersion": 1.1
    },
    {
      "id": "4b572d2b-e233-410b-aa83-abae2b023184",
      "name": "成功レポートをGoogle Driveにアーカイブ",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        1296,
        -208
      ],
      "parameters": {
        "name": "={{ $json.tested_workflow }}_{{ $json.status }}_{{ $json.timestamp.replace(/[:.]/g, \"-\") }}.txt\n",
        "driveId": {
          "__rl": true,
          "mode": "list",
          "value": "My Drive"
        },
        "options": {},
        "folderId": {
          "__rl": true,
          "mode": "list",
          "value": "16lOVXsq0xkvJ8sCM7hCFAghQvDOXann7",
          "cachedResultUrl": "https://drive.google.com/drive/folders/16lOVXsq0xkvJ8sCM7hCFAghQvDOXann7",
          "cachedResultName": "resume store"
        }
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "id": "E7nEqUL27GUx1xHa",
          "name": "Techdome Account"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "0c3a0ce7-61bd-4ab4-9e3b-a0f6a97c75bb",
      "name": "失敗レポートをGoogle Driveにアーカイブ",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        1312,
        224
      ],
      "parameters": {
        "name": "={{ $json.tested_workflow }}_{{ $json.status }}_{{ $json.timestamp.replace(/[:.]/g, \"-\") }}.txt\n",
        "driveId": {
          "__rl": true,
          "mode": "list",
          "value": "My Drive"
        },
        "options": {},
        "folderId": {
          "__rl": true,
          "mode": "list",
          "value": "16lOVXsq0xkvJ8sCM7hCFAghQvDOXann7",
          "cachedResultUrl": "https://drive.google.com/drive/folders/16lOVXsq0xkvJ8sCM7hCFAghQvDOXann7",
          "cachedResultName": "resume store"
        }
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "id": "E7nEqUL27GUx1xHa",
          "name": "Techdome Account"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "dcde5325-c1a3-4e33-acf9-661587287d9f",
      "name": "付箋10",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1552,
        400
      ],
      "parameters": {
        "height": 400,
        "content": "## ✏️ Update ClickUp Task with Failure Status\n**Action:**  \n- Posts the failure test result to a specific ClickUp task for team visibility.  \n**Description:**  \n- Updates task ID .. with formatted test outcome.  \n- Alerts the team to failed test runs immediately.  \n- Centralizes test monitoring in the project management platform."
      },
      "typeVersion": 1
    },
    {
      "id": "5622acb4-1563-498d-9ac8-cb0d2fdadebf",
      "name": "付箋11",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1520,
        -656
      ],
      "parameters": {
        "height": 400,
        "content": "## ✏️ Update ClickUp Task with Success Status\n**Action:**  \n- Posts the success test result to a specific ClickUp task for team visibility.  \n**Description:**  \n- Updates task ID with formatted test outcome.  \n- Keeps project management tools synchronized with test results.  \n- Enables real-time notifications to stakeholders without manual updates."
      },
      "typeVersion": 1
    },
    {
      "id": "7c80063a-3bfe-4677-9dfc-9f24616bb84a",
      "name": "ClickUpタスクを成功ステータスで更新",
      "type": "n8n-nodes-base.clickUp",
      "position": [
        1552,
        -208
      ],
      "parameters": {
        "id": "86b700vbb",
        "operation": "update",
        "updateFields": {
          "content": "={{ $('Generate Success Report Text').item.json.text }}"
        }
      },
      "credentials": {
        "clickUpApi": {
          "id": "kahuAqa6VKsSxhn1",
          "name": "ClickUp account 3"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "b26d1493-d58a-4395-b4d3-d2bdfa4080cb",
      "name": "ClickUpタスクを失敗ステータスで更新",
      "type": "n8n-nodes-base.clickUp",
      "position": [
        1584,
        224
      ],
      "parameters": {
        "id": "86b700vbb",
        "operation": "update",
        "updateFields": {
          "content": "={{ $('Generate Failure Report Text').item.json.text }}"
        }
      },
      "credentials": {
        "clickUpApi": {
          "id": "kahuAqa6VKsSxhn1",
          "name": "ClickUp account 3"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "5dff41d1-8ca3-49e2-a6cd-f181bb402cb0",
      "name": "付箋12",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -144,
        784
      ],
      "parameters": {
        "height": 448,
        "content": "## 📊 Log Error Details to Error Tracking Sheet\n**Action:**  \n- Appends error information to a dedicated error log in Google Sheets.  \n**Description:**  \n- Writes to the \"error log sheet\" tab in the \"Interviewer Brief Pack\" spreadsheet.  \n- Captures raw error objects for detailed analysis.  \n- Creates a queryable database of all test failures for trend analysis.  \n- Supports continuous improvement of workflow reliability."
      },
      "typeVersion": 1
    },
    {
      "id": "4a18b563-f4ef-4ad8-8b19-74d45ac01736",
      "name": "エラー詳細をエラー追跡シートに記録",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        144,
        752
      ],
      "parameters": {
        "columns": {
          "value": {
            "error": "={{ $json.error }}"
          },
          "schema": [
            {
              "id": "error_id",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "error_id",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "error",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "error",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "appendOrUpdate",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 1338537721,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1Uldk_4BxWbdZTDZxFUeohIfeBmGHHqVEl9Ogb0l6R8Y/edit#gid=1338537721",
          "cachedResultName": "error log sheet"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1Uldk_4BxWbdZTDZxFUeohIfeBmGHHqVEl9Ogb0l6R8Y",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1Uldk_4BxWbdZTDZxFUeohIfeBmGHHqVEl9Ogb0l6R8Y/edit?usp=drivesdk",
          "cachedResultName": "Interviewer Brief Pack "
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "kpPEOLCGn963qpoh",
          "name": "automations@techdome.ai"
        }
      },
      "typeVersion": 4.6
    },
    {
      "id": "4158484c-a8ed-4c33-8ea2-f0fb7cf2194d",
      "name": "テスト対象ワークフローを実行",
      "type": "n8n-nodes-base.executeWorkflow",
      "onError": "continueRegularOutput",
      "position": [
        -288,
        0
      ],
      "parameters": {
        "options": {
          "waitForSubWorkflow": true
        },
        "workflowId": {
          "__rl": true,
          "mode": "list",
          "value": "gr2rafzxOw1ks4Bd",
          "cachedResultUrl": "/workflow/gr2rafzxOw1ks4Bd",
          "cachedResultName": "Archive Payment Receipts with Stripe, Google Drive, and Google Sheets"
        },
        "workflowInputs": {
          "value": {},
          "mappingMode": "defineBelow"
        }
      },
      "retryOnFail": false,
      "typeVersion": 1.3,
      "alwaysOutputData": true
    }
  ],
  "active": false,
  "pinData": {},
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "034f6efb-c4fc-498e-95fa-b58bedd10782",
  "connections": {
    "3af7b28f-f3a6-45af-a3c0-49d0d867290d": {
      "main": [
        [
          {
            "node": "c9ded697-7e80-4c9d-ae63-b34dd83a4b4b",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "163d4cae-b9b2-4317-867e-d5b3ad1d4173",
            "type": "main",
            "index": 0
          },
          {
            "node": "4a18b563-f4ef-4ad8-8b19-74d45ac01736",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "163d4cae-b9b2-4317-867e-d5b3ad1d4173": {
      "main": [
        [
          {
            "node": "6637cf99-13de-4668-bb63-ea921dccc182",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "c9ded697-7e80-4c9d-ae63-b34dd83a4b4b": {
      "main": [
        [
          {
            "node": "5040deb0-6db6-40c8-9cad-f8637dd2f9fa",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "6637cf99-13de-4668-bb63-ea921dccc182": {
      "main": [
        [
          {
            "node": "57b36b45-ebfb-4e36-8b3d-79641f1831a9",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "5040deb0-6db6-40c8-9cad-f8637dd2f9fa": {
      "main": [
        [
          {
            "node": "1140f35d-1fc6-4dab-b7a5-4ac118ea4a6d",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "4158484c-a8ed-4c33-8ea2-f0fb7cf2194d": {
      "main": [
        [
          {
            "node": "3af7b28f-f3a6-45af-a3c0-49d0d867290d",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "57b36b45-ebfb-4e36-8b3d-79641f1831a9": {
      "main": [
        [
          {
            "node": "0c3a0ce7-61bd-4ab4-9e3b-a0f6a97c75bb",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "1140f35d-1fc6-4dab-b7a5-4ac118ea4a6d": {
      "main": [
        [
          {
            "node": "4b572d2b-e233-410b-aa83-abae2b023184",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "ebbca67b-a5e8-47a6-b0f0-0e01a2cf0c90": {
      "main": [
        [
          {
            "node": "4158484c-a8ed-4c33-8ea2-f0fb7cf2194d",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "0c3a0ce7-61bd-4ab4-9e3b-a0f6a97c75bb": {
      "main": [
        [
          {
            "node": "b26d1493-d58a-4395-b4d3-d2bdfa4080cb",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "4b572d2b-e233-410b-aa83-abae2b023184": {
      "main": [
        [
          {
            "node": "7c80063a-3bfe-4677-9dfc-9f24616bb84a",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
よくある質問

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

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

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

上級

有料ですか?

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

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

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

作成者
Rahul Joshi

Rahul Joshi

@rahul08

Rahul Joshi is a seasoned technology leader specializing in the n8n automation tool and AI-driven workflow automation. With deep expertise in building open-source workflow automation and self-hosted automation platforms, he helps organizations eliminate manual processes through intelligent n8n ai agent automation solutions.

外部リンク
n8n.ioで表示

このワークフローを共有

カテゴリー

カテゴリー: 34