Workflow n8n

Automatisation Google Sheets avec n8n : gestion des poses de yoga

Ce workflow n8n est conçu pour automatiser la gestion des poses de yoga en intégrant des modèles de langage d'Azure OpenAI et Google Sheets. Dans un contexte où les professionnels du bien-être cherchent à optimiser leur temps et à offrir un meilleur service à leurs clients, ce workflow permet de gérer efficacement les données relatives aux poses de yoga. Les cas d'usage incluent la mise à jour automatique des informations sur les poses, l'envoi de notifications et la génération de rapports.

  • Étape 1 : Le déclencheur est programmé pour s'exécuter à 21h30 chaque jour, récupérant ainsi les poses de yoga à traiter.
  • Étape 2 : Les modèles de langage d'Azure OpenAI sont utilisés pour analyser et reformuler les données des poses.
  • Étape 3 : Les résultats sont ensuite envoyés vers Google Sheets pour mise à jour, tandis que des notes autocollantes sont créées pour une visualisation rapide des informations.
  • Étape 4 : Les données sont également envoyées via une requête HTTP pour une intégration avec d'autres outils. Grâce à cette automatisation n8n, les utilisateurs peuvent réduire le temps passé sur des tâches répétitives, améliorer la précision des données et se concentrer sur l'interaction avec leurs clients.
Tags clés :automatisationGoogle SheetsAzure OpenAIyogan8n
Catégorie: Scheduled · Tags: automatisation, Google Sheets, Azure OpenAI, yoga, n8n0

Workflow n8n Google Sheets, Azure OpenAI, yoga : vue d'ensemble

Schéma des nœuds et connexions de ce workflow n8n, généré à partir du JSON n8n.

Workflow n8n Google Sheets, Azure OpenAI, yoga : détail des nœuds

  • Azure OpenAI Chat Model2

    Ce noeud utilise le modèle de chat Azure OpenAI pour générer des réponses basées sur les options fournies.

  • YogaLog

    Ce noeud interagit avec Google Sheets pour enregistrer des données selon les colonnes et options spécifiées.

  • Azure OpenAI Chat Model3

    Ce noeud utilise un autre modèle de chat Azure OpenAI pour traiter des requêtes et générer des réponses.

  • Auto-fixing Output Parser

    Ce noeud analyse et corrige automatiquement les sorties générées par d'autres noeuds.

  • Azure OpenAI Chat Model1

    Ce noeud fait appel à un modèle de chat Azure OpenAI pour produire des réponses basées sur les paramètres fournis.

  • Structured Output Parser

    Ce noeud structure les données de sortie selon un schéma défini pour une meilleure organisation.

  • AI Agent

    Ce noeud agit comme un agent d'intelligence artificielle, traitant des textes et générant des réponses selon les options fournies.

  • PosesDatabase1

    Ce noeud interagit avec Google Sheets pour gérer une base de données de poses selon les options spécifiées.

  • YogaLog2

    Ce noeud enregistre des données dans Google Sheets en fonction des colonnes et options définies.

  • Split Out

    Ce noeud divise les données en fonction d'un champ spécifié pour un traitement ultérieur.

  • Trigger 2130 YogaPosesToday

    Ce noeud déclenche le workflow selon un calendrier défini pour gérer les poses de yoga quotidiennes.

  • Azure OpenAI Chat Model5

    Ce noeud utilise un modèle de chat Azure OpenAI pour générer des réponses basées sur les paramètres fournis.

  • Get PoseName

    Ce noeud récupère le nom d'une pose à partir de Google Sheets selon les options spécifiées.

  • WritePosesToday

    Ce noeud écrit les poses du jour en utilisant un modèle de langage pour générer des messages.

  • RewritePosesToday

    Ce noeud réécrit les poses du jour en utilisant un modèle de langage pour générer des messages.

  • Azure OpenAI Chat Model

    Ce noeud utilise un modèle de chat Azure OpenAI pour générer des réponses basées sur les options fournies.

  • WriteJSONflex

    Ce noeud écrit des données au format JSON en utilisant un modèle de langage avec un parser de sortie.

  • Structured Output Parser1

    Ce noeud structure les données de sortie selon un exemple de schéma JSON pour une meilleure organisation.

  • Auto-fixing Output Parser1

    Ce noeud analyse et corrige automatiquement les sorties générées par d'autres noeuds.

  • Azure OpenAI Chat Model6

    Ce noeud utilise un modèle de chat Azure OpenAI pour générer des réponses basées sur les options fournies.

  • Azure OpenAI Chat Model4

    Ce noeud utilise un modèle de chat Azure OpenAI pour générer des réponses basées sur les options fournies.

  • Code

    Ce noeud exécute du code JavaScript pour traiter des données ou effectuer des opérations spécifiques.

  • Line Push with Flex Bubble

    Ce noeud envoie une requête HTTP pour pousser des messages via Flex Bubble selon les paramètres spécifiés.

  • CombineAll

    Ce noeud combine plusieurs données en un seul ensemble selon les options et affectations définies.

  • Fix JSON

    Ce noeud corrige le format JSON des données générées par d'autres noeuds.

  • Sticky Note

    Ce noeud crée une note autocollante avec des spécifications de couleur, taille et contenu.

  • Sticky Note1

    Ce noeud crée une note autocollante avec des spécifications de couleur, taille et contenu.

  • Sticky Note2

    Ce noeud crée une note autocollante avec des spécifications de couleur, taille et contenu.

  • Sticky Note3

    Ce noeud crée une note autocollante avec des spécifications de couleur, taille et contenu.

  • Sticky Note4

    Ce noeud crée une note autocollante avec des spécifications de couleur, taille et contenu.

  • Sticky Note5

    Ce noeud crée une note autocollante avec des spécifications de couleur, taille et contenu.

