{ "meta": { "instanceId": "a2434c94d549548a685cca39cc4614698e94f527bcea84eefa363f1037ae14cd" }, "nodes": [ { "id": "b3a0fa7c-eb47-4f51-98d7-ac1a8de7b05d", "name": "On new or updated row", "type": "n8n-nodes-base.googleSheetsTrigger", "position": [ 800, 380 ], "parameters": { "options": { "columnsToWatch": [ "Security Code" ] }, "pollTimes": { "item": [ { "mode": "everyMinute" } ] }, "sheetName": { "__rl": true, "mode": "list", "value": "gid=0", "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1Np8TQv7kWwwrGiPkWWsmr4WYWAosv1BMBwwCd0f-dis/edit#gid=0", "cachedResultName": "Investments" }, "documentId": { "__rl": true, "mode": "list", "value": "1Np8TQv7kWwwrGiPkWWsmr4WYWAosv1BMBwwCd0f-dis", "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1Np8TQv7kWwwrGiPkWWsmr4WYWAosv1BMBwwCd0f-dis/edit?usp=drivesdk", "cachedResultName": "Investments" } }, "credentials": { "googleSheetsTriggerOAuth2Api": { "id": "35", "name": "TEST USER" } }, "typeVersion": 1 }, { "id": "61b96d9b-801c-43e6-b89a-a55245386e4f", "name": "Send message", "type": "n8n-nodes-base.discord", "position": [ 1200, 380 ], "parameters": { "text": "=```\n{{ $json.ascii_table }}\n```", "options": {}, "webhookUri": "https://discord.com/api/webhooks/..." }, "typeVersion": 1 }, { "id": "2dc9ce88-2079-4419-9f48-2281ac25cb36", "name": "Convert to ASCII table", "type": "n8n-nodes-base.code", "position": [ 1000, 380 ], "parameters": { "jsCode": "/* configure columns to be displayed */\nconst columns_to_display = [\n \"Security Code\",\n \"Price\",\n \"Quantity\",\n]\n\n/* End of configuration section (do not edit code below) */\nconst google_sheets_data = $('On new or updated row').all();\n\n/**\n * Takes a list of objects and returns an ascii table with\n * padding and headers.\n */\nfunction ascii_table(data, columns_to_display) {\n let table = \"\"\n \n // Get the headers\n let headers = []\n for (let i = 0; i < columns_to_display.length; i++) {\n headers.push(columns_to_display[i])\n }\n\n // Get the longest string in each column\n let longest_strings = []\n for (let i = 0; i < headers.length; i++) {\n let longest_string = headers[i].length\n for (let j = 0; j < data.length; j++) {\n let string_length = data[j].json[headers[i]].length\n if (string_length > longest_string) {\n longest_string = string_length\n }\n }\n longest_strings.push(longest_string)\n }\n\n // Add the headers to the table\n for (let i = 0; i < headers.length; i++) {\n table += headers[i].toString().padEnd(longest_strings[i] + 2, \" \")\n }\n\n // Add the data to the table\n for (let i = 0; i < data.length; i++) {\n table += \"\\n\"\n for (let j = 0; j < headers.length; j++) {\n table += data[i].json[headers[j]].toString().padEnd(longest_strings[j] + 2, \" \")\n }\n }\n\n return table\n}\n\noutput = {\n ascii_table: ascii_table(google_sheets_data, columns_to_display),\n}\n\nconsole.log(output.ascii_table)\n\nreturn output" }, "typeVersion": 1 }, { "id": "2db7b37b-22f9-424d-a889-33f8a0db2b01", "name": "Sticky Note", "type": "n8n-nodes-base.stickyNote", "position": [ 340, 220 ], "parameters": { "width": 402, "height": 433, "content": "## Send Google Sheets data as a message to a Discord channel\nThis workflow sends a message to a Discord channel when a new row is added or a row is updated in a Google Sheet. The message will send all data rows in the Google Sheet.\n\n### How it works\nUsing a code node, we can use the obtained Google Sheet data to create a custom message that will be sent to Discord. The message will be sent to the Discord channel specified in the Discord node.\n\n### Setup\nThis workflow requires that you set up a Discord webhook and have an existing Google Sheet with data. See how to set up a Discord webhook [here](https://docs.n8n.io/integrations/builtin/credentials/discord/#creating-a-webhook-in-discord).\n" }, "typeVersion": 1 } ], "connections": { "On new or updated row": { "main": [ [ { "node": "Convert to ASCII table", "type": "main", "index": 0 } ] ] }, "Convert to ASCII table": { "main": [ [ { "node": "Send message", "type": "main", "index": 0 } ] ] } } }