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など)は別途料金が発生する場合があります。
関連ワークフロー
コンテンツ集約
Gemini AIを使ってウェブ記事からLinkedInとX/Twitterへのソーシャルメディア投稿を自動化する
If
Set
Xml
+
If
Set
Xml
34 ノードVadim
コンテンツ作成
Groq、Gemini、Slack承認システムを使用してRSSからMediumへの公開を自動化
Groq、Gemini、Slack承認システムを用いたRSSからMediumへの自動公開プロセス
If
Set
Code
+
If
Set
Code
41 ノードObisDev
コンテンツ作成
WordPressブログの自動化プロフェッショナル版(先端研究)v2.1マーケットプラグイン
GPT-4o、Perplexity AI、そして多言語対応を使ったSEO最適化ブログ作成の自動化
If
Set
Xml
+
If
Set
Xml
125 ノードDaniel Ng
コンテンツ作成
私のワークフロー5
ジョン
Set
Code
Html
+
Set
Code
Html
102 ノードHichul
コンテンツ作成
TikTok カルーセル自動複製&翻訳
Gemini VisionとMidjourneyを使用して TikTokカルーセルを自動翻訳し再作成
If
Wait
Gmail
+
If
Wait
Gmail
21 ノードXavier Tai
コンテンツ作成
OpenAI、RunwayML、ElevenLabsを使って無顔の短い動画を自動化
OpenAI、RunwayML、ElevenLabs を使ってアニメ顔の短い動画を自動化:スクリプトからソーシャルメディアへ
Set
Code
Wait
+
Set
Code
Wait
56 ノードLeeWei
コンテンツ作成
ワークフロー情報
難易度
上級
ノード数35
カテゴリー2
ノードタイプ10
作成者
Jeffrey W.
@c0d33ngrI’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で表示 →
このワークフローを共有