Inscris-toi pour voir l'intégralité du workflow

Inscription gratuite

S'inscrire gratuitementBesoin d'aide ?
{
  "id": "2DzQ1FH11S3Gp6wn",
  "meta": {
    "instanceId": "558d88703fb65b2d0e44613bc35916258b0f0bf983c5d4730c00c424b77ca36a",
    "templateCredsSetupCompleted": true
  },
  "name": "YogiAI",
  "tags": [],
  "nodes": [
    {
      "id": "2afc390e-d774-4db4-a52f-138f13837646",
      "name": "Azure OpenAI Chat Model2",
      "type": "@n8n/n8n-nodes-langchain.lmChatAzureOpenAi",
      "position": [
        1040,
        0
      ],
      "parameters": {
        "model": "4o",
        "options": {
          "temperature": 0.8
        }
      },
      "credentials": {
        "azureOpenAiApi": {
          "id": "5AjoWhww5SQi2VXd",
          "name": "Azure Open AI account"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "529d9ed9-3ae5-41cb-983e-874aa37ee1c7",
      "name": "YogaLog",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        2240,
        -100
      ],
      "parameters": {
        "columns": {
          "value": {
            "Date": "={{ $('Trigger 2130 YogaPosesToday').first().json.timestamp }}",
            "JSON": "={{ $('CombineAll').item.json.LineBody }}",
            "Text": "={{ $('RewritePosesToday').item.json.text }}"
          },
          "schema": [
            {
              "id": "Date",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Date",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Text",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Text",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "JSON",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "JSON",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "Date"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 325576327,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1s_yzDNbbtXhfoOKUlmBHwhgWkR2FuoiKz4WQOu4tQmk/edit#gid=325576327",
          "cachedResultName": "YogaLog"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1s_yzDNbbtXhfoOKUlmBHwhgWkR2FuoiKz4WQOu4tQmk",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1s_yzDNbbtXhfoOKUlmBHwhgWkR2FuoiKz4WQOu4tQmk/edit?usp=drivesdk",
          "cachedResultName": "SerenityAI"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "TKSdrVOdpgxWBVk8",
          "name": "Google Sheets account"
        }
      },
      "typeVersion": 4.5
    },
    {
      "id": "d491b5c3-31ab-49b2-abc3-8c2a67cf9571",
      "name": "Azure OpenAI Chat Model3",
      "type": "@n8n/n8n-nodes-langchain.lmChatAzureOpenAi",
      "position": [
        2360,
        120
      ],
      "parameters": {
        "model": "4o",
        "options": {}
      },
      "credentials": {
        "azureOpenAiApi": {
          "id": "5AjoWhww5SQi2VXd",
          "name": "Azure Open AI account"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "3b1ebdcb-9e6b-437c-8f51-944218c0c276",
      "name": "Auto-fixing Output Parser",
      "type": "@n8n/n8n-nodes-langchain.outputParserAutofixing",
      "position": [
        2520,
        80
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 1
    },
    {
      "id": "3fc67522-501c-4e43-bf9d-b367d57ad4f9",
      "name": "Azure OpenAI Chat Model1",
      "type": "@n8n/n8n-nodes-langchain.lmChatAzureOpenAi",
      "position": [
        2540,
        120
      ],
      "parameters": {
        "model": "4o",
        "options": {}
      },
      "credentials": {
        "azureOpenAiApi": {
          "id": "5AjoWhww5SQi2VXd",
          "name": "Azure Open AI account"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "19bd208b-a5c5-47b3-a2cc-e92a71444be7",
      "name": "Structured Output Parser",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        2640,
        220
      ],
      "parameters": {
        "schemaType": "manual",
        "inputSchema": "{\n  \"type\": \"object\",\n  \"properties\": {\n    \"yogaPoses\": {\n      \"type\": \"array\",\n      \"items\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"sequence\": { \"type\": \"integer\" },\n          \"name\": { \"type\": \"string\" }\n        },\n        \"required\": [\"sequence\", \"name\"],\n        \"additionalProperties\": false\n      }\n    }\n  },\n  \"required\": [\"yogaPoses\"]\n}"
      },
      "typeVersion": 1.2
    },
    {
      "id": "2bf3f3d3-84c7-4fd4-b1b9-8c0fb7df44b1",
      "name": "AI Agent",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        2400,
        -60
      ],
      "parameters": {
        "text": "=You'll change this into properly format of JSON without having emoji. You'll also make sure the name is matched the data in googlesheet\n\n {{ $json.Text }}",
        "options": {},
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 1.7
    },
    {
      "id": "fa3fc89e-54d8-4706-af59-72dbd80fbef4",
      "name": "PosesDatabase1",
      "type": "n8n-nodes-base.googleSheetsTool",
      "position": [
        2480,
        220
      ],
      "parameters": {
        "options": {},
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 1104924292,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1s_yzDNbbtXhfoOKUlmBHwhgWkR2FuoiKz4WQOu4tQmk/edit#gid=1104924292",
          "cachedResultName": "Yoga"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1s_yzDNbbtXhfoOKUlmBHwhgWkR2FuoiKz4WQOu4tQmk",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1s_yzDNbbtXhfoOKUlmBHwhgWkR2FuoiKz4WQOu4tQmk/edit?usp=drivesdk",
          "cachedResultName": "SerenityAI"
        },
        "descriptionType": "manual",
        "toolDescription": "Yoga Poses Database to read\n"
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "TKSdrVOdpgxWBVk8",
          "name": "Google Sheets account"
        }
      },
      "typeVersion": 4.5
    },
    {
      "id": "ff7bd540-c89b-43d1-bb07-bb060a6b4ba6",
      "name": "YogaLog2",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        2980,
        20
      ],
      "parameters": {
        "columns": {
          "value": {
            "Date": "={{ $('Trigger 2130 YogaPosesToday').first().json.timestamp }}",
            "Pose": "={{ $json.name }}",
            "Sequence": "={{ $json.sequence }}"
          },
          "schema": [
            {
              "id": "Date",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Date",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Sequence",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Sequence",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Pose",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Pose",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "Date"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 2060471945,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1s_yzDNbbtXhfoOKUlmBHwhgWkR2FuoiKz4WQOu4tQmk/edit#gid=2060471945",
          "cachedResultName": "YogaLog2"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1s_yzDNbbtXhfoOKUlmBHwhgWkR2FuoiKz4WQOu4tQmk",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1s_yzDNbbtXhfoOKUlmBHwhgWkR2FuoiKz4WQOu4tQmk/edit?usp=drivesdk",
          "cachedResultName": "SerenityAI"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "TKSdrVOdpgxWBVk8",
          "name": "Google Sheets account"
        }
      },
      "typeVersion": 4.5
    },
    {
      "id": "f649c5b9-fad1-412c-8389-ed53b95e5583",
      "name": "Split Out",
      "type": "n8n-nodes-base.splitOut",
      "position": [
        2740,
        -120
      ],
      "parameters": {
        "options": {},
        "fieldToSplitOut": "output.yogaPoses"
      },
      "typeVersion": 1
    },
    {
      "id": "8194e695-fa9e-4555-9da5-b7dbdc1b0e4a",
      "name": "Trigger 2130 YogaPosesToday",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        -200,
        -20
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "triggerAtHour": 21,
              "triggerAtMinute": 30
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "3b5706d8-4968-4b9c-a255-7d1f806d85dc",
      "name": "Azure OpenAI Chat Model5",
      "type": "@n8n/n8n-nodes-langchain.lmChatAzureOpenAi",
      "position": [
        1340,
        180
      ],
      "parameters": {
        "model": "4o",
        "options": {
          "temperature": 0.9
        }
      },
      "credentials": {
        "azureOpenAiApi": {
          "id": "5AjoWhww5SQi2VXd",
          "name": "Azure Open AI account"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "acee6e43-f094-4f30-bffb-6c56b0425327",
      "name": "Get PoseName",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        40,
        -20
      ],
      "parameters": {
        "options": {
          "dataLocationOnSheet": {
            "values": {
              "range": "B18:D28",
              "rangeDefinition": "specifyRangeA1"
            }
          }
        },
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 2035276041,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1s_yzDNbbtXhfoOKUlmBHwhgWkR2FuoiKz4WQOu4tQmk/edit#gid=2035276041",
          "cachedResultName": "NotePad"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1s_yzDNbbtXhfoOKUlmBHwhgWkR2FuoiKz4WQOu4tQmk",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1s_yzDNbbtXhfoOKUlmBHwhgWkR2FuoiKz4WQOu4tQmk/edit?usp=drivesdk",
          "cachedResultName": "SerenityAI"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "TKSdrVOdpgxWBVk8",
          "name": "Google Sheets account"
        }
      },
      "typeVersion": 4.5
    },
    {
      "id": "6be3a88c-4e0f-44e6-97c1-eafa13230ae7",
      "name": "WritePosesToday",
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "position": [
        1120,
        -160
      ],
      "parameters": {
        "text": "=Let's calm down and focus on these poses today.\n\n{{ $('Code').item.json.poseNamesOnly }}\n\nhave a great practice!",
        "messages": {
          "messageValues": [
            {
              "message": "=You're experienced yoga instructor. You'll say the topic and asking the student to focus on practice today. You'll later give the yoga poses list for practicing today. You will also include related pose or variation from the list. You'll make sure to include all the poses from the list.\n"
            }
          ]
        },
        "promptType": "define"
      },
      "retryOnFail": true,
      "typeVersion": 1.5
    },
    {
      "id": "8d9cdf4c-a432-44ff-a0a3-133fbc8e9daa",
      "name": "RewritePosesToday",
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "position": [
        1180,
        60
      ],
      "parameters": {
        "text": "={{ $json.text }}",
        "messages": {
          "messageValues": [
            {
              "message": "=You'll format and add emoji before the poses name to make it chat-friendly to send via Line. You will only return the message to be sent.\n\nIf the message is too long, you'll split by ====== to 3 messages\n"
            }
          ]
        },
        "promptType": "define"
      },
      "retryOnFail": true,
      "typeVersion": 1.5
    },
    {
      "id": "2e419654-1f83-48df-8ac0-9ec621444cc2",
      "name": "Azure OpenAI Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatAzureOpenAi",
      "position": [
        480,
        100
      ],
      "parameters": {
        "model": "4o",
        "options": {
          "temperature": 0.9
        }
      },
      "credentials": {
        "azureOpenAiApi": {
          "id": "5AjoWhww5SQi2VXd",
          "name": "Azure Open AI account"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "ad1bf966-114e-4bb8-abff-f5768e907aff",
      "name": "WriteJSONflex",
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "position": [
        580,
        -80
      ],
      "parameters": {
        "text": "={{ $json.outputText }}",
        "messages": {
          "messageValues": [
            {
              "message": "=You are JSON parser, you'll write JSON in this format for all the row in 'GetPoseName' You'll notice the differnet between uri and url.\n\n{\n\"type\": \"bubble\",\n\"hero\": {\n\"type\": \"image\",\n\"url\": \"https://pocketyoga.com/assets/images/thumbnails146/SupineAngle-tn146.png \", \n\"size\": \"full\",\n\"aspectRatio\": \"20:13\",\n\"aspectMode\": \"fit\",\n\"action\": {\n\"type\": \"uri\",\n\"uri\": \"https://pocketyoga.com/pose/SupineAngle \"\n}\n},\n\"body\": {\n\"type\": \"box\",\n\"layout\": \"vertical\",\n\"contents\": [\n{\n\"type\": \"text\",\n\"text\": \"Supine Angle (supta konasana)\",\n\"size\": \"lg\",\n\"wrap\": true,\n\"action\": {\n\"type\": \"message\",\n\"label\": \"action\",\n\"text\": \"Supine Angle (supta konasana)\"\n}\n}\n]\n}\n},\n{\n\"type\": \"bubble\",\n\"hero\": {\n\"type\": \"image\",\n\"url\": \"https://pocketyoga.com/assets/images/thumbnails146/SupineAngle-tn146.png \",\n\"size\": \"full\",\n\"aspectRatio\": \"20:13\",\n\"aspectMode\": \"fit\",\n\"action\": {\n\"type\": \"uri\",\n\"uri\": \"https://pocketyoga.com/pose/SupineAngle \"\n}\n},\n\"body\": {\n\"type\": \"box\",\n\"layout\": \"vertical\",\n\"contents\": [\n{\n\"type\": \"text\",\n\"text\": \"Supine Angle (supta konasana)\",\n\"size\": \"lg\",\n\"wrap\": true,\n\"action\": {\n\"type\": \"message\",\n\"label\": \"action\",\n\"text\": \"Supine Angle (supta konasana)\"\n}\n}\n]\n}\n}"
            }
          ]
        },
        "promptType": "define",
        "hasOutputParser": true
      },
      "retryOnFail": true,
      "typeVersion": 1.5
    },
    {
      "id": "1e6af9e5-675d-4d9a-aba6-304d218ea138",
      "name": "Structured Output Parser1",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        780,
        220
      ],
      "parameters": {
        "jsonSchemaExample": "[\n  {\n    \"type\": \"bubble\",\n    \"hero\": {\n      \"type\": \"image\",\n      \"url\": \"https://pocketyoga.com/assets/images/thumbnails146/SupineAngle-tn146.png\",\n      \"size\": \"full\",\n      \"aspectRatio\": \"20:13\",\n      \"aspectMode\": \"fit\",\n      \"action\": {\n        \"type\": \"uri\",\n        \"uri\": \"https://pocketyoga.com/pose/SupineAngle\"\n      }\n    },\n    \"body\": {\n      \"type\": \"box\",\n      \"layout\": \"vertical\",\n      \"contents\": [\n        {\n          \"type\": \"text\",\n          \"text\": \"Supine Angle (supta konasana)\",\n          \"size\": \"lg\",\n          \"wrap\": true,\n          \"action\": {\n            \"type\": \"message\",\n            \"label\": \"action\",\n            \"text\": \"Supine Angle (supta konasana)\"\n          }\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"bubble\",\n    \"hero\": {\n      \"type\": \"image\",\n      \"url\": \"https://pocketyoga.com/assets/images/thumbnails146/SupineAngle-tn146.png\",\n      \"size\": \"full\",\n      \"aspectRatio\": \"20:13\",\n      \"aspectMode\": \"fit\",\n      \"action\": {\n        \"type\": \"uri\",\n        \"uri\": \"https://pocketyoga.com/pose/SupineAngle\"\n      }\n    },\n    \"body\": {\n      \"type\": \"box\",\n      \"layout\": \"vertical\",\n      \"contents\": [\n        {\n          \"type\": \"text\",\n          \"text\": \"Supine Angle (supta konasana)\",\n          \"size\": \"lg\",\n          \"wrap\": true,\n          \"action\": {\n            \"type\": \"message\",\n            \"label\": \"action\",\n            \"text\": \"Supine Angle (supta konasana)\"\n          }\n        }\n      ]\n    }\n  }\n]"
      },
      "typeVersion": 1.2
    },
    {
      "id": "5559c5b9-6c2c-4adb-9544-79be3f1f85d1",
      "name": "Auto-fixing Output Parser1",
      "type": "@n8n/n8n-nodes-langchain.outputParserAutofixing",
      "position": [
        680,
        80
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 1
    },
    {
      "id": "2335f74e-3fe6-4720-bb88-1bbda320ae8b",
      "name": "Azure OpenAI Chat Model6",
      "type": "@n8n/n8n-nodes-langchain.lmChatAzureOpenAi",
      "position": [
        640,
        200
      ],
      "parameters": {
        "model": "4o",
        "options": {}
      },
      "credentials": {
        "azureOpenAiApi": {
          "id": "5AjoWhww5SQi2VXd",
          "name": "Azure Open AI account"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "83d02971-bdf6-4c45-b705-f2f49fa49525",
      "name": "Azure OpenAI Chat Model4",
      "type": "@n8n/n8n-nodes-langchain.lmChatAzureOpenAi",
      "position": [
        1780,
        200
      ],
      "parameters": {
        "model": "4o",
        "options": {
          "temperature": 0.5
        }
      },
      "credentials": {
        "azureOpenAiApi": {
          "id": "5AjoWhww5SQi2VXd",
          "name": "Azure Open AI account"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "5e5c1c11-cf3d-47f4-91ce-14d7e3f493fb",
      "name": "Code",
      "type": "n8n-nodes-base.code",
      "position": [
        240,
        -20
      ],
      "parameters": {
        "jsCode": "const items = $input.all();\n\nlet outputText = \"\";\nlet poseNamesList = []; // New list to store only PoseNames\n\nitems.forEach(item => {\n  const { PoseName, uri, url } = item.json;\n  outputText += `Name: ${PoseName}\\nuri: ${uri}\\nurl: ${url}\\n\\n`;\n  poseNamesList.push(PoseName); // Add PoseName to the list\n});\n\nreturn [\n  {\n    json: {\n      outputText,  // Original formatted text\n      poseNamesOnly: poseNamesList.join('\\n') // New: PoseNames as text list\n    }\n  }\n];"
      },
      "typeVersion": 2
    },
    {
      "id": "864e2fbb-a9dc-43ba-918e-0197821de598",
      "name": "Line Push with Flex Bubble",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1980,
        -80
      ],
      "parameters": {
        "url": "https://api.line.me/v2/bot/message/push",
        "method": "POST",
        "options": {},
        "jsonBody": "={{ $json.text }}",
        "sendBody": true,
        "specifyBody": "json",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth"
      },
      "credentials": {
        "httpHeaderAuth": {
          "id": "yiPG7xPwvDzsY0Qd",
          "name": "Line @511dizji"
        }
      },
      "retryOnFail": false,
      "typeVersion": 4.2
    },
    {
      "id": "91e50734-8899-4d23-9a4f-ce637d9e5ed1",
      "name": "CombineAll",
      "type": "n8n-nodes-base.set",
      "position": [
        1640,
        -100
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "9c82e62c-dfbc-4b09-899d-f4d1581e1c15",
              "name": "LineBody",
              "type": "string",
              "value": "={\n  \"to\": \"Ue9cc622e33e5333e3784298412ec9aed\",\n  \"messages\": [\n    {\n      \"type\": \"text\",\n      \"text\": \"{{ $json.text.replaceAll(\"\\n\",\"\\\\n\").replaceAll(\"\\n\",\"\").removeMarkdown().removeTags().replaceAll('\"',\"\") }}\"\n    },\n    {\n      \"type\": \"flex\",\n      \"altText\": \"Yoga Poses Images\",\n      \"contents\": {\n        \"type\": \"carousel\",\n        \"contents\": [  {{ $('WriteJSONflex').all().flatMap(item => JSON.stringify(item.json.output)).join(',') }}\n\n          ] \n      }\n    }\n  ]\n}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "dc6d5dfe-66ad-49ca-b246-ee52f270269d",
      "name": "Fix JSON",
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "position": [
        1720,
        120
      ],
      "parameters": {
        "text": "=Fix this JSON\n\n{{ $json.LineBody }}",
        "messages": {
          "messageValues": [
            {
              "message": "=You are JSON formatter, You'll fix the JSON and return only the JSON that has been fixed. Do not explain or write anything else"
            }
          ]
        },
        "promptType": "define",
        "hasOutputParser": true
      },
      "retryOnFail": true,
      "typeVersion": 1.5
    },
    {
      "id": "a062cf06-f438-4d1e-9c0c-d2fc00f40071",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -300,
        -380
      ],
      "parameters": {
        "color": 5,
        "width": 260,
        "height": 240,
        "content": "## YogiAI\n\nThis YogiAI is to provide daily reminder and pose of the day to the user via Line Push Message\n\nThe data will be generated from GoogleSheet Weighted Random Poses and Push to your Line at the scheduled time\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "8d2184a9-af30-4b1e-826b-69a8f37d8256",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        0,
        -320
      ],
      "parameters": {
        "color": 4,
        "width": 400,
        "height": 500,
        "content": "## Get the Data\nThis is to get the data from GoogleSheet \n\nIn the range we got, we'll have PosesName, uri (image link), and url (link when clicked) \n\nThe sample is here \nhttps://docs.google.com/spreadsheets/d/1eqLJsUL_QkOMy_qPzNCrUCZdx36asC8P1i3PowTQqLY/edit?usp=sharing\n\nThe data is from https://pocketyoga.com/pose/\n\n***YOU SHOULD UPDATE IT WITH YOUR OWN DATA***"
      },
      "typeVersion": 1
    },
    {
      "id": "6d688a1c-90aa-4c3a-a868-946c61cec7cf",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        440,
        -320
      ],
      "parameters": {
        "color": 2,
        "width": 540,
        "height": 660,
        "content": "## Write FlexMessage for Images\n\nTo send the information in Line, we need to write a JSON for Flex Message meaning that it can slides to show the images of the pose\n\nWe use auto-parser here to make sure the JSON followed the required format\n\nhttps://developers.line.biz/en/docs/messaging-api/using-flex-messages/\n\nYou can also use https://developers.line.biz/flex-simulator/?status=success to simulate the format "
      },
      "typeVersion": 1
    },
    {
      "id": "e5b92f32-e282-49cd-8084-68e380572ee9",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1000,
        -320
      ],
      "parameters": {
        "color": 2,
        "width": 540,
        "height": 660,
        "content": "## Write Text for Poses today \n\nThis node we want to have user friendly text such as with emojis, etc. So, we give Azure OpenAI the poses of today and ask it to rewrie"
      },
      "typeVersion": 1
    },
    {
      "id": "38cc9d2f-be2c-4448-9746-5d533108df7c",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1600,
        -320
      ],
      "parameters": {
        "color": 3,
        "width": 540,
        "height": 660,
        "content": "## Combine the result and push it via Line\n\n1) We used 'Edit Field' to combine all the output\n(Hint: you can have input_txt and output_txt to debug your script here)\n2) To make sure that our JSON is proper, we asked AI to fix it again. \n3) Use Line Push >> Please replace \"to\" to your own UID and create the header authorization with the channel you have\n\nhttps://developers.line.biz/en/docs/messaging-api/sending-messages/\n"
      },
      "typeVersion": 1
    },
    {
      "id": "b88d6f78-ce54-4b83-b009-e4e22e518c7c",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2200,
        -320
      ],
      "parameters": {
        "color": 6,
        "width": 1020,
        "height": 660,
        "content": "## Write back the data into Log and Log2 \n\nWe used log2 to count how many time we send each poses and weighted this back into the 'Yoga' Sheet to make the random more random ;)\n\nTo put the data back, we also want to extract from the output and split it out to put back to google sheet"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "pinData": {},
  "settings": {
    "timezone": "Asia/Bangkok",
    "callerPolicy": "workflowsFromSameOwner",
    "executionOrder": "v1"
  },
  "versionId": "8d3482ff-25e6-479f-a33b-b33d1aeb51fc",
  "connections": {
    "Code": {
      "main": [
        [
          {
            "node": "WriteJSONflex",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "YogaLog": {
      "main": [
        [
          {
            "node": "AI Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "AI Agent": {
      "main": [
        [
          {
            "node": "Split Out",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fix JSON": {
      "main": [
        [
          {
            "node": "Line Push with Flex Bubble",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "YogaLog2": {
      "main": [
        []
      ]
    },
    "Split Out": {
      "main": [
        [
          {
            "node": "YogaLog2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "CombineAll": {
      "main": [
        [
          {
            "node": "Fix JSON",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get PoseName": {
      "main": [
        [
          {
            "node": "Code",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "WriteJSONflex": {
      "main": [
        [
          {
            "node": "WritePosesToday",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "PosesDatabase1": {
      "ai_tool": [
        [
          {
            "node": "AI Agent",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "WritePosesToday": {
      "main": [
        [
          {
            "node": "RewritePosesToday",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "RewritePosesToday": {
      "main": [
        [
          {
            "node": "CombineAll",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Azure OpenAI Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "WriteJSONflex",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Azure OpenAI Chat Model1": {
      "ai_languageModel": [
        [
          {
            "node": "Auto-fixing Output Parser",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Azure OpenAI Chat Model2": {
      "ai_languageModel": [
        [
          {
            "node": "WritePosesToday",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Azure OpenAI Chat Model3": {
      "ai_languageModel": [
        [
          {
            "node": "AI Agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Azure OpenAI Chat Model4": {
      "ai_languageModel": [
        [
          {
            "node": "Fix JSON",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Azure OpenAI Chat Model5": {
      "ai_languageModel": [
        [
          {
            "node": "RewritePosesToday",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Azure OpenAI Chat Model6": {
      "ai_languageModel": [
        [
          {
            "node": "Auto-fixing Output Parser1",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Structured Output Parser": {
      "ai_outputParser": [
        [
          {
            "node": "Auto-fixing Output Parser",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "Auto-fixing Output Parser": {
      "ai_outputParser": [
        [
          {
            "node": "AI Agent",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "Structured Output Parser1": {
      "ai_outputParser": [
        [
          {
            "node": "Auto-fixing Output Parser1",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "Auto-fixing Output Parser1": {
      "ai_outputParser": [
        [
          {
            "node": "WriteJSONflex",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "Line Push with Flex Bubble": {
      "main": [
        [
          {
            "node": "YogaLog",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Trigger 2130 YogaPosesToday": {
      "main": [
        [
          {
            "node": "Get PoseName",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

Workflow n8n Google Sheets, Azure OpenAI, yoga : pour qui est ce workflow ?

Ce workflow s'adresse aux professionnels du bien-être, tels que les instructeurs de yoga et les coachs, ainsi qu'aux petites et moyennes entreprises qui souhaitent automatiser la gestion de leurs données. Un niveau technique de base est requis pour la configuration initiale.

Workflow n8n Google Sheets, Azure OpenAI, yoga : problème résolu

Ce workflow résout le problème de la gestion manuelle des données de yoga, qui peut être chronophage et sujet à des erreurs. En automatisant la collecte et la mise à jour des informations, les utilisateurs gagnent du temps et réduisent les risques d'erreurs humaines. Après la mise en place, les utilisateurs obtiennent un système fluide qui leur permet de se concentrer sur l'enseignement plutôt que sur l'administration.

Workflow n8n Google Sheets, Azure OpenAI, yoga : étapes du workflow

Étape 1 : Le déclencheur planifié active le workflow à 21h30 chaque jour.

  • Étape 1 : Les poses de yoga sont récupérées via Google Sheets.
  • Étape 2 : Les modèles de langage Azure OpenAI analysent et reformulent les informations.
  • Étape 3 : Les résultats sont traités par des parseurs pour assurer une sortie structurée.
  • Étape 4 : Les données sont ensuite envoyées vers Google Sheets pour mise à jour.
  • Étape 5 : Une requête HTTP est effectuée pour intégrer les données dans d'autres systèmes.
  • Étape 6 : Des notes autocollantes sont créées pour une visualisation rapide des informations.

Workflow n8n Google Sheets, Azure OpenAI, yoga : guide de personnalisation

Pour personnaliser ce workflow, commencez par ajuster le déclencheur en modifiant l'heure d'exécution selon vos besoins. Vous pouvez également changer le nom de la feuille Google Sheets pour correspondre à votre structure de données. Si vous souhaitez intégrer d'autres outils, modifiez la requête HTTP en fonction des API de ces outils. Assurez-vous que les modèles de langage d'Azure OpenAI sont configurés avec les bons paramètres pour votre contexte. Enfin, vérifiez les options des parseurs pour garantir que les données sont formatées correctement avant d'être envoyées vers Google Sheets.