
Huly 平台 ClickUp 任务导入实战指南从 CSV 导出到一键迁移全流程解析【免费下载链接】platformHuly — All-in-One Project Management Platform (alternative to Linear, Jira, Slack, Notion, Motion)项目地址: https://gitcode.com/GitHub_Trending/platform80/platform导读本文聚焦 Huly 项目All-in-One 项目管理平台提供的ClickUp 直接导入能力完整讲解从 ClickUp 导出任务 CSV → 通过 Docker 运行 import-tool → 任务、评论、附件、清单迁移到 Huly 工作区的端到端流程。读完本文你将掌握import-clickup-tasks命令的用法与全部参数语义理解用户映射、父子任务、状态/优先级、工时估算、Checklist 与附件等数据的底层转换逻辑并能结合源码判断各类边界情况的处理结果从而顺利规划一次真实的 ClickUp → Huly 迁移。一、ClickUp 导入在整个迁移体系中的定位Huly 官方仓库提供了独立的导入工具包 dev/import-tool其 README.md 明确给出了两条迁移路径推荐路径Unified Import Format统一导入格式——把任意系统的数据转换成一种基于 YAML Markdown、人类可读的中间结构后再导入可预先校验、便于脚本化生成具体规范见 dev/import-tool/docs/huly/README.md。直接导入路径——针对个别平台提供开箱即用的直接迁移目前支持Notion见 dev/import-tool/docs/notion/README.md和ClickUp即本文主题 dev/import-tool/docs/clickup/README.md。官方文档的评价是直接导入适合简单迁移suitable for simple migrations而复杂场景或列表中未覆盖的系统应改用统一格式。因此本文所述的 ClickUp 导入适合任务结构相对直接、以 CSV 全量导出为起点的场景。二、前置准备从 ClickUp 导出任务数据导入的第一步是把数据从 ClickUp 侧导出来操作要点如下在 ClickUp 中使用官方提供的Task data export任务数据导出功能将任务导出为CSV格式将导出的 CSV 文件保存到本地机器建议放到一个专门准备的目录中后续作为挂载数据卷。这里需要特别说明ClickUp 的 CSV 导出并不会携带全部原始字段比如Checklist 条目的勾选状态不会包含在导出数据中这一点直接决定了导入后 Checklist 的呈现形态详见本文第七节是评估迁移效果时必须提前知晓的约束。三、运行导入工具Docker 一键命令将 CSV 文件放入某个目录例如/path/to/export后用 Docker 启动官方镜像执行导入docker run \ -e FRONT_URLhttps://huly.app \ -v /path/to/export:/data \ hardcoreeng/import-tool:latest \ -- bundle.js import-clickup-tasks /data/tasks.csv \ --user your.emailcompany.com \ --password yourpassword \ --workspace workspace-id参数逐项说明参数类型含义FRONT_URL环境变量Huly 前端地址用于拉取/config.json获取 Accounts 服务地址、并作为附件上传的入口未设置时工具会直接报错退出-v /path/to/export:/data卷挂载把存放tasks.csv的本地目录挂载进容器/dataimport-clickup-tasks /data/tasks.csv子命令 位置参数指定执行 ClickUp 导入参数为容器内 CSV 文件的路径--user必填登录 Huly 的账号邮箱--password必填登录密码--workspace必填目标工作区的 URLworkspace url任务将被导入到该工作区镜像标签使用hardcoreeng/import-tool:latest若需自行构建可参照 dev/import-tool/Dockerfile基于hardcoreeng/base-slim基础镜像将 esbuild 打包产物bundle/bundle.js复制进镜像以及 dev/import-tool/package.json 中docker:build等脚本。四、命令与授权流程的源码实现4.1 CLI 命令定义导入工具的可执行入口是 dev/import-tool/src/__start.ts它直接调用 dev/import-tool/src/index.ts 中的importTool()。importTool使用commander定义全部子命令其中 ClickUp 相关的定义如下源码 dev/import-tool/src/index.tsprogram .command(import-clickup-tasks file) .description(import extracted archive exported from Notion as Markdown CSV) .requiredOption(-u, --user user, user) .requiredOption(-p, --password password, password) .requiredOption(-w, --workspace workspace, workspace url where the documents should be imported to) .action(async (file: string, cmd) { const { workspace, user, password } cmd await authorize(user, password, workspace, async (client, uploader) { const importer new ClickupImporter(client, uploader, new ConsoleLogger()) await importer.importClickUpTasks(file) }) })可以看到--user、--password、--workspace都是必填选项requiredOption缺失时 commander 会直接报错。工具内部通过FRONT_URL拼接/config.json获取 Accounts 地址随后执行登录、按 URL 筛选工作区、建立 Transactor 连接并创建TxOperations客户端与FrontFileUploader上传器见 dev/import-tool/src/index.ts 的authorize函数。若登录失败、工作区不存在或参数为空工具会打印相应错误信息并静默返回不会产生任何写入。4.2 导入核心类的调用链ClickupImporter类位于 packages/importer/src/clickup/clickup.ts其入口方法importClickUpTasks的执行流程为processClickupTasks(file)解析 CSV → 构造项目Space、任务类型ProjectType含全部状态与任务含父子关系三层中间结构将中间结构交给通用的WorkspaceImporter位于 packages/importer/src/importer/importer.ts执行performImport()其顺序为importProjectTypes创建项目类型与状态→importSpaces创建项目/Teamspace/OrgSpace 并逐层创建 issue/文档→importAttachments上传附件结束后在日志中打印IMPORT SUCCESS。CSV 的解析使用csvtojson逐行完成processTasksCsv每一行被映射为ClickupTask接口packages/importer/src/clickup/clickup.ts字段包括Task ID、Task Name、Task Content、Status、Parent ID、Attachments、Assignees、Priority、Space Name、Checklists、Comments、Time Estimated、Time Spent等——这些正是 ClickUp CSV 导出的列名。五、用户映射机制按姓名与邮箱匹配官方文档明确了三条用户映射规则源码中均有对应实现任务负责人Assignee按全名匹配fillPersonsByNames会查询平台内全部contact.class.Person并将person.name按split(,).reverse().join( )规范化后建立姓名 → Person 引用的映射packages/importer/src/clickup/clickup.ts。也就是说平台联系人姓名在内部存储为姓,名格式时会被还原成名 姓如Jane Doe再与 CSV 中的Assignees做精确匹配。评论作者按邮箱匹配fillKnownEmails查询平台内所有SocialIdentity且类型为 EMAIL 的记录构造已知邮箱集合解析评论时用buildSocialIdString生成作者邮箱字符串若命中已知集合则评论归属到该作者否则作者信息以文本形式保留在评论内容尾部见 packages/importer/src/clickup/clickup.ts。找不到用户时的降级策略任务会以无负责人assignee 为空导入同时生成一条服务性评论原文格式为*ClickUp assignee: John Smith*实际源码中多人时以逗号拼接为*ClickUp assignees: ...*见 packages/importer/src/clickup/clickup.ts保证原始负责人信息不丢失。因此导入前必须先在平台中创建好相关用户在 Contacts/Employee 下这是映射能否生效的前提否则将按上述降级策略处理。六、数据结构转换CSV 行 → Huly IssueconvertToImportIssuepackages/importer/src/clickup/clickup.ts完成单行任务到ImportIssue的转换要点如下描述内容Task Content中的字面量null会被当作空字符串转义序列\n会被还原为换行fixClickupStringChecklist 生成的 Markdown 会以\n\n---\n分隔拼接在正文之后。工时估算Time Estimated毫秒除以1000 * 60 * 60转为小时作为estimationremainingTime estimation - Time Spent 小时数millisecondsToHours。状态CSV 中每个Status都会收集起来在createClickupProjectType中生成一个名为ClickUp project的项目类型其下任务类型为ClickUp issue包含全部原始状态名packages/importer/src/clickup/clickup.ts。状态在导入时按名称在平台内查找对应IssueStatusfindIssueStatusByNamepackages/importer/src/importer/importer.ts因此 ClickUp 中的自定义状态名需要与平台中已存在的状态同名才能命中。项目SpaceCSV 中的Space Name即 Huly 的项目名项目标识符由getProjectIdentifier生成名称转大写、-与空格替换为_、截取前 4 个字符packages/importer/src/clickup/clickup.ts若与已有项目标识符冲突uniqueProjectIdentifier会追加序号保证唯一。优先级Priority为可选的数字字段接口中声明为number?未提供时在WorkspaceImporter.createIssue中落到IssuePriority.NoPrioritypackages/importer/src/importer/importer.ts。父子任务CSV 中的Parent ID用于在内存中建立父子关系clickupParentId子任务会挂到父任务的subdocs若父任务缺失会抛出Parent not found错误若无父任务也无 Space 则会抛出Task cannot be importedpackages/importer/src/clickup/clickup.ts。导入时WorkspaceImporter.createIssueWithSubissues会递归创建子任务并传递IssueParentInfo层级信息任务编号通过递增项目sequence生成如PROJ-1、PROJ-2见 packages/importer/src/importer/importer.ts。评论评论 JSON 数组解析后按日期排序importCommentspackages/importer/src/importer/importer.ts再以ChatMessage附加到 issue 的comments集合原始评论日期与作者若能匹配会保留。七、Checklist 与附件已知限制的底层原因7.1 Checklist 全部按未勾选导入源码convertChecklistsToMarkdownpackages/importer/src/clickup/clickup.ts把 CSV 中Checklists字段形如Recordstring, string[]的 JSON转换为 Markdown 清单代码注释直言no way to check if item is checked, this info doesnt exported from ClickUp无法得知条目是否已勾选该信息没有随 CSV 导出。因此所有条目固定生成为未勾选语法* [ ] value再以**清单名**作为分组标题拼入任务描述。这与官方文档Checklist items are imported as unchecked完全一致属于 ClickUp 导出格式本身的限制而非工具缺陷。7.2 附件下载失败自动降级convertAttachmentsToCommentpackages/importer/src/clickup/clickup.ts将Attachments字段JSON 数组含title与url转换为带附件的评论正文写入ClickUp attachment link: 标题同时通过blobProvider调用download(attachment.url)获取二进制流。结合 packages/importer/src/importer/importer.ts 的importAttachment逻辑可知若下载返回null如 404、网络失败会记录Failed to read attachment file错误并跳过若上传过程中抛异常会记录Failed to upload attachment file并继续后续任务两种失败场景下原始附件 URL 都已作为评论文本保留在任务中不会造成信息彻底丢失。需要说明的是官方文档描述为Original attachment URL is added as a comment源码实现中该链接文本与附件对象同处一条评论内无论上传成败这条含原始链接的评论都会被创建。八、其他限制与迁移前建议官方文档列出的限制汇总如下Checklist 勾选状态丢失全部以未勾选形态导入原因见 7.1附件下载可能失败失败时跳过并警告原始链接以评论形式保留见 7.2用户导入暂不支持平台中的用户必须提前手动创建Contacts/Employee工具只做匹配不做创建。综合以上行为建议在正式迁移前① 先在平台中补齐所有相关用户并确认姓名/邮箱与 ClickUp 数据一致② 用一份小规模 CSV 试运行观察日志中Projects、Statuses、IMPORT DATA STRUCTURE的输出是否符合预期③ 关注状态名与平台内置状态如 Backlog、Todo、In Progress、Done、Canceled的对应关系必要时在平台中预建同名状态。若迁移涉及大量自定义字段、复杂页面结构或权限配置可转而评估统一导入格式dev/import-tool/docs/huly/README.md它支持更精细的frontmatter元数据与可控的导入结果。九、总结ClickUp 直接导入是 Huly 迁移工具箱中的一条轻量快速通道一条 Docker 命令即可完成任务、评论、附件、清单与工时数据的迁移用户映射、父子关系、时间单位换算等细节均有清晰的源码级行为可循。理解官方文档与 packages/importer/src/clickup/clickup.ts 中体现的转换规则与已知限制后你就可以准确预判导入结果、提前准备数据把一次 ClickUp → Huly 迁移做得干净利落。对于更复杂的迁移需求请优先参考统一导入格式文档以获得更完整的控制力。【免费下载链接】platformHuly — All-in-One Project Management Platform (alternative to Linear, Jira, Slack, Notion, Motion)项目地址: https://gitcode.com/GitHub_Trending/platform80/platform创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考