8
n8n 한국어amn8n.com

GitHub 현상금 이슈 자동 추적기 (Google 스프레드시트 및 이메일/WhatsApp 알림)

고급

이것은Content Creation, Multimodal AI분야의자동화 워크플로우로, 35개의 노드를 포함합니다.주로 Html, Gmail, Merge, Filter, SplitOut 등의 노드를 사용하며. GitHub 바운티 이슈 자동 추적기 (Google 스프레드시트 및 이메일/WhatsApp 알림)

사전 요구사항
  • Google 계정 및 Gmail API 인증 정보
  • 대상 API의 인증 정보가 필요할 수 있음
  • Google Sheets API 인증 정보
워크플로우 미리보기
노드 연결 관계를 시각적으로 표시하며, 확대/축소 및 이동을 지원합니다
워크플로우 내보내기
다음 JSON 구성을 복사하여 n8n에 가져오면 이 워크플로우를 사용할 수 있습니다
{
  "meta": {
    "instanceId": "fe6dff39d2d3be45d398ed0299a41f6266c5f4ba4f146d26831ea2e5c7f037f2"
  },
  "nodes": [
    {
      "id": "d88aec02-9955-4442-a55f-47db17d73c9b",
      "name": "스케줄 트리거",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        -256,
        304
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "hours"
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "87ceaa17-c596-4c9a-b7fc-df2c02a85cce",
      "name": "시트에서 행 가져오기",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        80,
        720
      ],
      "parameters": {
        "options": {},
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1LoZk5q8DzKSCgsYF5UMEbEnIs09QZQ73k4MoOhhoKnI/edit#gid=0",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1LoZk5q8DzKSCgsYF5UMEbEnIs09QZQ73k4MoOhhoKnI",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1LoZk5q8DzKSCgsYF5UMEbEnIs09QZQ73k4MoOhhoKnI/edit?usp=drivesdk",
          "cachedResultName": "public-open-source-bounty"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "AipedLwvbgaC6bfR",
          "name": "Google Sheets account 2"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "f61d2bf5-9ce2-4f8b-ac49-0cff0c710045",
      "name": "GitHub Search HTTP Request",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        16,
        304
      ],
      "parameters": {
        "url": "https://api.github.com/search/issues",
        "options": {
          "pagination": {
            "pagination": {
              "parameters": {
                "parameters": [
                  {
                    "name": "page",
                    "value": "={{ $pageCount + 1 }}"
                  }
                ]
              },
              "completeExpression": "={{ $response.body.items.length < 100 }}",
              "paginationCompleteWhen": "other"
            }
          }
        },
        "sendQuery": true,
        "authentication": "genericCredentialType",
        "genericAuthType": "httpBearerAuth",
        "queryParameters": {
          "parameters": [
            {
              "name": "q",
              "value": "is:issue label:\"💎 Bounty\" state:open"
            },
            {
              "name": "per_page",
              "value": "100"
            }
          ]
        }
      },
      "credentials": {
        "httpBearerAuth": {
          "id": "traPuAzPGpvbzCgG",
          "name": "Bearer Auth account 2"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "f72dad12-8b5a-4c19-9e96-0369bb59f1dc",
      "name": "분할",
      "type": "n8n-nodes-base.splitOut",
      "notes": "This splits out results of the 'GitHub Search HTTP Request' node into individual items so operation can be performed on each item, instead of having a list of all items",
      "position": [
        240,
        304
      ],
      "parameters": {
        "options": {},
        "fieldToSplitOut": "items"
      },
      "typeVersion": 1
    },
    {
      "id": "4a3ff3fd-93f3-4ef1-9d08-371bbe9aca79",
      "name": "병합",
      "type": "n8n-nodes-base.merge",
      "notes": "Merge all data from 'GitHub Search HTTP Request' node with 'Get row(s) in sheet' node results in order to filter out recent ones not found in the Google Spreadsheet doc",
      "position": [
        528,
        320
      ],
      "parameters": {
        "mode": "combine",
        "options": {},
        "advanced": true,
        "joinMode": "keepNonMatches",
        "mergeByFields": {
          "values": [
            {
              "field1": "html_url",
              "field2": "Issue URL"
            }
          ]
        },
        "outputDataFrom": "input1"
      },
      "typeVersion": 3.2
    },
    {
      "id": "47672a86-2826-4007-86dd-2ff9e5f38529",
      "name": "필터",
      "type": "n8n-nodes-base.filter",
      "notes": "Filter out data not found in the Google Spreadsheet but is found in GitHub Search HTTP Request node results",
      "position": [
        752,
        320
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "f84a90c2-eaad-4639-aca2-582068d58f71",
              "operator": {
                "type": "array",
                "operation": "notContains",
                "rightType": "any"
              },
              "leftValue": "={{ $('Get row(s) in sheet').all().map(item => item.json['Issue Name']) }}",
              "rightValue": "={{ $json.title }}"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "04f3c770-187c-4de6-9bcb-39b56946fb1f",
      "name": "시트에 행 추가",
      "type": "n8n-nodes-base.googleSheets",
      "notes": "Add data not found in 'Get row(s) in sheet' node but found in 'GitHub Search HTTP Request' node result",
      "position": [
        992,
        320
      ],
      "parameters": {
        "columns": {
          "value": {
            "Issue URL": "={{ $('Filter').item.json.html_url }}",
            "Issue Name": "={{ $('Filter').item.json.title }}",
            "Issue state": "={{ $('Filter').item.json.state }}",
            "Issue Number": "={{ $('Filter').item.json.number }}",
            "Issue Repo URL": "={{ $('Filter').item.json.repository_url.replace('https://api.github.com/repos', 'https://github.com') }}",
            "Issue Updated Date": "={{ $('Filter').item.json.updated_at }}",
            "Issue Creation Date": "={{ $('Filter').item.json.created_at }}"
          },
          "schema": [
            {
              "id": "Issue Number",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Issue Number",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Issue Name",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Issue Name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Issue URL",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Issue URL",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Issue state",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Issue state",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Issue Repo URL",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Issue Repo URL",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Issue Creation Date",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Issue Creation Date",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Issue Updated Date",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Issue Updated Date",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1rSTq5uhAdMNmfDTfACHZ10tYkqh8eBkOgXuYFKBsc78/edit#gid=0",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1LoZk5q8DzKSCgsYF5UMEbEnIs09QZQ73k4MoOhhoKnI",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1LoZk5q8DzKSCgsYF5UMEbEnIs09QZQ73k4MoOhhoKnI/edit?usp=drivesdk",
          "cachedResultName": "public-open-source-bounty"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "AipedLwvbgaC6bfR",
          "name": "Google Sheets account 2"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "ff7c1a81-ca00-48d6-b02b-4815c9dd1452",
      "name": "메시지 보내기",
      "type": "n8n-nodes-base.whatsApp",
      "disabled": true,
      "position": [
        1456,
        320
      ],
      "webhookId": "7d4fc62e-e879-4917-bd96-e1b0f746f4a6",
      "parameters": {
        "textBody": "=New Bounty Alert!\nIssue: {{ $('Split Out').item.json.title }}\nNumber: #{{ $('Split Out').item.json.number }}\nStatus: {{ $('Split Out').item.json.state }}\nCreated: {{ $json.created_at }}\nRepository: {{ $('Split Out').item.json.repository_url }}\nView it here: {{ $('Split Out').item.json.html_url }}",
        "operation": "send",
        "phoneNumberId": "763560806846407",
        "additionalFields": {},
        "recipientPhoneNumber": "+2348110493637"
      },
      "credentials": {
        "whatsAppApi": {
          "id": "ZxEqot7Yd19iNjoi",
          "name": "WhatsApp account 2"
        }
      },
      "executeOnce": true,
      "typeVersion": 1
    },
    {
      "id": "60441549-f604-4d40-9f9f-20d1c8490800",
      "name": "메시지 보내기",
      "type": "n8n-nodes-base.gmail",
      "position": [
        1888,
        320
      ],
      "webhookId": "e5136b5f-b355-4174-b5a5-450be20d06eb",
      "parameters": {
        "sendTo": "jeffwhewhetu@gmail.com",
        "message": "={{ $json.html }}",
        "options": {
          "appendAttribution": false
        },
        "subject": "New Bounty Alert!"
      },
      "credentials": {
        "gmailOAuth2": {
          "id": "QqdRgyqSN11FTwV6",
          "name": "Gmail account 3"
        }
      },
      "executeOnce": false,
      "typeVersion": 2.1
    },
    {
      "id": "e71ab937-246a-4486-b624-9cb9bb429275",
      "name": "HTML",
      "type": "n8n-nodes-base.html",
      "position": [
        1664,
        320
      ],
      "parameters": {
        "html": "<!DOCTYPE html>\n<html>\n<head>\n  <meta charset=\"UTF-8\">\n  <style>\n    body {\n      font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;\n      background-color: #f6f8fa;\n      padding: 20px;\n    }\n    .container {\n      max-width: 600px;\n      margin: 0 auto;\n      background-color: #ffffff;\n      border-radius: 6px;\n      border: 1px solid #e1e4e8;\n      box-shadow: 0 1px 3px rgba(27,31,35,.04);\n      padding: 24px;\n    }\n    .header {\n      border-bottom: 1px solid #e1e4e8;\n      padding-bottom: 16px;\n      margin-bottom: 16px;\n    }\n    .header h1 {\n      color: #0366d6;\n      font-size: 24px;\n      margin: 0;\n    }\n    .issue-title {\n      font-size: 18px;\n      font-weight: 600;\n      color: #24292e;\n      margin-bottom: 8px;\n    }\n    .detail-row {\n      font-size: 14px;\n      margin-bottom: 8px;\n    }\n    .label {\n      font-weight: 600;\n      color: #586069;\n    }\n    .status-open {\n      color: #2cbe4e;\n    }\n    .status-closed {\n      color: #cb2431;\n    }\n    .link-button {\n      display: inline-block;\n      padding: 10px 16px;\n      margin-top: 16px;\n      font-size: 14px;\n      font-weight: 600;\n      color: #ffffff;\n      background-color: #0366d6;\n      border-radius: 4px;\n      text-decoration: none;\n    }\n  </style>\n</head>\n<body>\n  <div class=\"container\">\n    <div class=\"header\">\n      <h1>New GitHub Bounty Issue Alert!</h1>\n    </div>\n    \n    <p class=\"issue-title\">Issue: {{ $('Filter').item.json.title }}</p>\n    \n    <div class=\"detail-row\">\n      <span class=\"label\">Number:</span> #{{ $('Filter').item.json.number }}\n    </div>\n    <div class=\"detail-row\">\n      <span class=\"label\">Status:</span> <span class=\"{{ $json.state === 'open' ? 'status-open' : 'status-closed' }}\">{{ $('Filter').item.json.state }}</span>\n    </div>\n    <div class=\"detail-row\">\n      <span class=\"label\">Bounty Amount:{{ $('Filter').item.json.labels.find(label => label.name.includes('$'))?.name || 'No bounty specified' }} </span>\n    </div>\n        <div class=\"detail-row\">\n      <span class=\"label\">Comments on Issue:</span> {{ $('Filter').item.json.comments }}\n    </div>\n    <div class=\"detail-row\">\n      <span class=\"label\">Bounty Issue Created on:</span> {{ $('Filter').item.json.created_at }}\n    </div>\n    <div class=\"detail-row\">\n      <span class=\"label\">Repository:</span> <a href=\"{{ $('Filter').item.json.repository_url.replace('https://api.github.com/repos', 'https://github.com') }}\">{{ $('Filter').item.json.repository_url.split('/').pop() }}</a>\n    </div>\n    \n    <a href=\"{{ $('Filter').item.json.html_url }}\" class=\"link-button\">View Issue on GitHub</a>\n  </div>\n</body>\n</html>"
      },
      "typeVersion": 1.2
    },
    {
      "id": "1e114fe5-dc07-4918-ac82-78fa32b4d484",
      "name": "필터1",
      "type": "n8n-nodes-base.filter",
      "position": [
        1200,
        320
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "6aba82f7-8d0c-4862-87cc-5e8e3b4cce8e",
              "operator": {
                "type": "number",
                "operation": "gte"
              },
              "leftValue": "={{ new Date($json['Issue Creation Date']).getTime() }}",
              "rightValue": "={{ new Date().getTime() - (5 * 24 * 60 * 60 * 1000) }}"
            },
            {
              "id": "19e79a04-9152-4261-b31d-62b46526d8df",
              "operator": {
                "type": "array",
                "operation": "notContains",
                "rightType": "any"
              },
              "leftValue": "={{ $('Get row(s) in sheet2').all().map(item => item.json['Issue URL']) }}",
              "rightValue": "={{ $json['Issue URL'] }}"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "697e1a3d-85fe-4842-8e3e-9459f0fc6612",
      "name": "시트2에서 행 가져오기",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        0,
        0
      ],
      "parameters": {
        "options": {},
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 1153061999,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1LoZk5q8DzKSCgsYF5UMEbEnIs09QZQ73k4MoOhhoKnI/edit#gid=1153061999",
          "cachedResultName": "Sheet2"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1LoZk5q8DzKSCgsYF5UMEbEnIs09QZQ73k4MoOhhoKnI",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1LoZk5q8DzKSCgsYF5UMEbEnIs09QZQ73k4MoOhhoKnI/edit?usp=drivesdk",
          "cachedResultName": "public-open-source-bounty"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "AipedLwvbgaC6bfR",
          "name": "Google Sheets account 2"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "2e31b037-addd-493a-a256-f572c6785d6f",
      "name": "시트1에 행 추가",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        2064,
        320
      ],
      "parameters": {
        "columns": {
          "value": {
            "Issue URL": "={{ $('Filter1').item.json['Issue URL'] }}",
            "Issue Name": "={{ $('Filter1').item.json['Issue Name'] }}",
            "Issue state": "={{ $('Filter1').item.json['Issue state'] }}",
            "Issue Number": "={{ $('Filter1').item.json['Issue Number'] }}",
            "Bounty Amount": "={{ $('Filter').item.json.labels.find(label => label.name.includes('$'))?.name || 'No bounty specified' }}",
            "Issue Repo URL": "={{ $('Filter').item.json.repository_url.replace('https://api.github.com/repos', 'https://github.com') }}",
            "Number of Issue Comments": "={{ $('Filter').item.json.comments }}",
            "Issue Bounty Creation Date": "={{ $('Filter1').item.json['Issue Creation Date'] }}"
          },
          "schema": [
            {
              "id": "Issue Number",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Issue Number",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Issue Name",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Issue Name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Issue URL",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Issue URL",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Number of Issue Comments",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Number of Issue Comments",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Issue state",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Issue state",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Issue Repo URL",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Issue Repo URL",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Issue Bounty Creation Date",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Issue Bounty Creation Date",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Bounty Amount",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Bounty Amount",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 1153061999,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1LoZk5q8DzKSCgsYF5UMEbEnIs09QZQ73k4MoOhhoKnI/edit#gid=1153061999",
          "cachedResultName": "Sheet2"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1LoZk5q8DzKSCgsYF5UMEbEnIs09QZQ73k4MoOhhoKnI",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1LoZk5q8DzKSCgsYF5UMEbEnIs09QZQ73k4MoOhhoKnI/edit?usp=drivesdk",
          "cachedResultName": "public-open-source-bounty"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "AipedLwvbgaC6bfR",
          "name": "Google Sheets account 2"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "e9aedc57-f573-462f-ac91-16797534b5ba",
      "name": "시트1에서 행 가져오기",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1504,
        928
      ],
      "parameters": {
        "options": {},
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 1153061999,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1LoZk5q8DzKSCgsYF5UMEbEnIs09QZQ73k4MoOhhoKnI/edit#gid=1153061999",
          "cachedResultName": "Sheet2"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1LoZk5q8DzKSCgsYF5UMEbEnIs09QZQ73k4MoOhhoKnI",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1LoZk5q8DzKSCgsYF5UMEbEnIs09QZQ73k4MoOhhoKnI/edit?usp=drivesdk",
          "cachedResultName": "public-open-source-bounty"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "AipedLwvbgaC6bfR",
          "name": "Google Sheets account 2"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "d07e43e6-8b2d-41d4-b395-ae2b572db7a5",
      "name": "스케줄 트리거1",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        1264,
        1088
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "hours",
              "hoursInterval": 6
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "f7ccca48-0af4-4dea-b9c1-0e097b99e708",
      "name": "GitHub Search HTTP Request1",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1696,
        928
      ],
      "parameters": {
        "url": "={{ $json['Issue Repo URL'].replace('https://github.com/', 'https://api.github.com/repos/') + '/issues/' + $json['Issue Number'] }}",
        "options": {},
        "sendQuery": true,
        "sendHeaders": true,
        "authentication": "genericCredentialType",
        "genericAuthType": "httpBearerAuth",
        "queryParameters": {
          "parameters": [
            {}
          ]
        },
        "headerParameters": {
          "parameters": [
            {
              "name": "accept",
              "value": "application/vnd.github+json"
            }
          ]
        }
      },
      "credentials": {
        "httpBearerAuth": {
          "id": "traPuAzPGpvbzCgG",
          "name": "Bearer Auth account 2"
        }
      },
      "executeOnce": false,
      "typeVersion": 4.2
    },
    {
      "id": "88559c0c-827a-4875-953a-f45208a1d2af",
      "name": "시트에서 행 업데이트",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        2096,
        928
      ],
      "parameters": {
        "columns": {
          "value": {
            "row_number": "={{ $('Get row(s) in sheet1').item.json.row_number }}",
            "Issue state": "={{ $('GitHub Search HTTP Request1').item.json.state }}",
            "Number of Issue Comments": "={{ $('GitHub Search HTTP Request1').item.json.comments }}"
          },
          "schema": [
            {
              "id": "Issue Number",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Issue Number",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Issue Name",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Issue Name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Issue URL",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Issue URL",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Number of Issue Comments",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Number of Issue Comments",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Issue state",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Issue state",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Issue Repo URL",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Issue Repo URL",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Issue Bounty Creation Date",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Issue Bounty Creation Date",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Bounty Amount",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Bounty Amount",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "row_number",
              "type": "number",
              "display": true,
              "removed": false,
              "readOnly": true,
              "required": false,
              "displayName": "row_number",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "row_number"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "update",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 1153061999,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1LoZk5q8DzKSCgsYF5UMEbEnIs09QZQ73k4MoOhhoKnI/edit#gid=1153061999",
          "cachedResultName": "Sheet2"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1LoZk5q8DzKSCgsYF5UMEbEnIs09QZQ73k4MoOhhoKnI",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1LoZk5q8DzKSCgsYF5UMEbEnIs09QZQ73k4MoOhhoKnI/edit?usp=drivesdk",
          "cachedResultName": "public-open-source-bounty"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "AipedLwvbgaC6bfR",
          "name": "Google Sheets account 2"
        }
      },
      "typeVersion": 4.7,
      "alwaysOutputData": true
    },
    {
      "id": "4c8af570-7c05-4630-8a28-75b69e755655",
      "name": "필터2",
      "type": "n8n-nodes-base.filter",
      "position": [
        1888,
        928
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "or",
          "conditions": [
            {
              "id": "d63efe45-fc1f-405e-896e-55a848492aa7",
              "operator": {
                "type": "string",
                "operation": "notEquals"
              },
              "leftValue": "={{ $json.state }}",
              "rightValue": "={{ $('Get row(s) in sheet1').item.json['Issue state'] }}"
            },
            {
              "id": "7c85599e-1a40-4f4b-9b54-c2341bec3ba3",
              "operator": {
                "type": "number",
                "operation": "notEquals"
              },
              "leftValue": "={{ $('Get row(s) in sheet1').item.json['Number of Issue Comments'] }}",
              "rightValue": "={{ $json.comments }}"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "51cf5ea7-8305-4f86-98bf-7adcd4b46110",
      "name": "시트3에서 행 가져오기",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1488,
        1248
      ],
      "parameters": {
        "options": {},
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1LoZk5q8DzKSCgsYF5UMEbEnIs09QZQ73k4MoOhhoKnI/edit#gid=0",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1LoZk5q8DzKSCgsYF5UMEbEnIs09QZQ73k4MoOhhoKnI",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1LoZk5q8DzKSCgsYF5UMEbEnIs09QZQ73k4MoOhhoKnI/edit?usp=drivesdk",
          "cachedResultName": "public-open-source-bounty"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "AipedLwvbgaC6bfR",
          "name": "Google Sheets account 2"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "3e70d163-c24b-4efc-9577-75acd23e69d5",
      "name": "GitHub Search HTTP Request2",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1696,
        1248
      ],
      "parameters": {
        "url": "={{ $json['Issue Repo URL'].replace('https://github.com/', 'https://api.github.com/repos/') + '/issues/' + $json['Issue Number'] }}",
        "options": {},
        "sendQuery": true,
        "sendHeaders": true,
        "authentication": "genericCredentialType",
        "genericAuthType": "httpBearerAuth",
        "queryParameters": {
          "parameters": [
            {}
          ]
        },
        "headerParameters": {
          "parameters": [
            {
              "name": "accept",
              "value": "application/vnd.github+json"
            }
          ]
        }
      },
      "credentials": {
        "httpBearerAuth": {
          "id": "traPuAzPGpvbzCgG",
          "name": "Bearer Auth account 2"
        }
      },
      "executeOnce": false,
      "typeVersion": 4.2
    },
    {
      "id": "1fd9c5b7-e86c-4691-ab66-3610ef251deb",
      "name": "시트1에서 행 업데이트",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        2096,
        1248
      ],
      "parameters": {
        "columns": {
          "value": {
            "row_number": "={{ $('Get row(s) in sheet3').item.json.row_number }}",
            "Issue state": "={{ $('GitHub Search HTTP Request2').item.json.state }}",
            "Issue Updated Date": "={{ $('GitHub Search HTTP Request2').item.json.updated_at }}"
          },
          "schema": [
            {
              "id": "Issue Number",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Issue Number",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Issue Name",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Issue Name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Issue URL",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Issue URL",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Issue state",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Issue state",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Issue Repo URL",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Issue Repo URL",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Issue Creation Date",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Issue Creation Date",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Issue Updated Date",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Issue Updated Date",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "row_number",
              "type": "number",
              "display": true,
              "removed": false,
              "readOnly": true,
              "required": false,
              "displayName": "row_number",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "row_number"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "update",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1LoZk5q8DzKSCgsYF5UMEbEnIs09QZQ73k4MoOhhoKnI/edit#gid=0",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1LoZk5q8DzKSCgsYF5UMEbEnIs09QZQ73k4MoOhhoKnI",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1LoZk5q8DzKSCgsYF5UMEbEnIs09QZQ73k4MoOhhoKnI/edit?usp=drivesdk",
          "cachedResultName": "public-open-source-bounty"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "AipedLwvbgaC6bfR",
          "name": "Google Sheets account 2"
        }
      },
      "typeVersion": 4.7,
      "alwaysOutputData": true
    },
    {
      "id": "58f71599-9a6d-4333-a219-90f8049863a3",
      "name": "필터3",
      "type": "n8n-nodes-base.filter",
      "position": [
        1888,
        1248
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "or",
          "conditions": [
            {
              "id": "d63efe45-fc1f-405e-896e-55a848492aa7",
              "operator": {
                "type": "string",
                "operation": "notEquals"
              },
              "leftValue": "={{ $json.state }}",
              "rightValue": "={{ $('Get row(s) in sheet3').item.json['Issue state'] }}"
            },
            {
              "id": "341603a8-808e-42db-a311-e572e031eb19",
              "operator": {
                "type": "dateTime",
                "operation": "notEquals"
              },
              "leftValue": "={{ $json.updated_at }}",
              "rightValue": "={{ $('Get row(s) in sheet3').item.json['Issue Updated Date'] }}"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "fb0e2868-6b8d-4420-a6b0-780ea049fe02",
      "name": "스티커 노트1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -32,
        192
      ],
      "parameters": {
        "width": 384,
        "height": 352,
        "content": "## Fetch & Split Bounties\n- Fetches all open GitHub issues with bounty label\n- Pagination enabled (100 per page)\n- Split Out converts array into individual items"
      },
      "typeVersion": 1
    },
    {
      "id": "9d34238d-0ed2-4762-9497-aebcdf63b03b",
      "name": "스티커 노트2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -384,
        96
      ],
      "parameters": {
        "content": "## Main Workflow Trigger\nRuns every hour to check for new GitHub bounty issues with the '💎 Bounty' label"
      },
      "typeVersion": 1
    },
    {
      "id": "b04d57bf-4438-4959-9217-2c3a9beebe7a",
      "name": "스티커 노트3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        416,
        80
      ],
      "parameters": {
        "content": "## Compare with Existing Data\nMerges GitHub results with Sheet1 to identify which bounties are already tracked"
      },
      "typeVersion": 1
    },
    {
      "id": "e2c2bacc-42c4-4ff0-970c-41ecb43c1996",
      "name": "스티커 노트",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        688,
        80
      ],
      "parameters": {
        "content": "## Filter New Bounties Only\nKeeps only issues where title is NOT found in Sheet1's \"Issue Name\" column"
      },
      "typeVersion": 1
    },
    {
      "id": "36779d4d-9ae1-4e22-bcc8-b15d2707e747",
      "name": "스티커 노트4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        960,
        80
      ],
      "parameters": {
        "width": 352,
        "height": 176,
        "content": "## Filter for Notifications\nAfter adding to Sheet1, checks if bounty should trigger notification:\n- Created within last 5 days\n- Not already sent (not in Sheet2)"
      },
      "typeVersion": 1
    },
    {
      "id": "c8f48c13-8555-46b2-8780-514b5dc79f74",
      "name": "스티커 노트5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1584,
        96
      ],
      "parameters": {
        "content": "## Format Email Template\nConverts bounty data into styled HTML email with GitHub-themed design"
      },
      "typeVersion": 1
    },
    {
      "id": "5e321034-d3f9-411b-ae8b-1f562140889f",
      "name": "스티커 노트6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1152,
        928
      ],
      "parameters": {
        "content": "## Update Workflow Trigger\nRuns every 6 hours to update existing bounty statuses"
      },
      "typeVersion": 1
    },
    {
      "id": "c58e44e0-1631-40be-bde2-5314a3522f99",
      "name": "스티커 노트7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1504,
        1408
      ],
      "parameters": {
        "width": 288,
        "content": "## Update Sheet2 Status\nFetches fresh data from GitHub API for each bounty in Sheet2 to detect changes"
      },
      "typeVersion": 1
    },
    {
      "id": "23b9875b-77f2-456e-8756-14e7a7411900",
      "name": "스티커 노트8",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1840,
        640
      ],
      "parameters": {
        "width": 176,
        "height": 272,
        "content": "## Detect Changes (Sheet2)\nUpdates only if:\n- Issue state changed (open/closed)\n- Comment count changed"
      },
      "typeVersion": 1
    },
    {
      "id": "976fbf52-7895-4588-a883-6674c497f0a0",
      "name": "스티커 노트9",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1472,
        752
      ],
      "parameters": {
        "width": 320,
        "content": "## Update Sheet1 Status\nChecks Sheet1 bounties for state or timestamp changes"
      },
      "typeVersion": 1
    },
    {
      "id": "9127139a-f58a-4ae4-8477-8932f40088cd",
      "name": "스티커 노트10",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1872,
        1392
      ],
      "parameters": {
        "width": 176,
        "height": 272,
        "content": "## Detect Changes (Sheet1)\nUpdates only if:\n- Issue state changed\n- Updated timestamp changed"
      },
      "typeVersion": 1
    },
    {
      "id": "43001701-8171-45ca-9275-e62455bd3b01",
      "name": "스티커 노트11",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1344,
        64
      ],
      "parameters": {
        "width": 224,
        "height": 208,
        "content": "## WhatsApp Notification (Disabled)\nCurrently using Gmail instead - enable if needed"
      },
      "typeVersion": 1
    },
    {
      "id": "a9bf6a49-e7c7-498f-81f4-b053eb25523f",
      "name": "스티커 노트12",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1040,
        560
      ],
      "parameters": {
        "width": 560,
        "height": 592,
        "content": "# GitHub Bounty Tracker\n\n## Two Workflows:\n1. **New Bounties** (hourly): Find & notify about new bounties\n2. **Status Updates** (6 hours): Update existing bounty states\n\n## Two Sheets:\n- **Sheet1**: All bounties (comprehensive list)\n- **Sheet2**: Recent bounties for notifications (5-day window)"
      },
      "typeVersion": 1
    }
  ],
  "pinData": {},
  "connections": {
    "e71ab937-246a-4486-b624-9cb9bb429275": {
      "main": [
        [
          {
            "node": "60441549-f604-4d40-9f9f-20d1c8490800",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "4a3ff3fd-93f3-4ef1-9d08-371bbe9aca79": {
      "main": [
        [
          {
            "node": "47672a86-2826-4007-86dd-2ff9e5f38529",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "47672a86-2826-4007-86dd-2ff9e5f38529": {
      "main": [
        [
          {
            "node": "04f3c770-187c-4de6-9bcb-39b56946fb1f",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "1e114fe5-dc07-4918-ac82-78fa32b4d484": {
      "main": [
        [
          {
            "node": "60441549-f604-4d40-9f9f-20d1c8490800",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "4c8af570-7c05-4630-8a28-75b69e755655": {
      "main": [
        [
          {
            "node": "88559c0c-827a-4875-953a-f45208a1d2af",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "58f71599-9a6d-4333-a219-90f8049863a3": {
      "main": [
        [
          {
            "node": "1fd9c5b7-e86c-4691-ab66-3610ef251deb",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "f72dad12-8b5a-4c19-9e96-0369bb59f1dc": {
      "main": [
        [
          {
            "node": "4a3ff3fd-93f3-4ef1-9d08-371bbe9aca79",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "60441549-f604-4d40-9f9f-20d1c8490800": {
      "main": [
        [
          {
            "node": "2e31b037-addd-493a-a256-f572c6785d6f",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "d88aec02-9955-4442-a55f-47db17d73c9b": {
      "main": [
        [
          {
            "node": "f61d2bf5-9ce2-4f8b-ac49-0cff0c710045",
            "type": "main",
            "index": 0
          },
          {
            "node": "87ceaa17-c596-4c9a-b7fc-df2c02a85cce",
            "type": "main",
            "index": 0
          },
          {
            "node": "697e1a3d-85fe-4842-8e3e-9459f0fc6612",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "d07e43e6-8b2d-41d4-b395-ae2b572db7a5": {
      "main": [
        [
          {
            "node": "e9aedc57-f573-462f-ac91-16797534b5ba",
            "type": "main",
            "index": 0
          },
          {
            "node": "51cf5ea7-8305-4f86-98bf-7adcd4b46110",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "04f3c770-187c-4de6-9bcb-39b56946fb1f": {
      "main": [
        [
          {
            "node": "1e114fe5-dc07-4918-ac82-78fa32b4d484",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "87ceaa17-c596-4c9a-b7fc-df2c02a85cce": {
      "main": [
        [
          {
            "node": "4a3ff3fd-93f3-4ef1-9d08-371bbe9aca79",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "e9aedc57-f573-462f-ac91-16797534b5ba": {
      "main": [
        [
          {
            "node": "f7ccca48-0af4-4dea-b9c1-0e097b99e708",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "697e1a3d-85fe-4842-8e3e-9459f0fc6612": {
      "main": [
        [
          {
            "node": "f72dad12-8b5a-4c19-9e96-0369bb59f1dc",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "51cf5ea7-8305-4f86-98bf-7adcd4b46110": {
      "main": [
        [
          {
            "node": "3e70d163-c24b-4efc-9577-75acd23e69d5",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "f61d2bf5-9ce2-4f8b-ac49-0cff0c710045": {
      "main": [
        [
          {
            "node": "f72dad12-8b5a-4c19-9e96-0369bb59f1dc",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "f7ccca48-0af4-4dea-b9c1-0e097b99e708": {
      "main": [
        [
          {
            "node": "4c8af570-7c05-4630-8a28-75b69e755655",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "3e70d163-c24b-4efc-9577-75acd23e69d5": {
      "main": [
        [
          {
            "node": "58f71599-9a6d-4333-a219-90f8049863a3",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
자주 묻는 질문

이 워크플로우를 어떻게 사용하나요?

위의 JSON 구성 코드를 복사하여 n8n 인스턴스에서 새 워크플로우를 생성하고 "JSON에서 가져오기"를 선택한 후, 구성을 붙여넣고 필요에 따라 인증 설정을 수정하세요.

이 워크플로우는 어떤 시나리오에 적합한가요?

고급 - 콘텐츠 제작, 멀티모달 AI

유료인가요?

이 워크플로우는 완전히 무료이며 직접 가져와 사용할 수 있습니다. 다만, 워크플로우에서 사용하는 타사 서비스(예: OpenAI API)는 사용자 직접 비용을 지불해야 할 수 있습니다.

워크플로우 정보
난이도
고급
노드 수35
카테고리2
노드 유형10
난이도 설명

고급 사용자를 위한 16+개 노드의 복잡한 워크플로우

저자
Jeffrey W.

Jeffrey W.

@c0d33ngr

I’m a passionate open-source software developer and technologist who thrives on solving complex problems and building systems that make a difference. My work spans software development, automation, data analysis, and infrastructure tooling, with a strong focus on contributing to and improving the open-source ecosystem.

외부 링크
n8n.io에서 보기

이 워크플로우 공유

카테고리

카테고리: 34