8
n8n 中文网amn8n.com

将所有 Linear 工单写入 Google Sheets

中级

这是一个Engineering, Product领域的自动化工作流,包含 14 个节点。主要使用 If, Set, Code, Graphql, SplitOut 等节点。 将所有 Linear 工单写入 Google Sheets

前置要求
  • Google Sheets API 凭证
工作流预览
可视化展示节点连接关系,支持缩放和平移
导出工作流
复制以下 JSON 配置到 n8n 导入,即可使用此工作流
{
  "nodes": [
    {
      "id": "58c69358-3d02-41c3-b50c-6e57452523a2",
      "name": "每天06:00",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        960,
        600
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "triggerAtHour": 9
            }
          ]
        }
      },
      "typeVersion": 1
    },
    {
      "id": "0a388351-6aec-45c4-a142-e89b338be155",
      "name": "获取您团队的所有工单",
      "type": "n8n-nodes-base.graphql",
      "position": [
        1200,
        600
      ],
      "parameters": {
        "query": "query ($filter: IssueFilter) {\n  issues(filter: $filter, first: 100) {\n    pageInfo {\n      hasNextPage\n      endCursor\n    }\n    nodes {\n      id\n      identifier\n      url\n      title\n      priorityLabel\n      createdAt\n      completedAt\n      state {\n        type\n        name\n      }\n      cycle {\n        number\n      }\n      estimate\n      labels { nodes { name } }\n    }\n  }\n}",
        "endpoint": "https://api.linear.app/graphql",
        "variables": "={\n  \"filter\": {\n    \"team\": {\n      \"name\":  {\n        \"eq\": \"Adore\"\n      }\n    }\n  }\n}",
        "requestFormat": "json",
        "authentication": "headerAuth"
      },
      "credentials": {
        "httpHeaderAuth": {
          "id": "QNQL42DMISvQl50S",
          "name": "Linear api "
        }
      },
      "typeVersion": 1
    },
    {
      "id": "91f29056-f934-4c15-8e98-2a202753971d",
      "name": "便签1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1200,
        460
      ],
      "parameters": {
        "color": 7,
        "width": 256.14371825927645,
        "height": 100,
        "content": "👇🏽 在此筛选器中设置您的团队名称。"
      },
      "typeVersion": 1
    },
    {
      "id": "8efeb08c-fbba-4c07-9ef8-e22afa39f328",
      "name": "如果有下一页",
      "type": "n8n-nodes-base.if",
      "position": [
        1400,
        780
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "f5ab21aa-b2e0-4885-9278-6756c2c544f9",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              },
              "leftValue": "={{ $json.data.issues.pageInfo.hasNextPage }}",
              "rightValue": 0
            }
          ]
        }
      },
      "typeVersion": 2
    },
    {
      "id": "fdfba048-ae14-45fb-88be-e354d7003fdb",
      "name": "获取结束游标",
      "type": "n8n-nodes-base.set",
      "position": [
        1620,
        920
      ],
      "parameters": {
        "fields": {
          "values": [
            {
              "name": "after",
              "stringValue": "={{ $json.data.issues.pageInfo.endCursor }}"
            }
          ]
        },
        "include": "none",
        "options": {}
      },
      "typeVersion": 3.2
    },
    {
      "id": "db37b327-d939-4a8b-bd5c-ff99c2191a54",
      "name": "获取下一页",
      "type": "n8n-nodes-base.graphql",
      "position": [
        1880,
        920
      ],
      "parameters": {
        "query": "=query ($filter: IssueFilter) {\n  issues(filter: $filter, first: 100, after: \"{{ $json.after }}\") {\n    nodes {\n      id\n      identifier\n      url\n      title\n      priorityLabel\n      createdAt\n      completedAt\n      state {\n        type\n        name\n      }\n      cycle {\n        number\n      }\n      estimate\n      labels { nodes { name } }\n    }\n    pageInfo {\n      hasNextPage\n      endCursor\n    }\n  }\n}",
        "endpoint": "https://api.linear.app/graphql",
        "variables": "={\n  \"filter\": {\n    \"team\": {\n      \"name\":  {\n        \"eq\": \"Adore\"\n      }\n    }\n  }\n}",
        "requestFormat": "json",
        "authentication": "headerAuth"
      },
      "credentials": {
        "httpHeaderAuth": {
          "id": "QNQL42DMISvQl50S",
          "name": "Linear api "
        }
      },
      "typeVersion": 1
    },
    {
      "id": "f7857473-966e-433e-a7d7-9c4e4bdb670a",
      "name": "便签",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2060,
        940
      ],
      "parameters": {
        "color": 7,
        "width": 256.14371825927645,
        "height": 100,
        "content": "👈🏽 在此筛选器中设置您的团队名称。"
      },
      "typeVersion": 1
    },
    {
      "id": "75365be8-d111-4bc8-9da8-77e8d3a1de6c",
      "name": "拆分工单",
      "type": "n8n-nodes-base.splitOut",
      "position": [
        2020,
        600
      ],
      "parameters": {
        "options": {},
        "fieldToSplitOut": "data.issues.nodes"
      },
      "typeVersion": 1
    },
    {
      "id": "691a8299-9c96-4520-a56b-7edf3bee42b5",
      "name": "便签2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2240,
        460
      ],
      "parameters": {
        "color": 7,
        "width": 256.14371825927645,
        "height": 100,
        "content": "👇🏽 调整任何自定义字段。这里我们设置标签和默认估算值为1"
      },
      "typeVersion": 1
    },
    {
      "id": "4ff13ada-6534-4171-8704-4917b247727d",
      "name": "设置自定义字段",
      "type": "n8n-nodes-base.set",
      "position": [
        2240,
        600
      ],
      "parameters": {
        "fields": {
          "values": [
            {
              "name": "estimate",
              "type": "numberValue",
              "numberValue": "={{ $json.estimate ?? 1 }}"
            },
            {
              "name": "labels",
              "stringValue": "={{ $json.labels.nodes.map((label) => label.name).toString() }}"
            }
          ]
        },
        "options": {}
      },
      "typeVersion": 3.2
    },
    {
      "id": "02577d21-656e-425b-9924-37a34c822fe8",
      "name": "便签3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        740,
        300
      ],
      "parameters": {
        "color": 5,
        "width": 403.45318928152614,
        "height": 280.9004675550071,
        "content": "### 👨‍🎤 设置"
      },
      "typeVersion": 1
    },
    {
      "id": "6344a764-20f0-4f46-bdc8-1599c2f9ba95",
      "name": "便签4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2700,
        780
      ],
      "parameters": {
        "color": 7,
        "width": 256.14371825927645,
        "height": 100,
        "content": "👆🏽 更新要写入的Google表格"
      },
      "typeVersion": 1
    },
    {
      "id": "ba08e0c7-1607-4bcd-8b37-99a6145b0cba",
      "name": "将工单写入Sheets",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        2720,
        600
      ],
      "parameters": {
        "columns": {
          "value": {},
          "schema": [
            {
              "id": "id",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "id",
              "defaultMatch": true,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "autoMapInputData",
          "matchingColumns": [
            "id"
          ]
        },
        "options": {},
        "operation": "appendOrUpdate",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 2072772685,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1pQxSIZ2dSoA8Fmr3B4EId9VOQXH1hVuOZgCHxcaKN7k/edit#gid=2072772685",
          "cachedResultName": "Sheet2"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1pQxSIZ2dSoA8Fmr3B4EId9VOQXH1hVuOZgCHxcaKN7k",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1pQxSIZ2dSoA8Fmr3B4EId9VOQXH1hVuOZgCHxcaKN7k/edit?usp=drivesdk",
          "cachedResultName": "Adore tickets"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "xNiEr671wxZVfjs6",
          "name": "Google Sheets account 3"
        }
      },
      "retryOnFail": true,
      "typeVersion": 4.2,
      "waitBetweenTries": 5000
    },
    {
      "id": "df3ae898-1f09-4be3-a96a-f1f9cba58730",
      "name": "扁平化对象以获取可用于筛选的简单字段",
      "type": "n8n-nodes-base.code",
      "position": [
        2480,
        600
      ],
      "parameters": {
        "mode": "runOnceForEachItem",
        "jsCode": "function flattenObject(ob) {\n    var toReturn = {};\n\n    for (var i in ob) {\n        if (!ob.hasOwnProperty(i)) continue;\n\n        if ((typeof ob[i]) == 'object' && ob[i] !== null) {\n            var flatObject = flattenObject(ob[i]);\n            for (var x in flatObject) {\n                if (!flatObject.hasOwnProperty(x)) continue;\n\n                toReturn[i + '.' + x] = flatObject[x];\n            }\n        } else {\n            toReturn[i] = ob[i];\n        }\n    }\n    return toReturn;\n}\n\nreturn flattenObject($input.item.json);"
      },
      "typeVersion": 2
    }
  ],
  "pinData": {},
  "connections": {
    "Get next page": {
      "main": [
        [
          {
            "node": "if has next page",
            "type": "main",
            "index": 0
          },
          {
            "node": "Split out the tickets",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get end cursor": {
      "main": [
        [
          {
            "node": "Get next page",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "if has next page": {
      "main": [
        [
          {
            "node": "Get end cursor",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set custom fields": {
      "main": [
        [
          {
            "node": "Flatten object to have simple fields to filter by",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Every day at 06:00": {
      "main": [
        [
          {
            "node": "Get all your team's tickets",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Split out the tickets": {
      "main": [
        [
          {
            "node": "Set custom fields",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get all your team's tickets": {
      "main": [
        [
          {
            "node": "Split out the tickets",
            "type": "main",
            "index": 0
          },
          {
            "node": "if has next page",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Flatten object to have simple fields to filter by": {
      "main": [
        [
          {
            "node": "Write tickets to Sheets",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
常见问题

如何使用这个工作流?

复制上方的 JSON 配置代码,在您的 n8n 实例中创建新工作流并选择「从 JSON 导入」,粘贴配置后根据需要修改凭证设置即可。

这个工作流适合什么场景?

中级 - 工程, 产品

需要付费吗?

本工作流完全免费,您可以直接导入使用。但请注意,工作流中使用的第三方服务(如 OpenAI API)可能需要您自行付费。

工作流信息
难度等级
中级
节点数量14
分类2
节点类型8
难度说明

适合有一定经验的用户,包含 6-15 个节点的中等复杂度工作流

作者
外部链接
在 n8n.io 查看

分享此工作流