
Automatisch 内置 Formatter 应用详解无需连接即可完成文本、数字与日期时间的数据格式化【免费下载链接】automatischThe open source Zapier alternative. Build workflow automation without spending time and money.项目地址: https://gitcode.com/GitHub_Trending/au/automatischFormatter 是 Automatisch 中随发行版内置的零连接应用它不依赖任何外部服务无需配置凭据即可在流程中充当动作节点对上游步骤产生的数据进行文本、数字与日期时间的清洗与转换。读完本文你将掌握 Formatter 全部三大类转换能力的适用场景、参数含义与源码级实现原理并能在自己的自动化流程中直接落地使用。Formatter 为什么不需要连接在 Automatisch 中大多数应用如 GitHub、Slack、Gmail都要求先建立 Connection 才能被流程引用。Formatter 则完全不同官方文档明确指出它是 built-in app运行时不与任何外部服务通信因此没有任何额外的连接步骤。这一点在源码中得到了直接印证。应用注册文件 packages/backend/src/apps/formatter/index.js 中有如下关键声明export default defineApp({ name: Formatter, key: formatter, iconUrl: {BASE_URL}/apps/formatter/assets/favicon.svg, authDocUrl: {DOCS_URL}/apps/formatter/connection, supportsConnections: false, // 关键不需要任何连接 baseUrl: , apiBaseUrl: , primaryColor: #001F52, actions, dynamicFields, });其中supportsConnections: false意味着在流程编辑器中选中 Formatter 时不会出现选择连接的步骤可以直接配置动作参数。它只能作为**动作Action**使用不能作为触发器Trigger——因为它本身不产生新事件其职责是消费并改造上游数据再把结果交给下游步骤。在流程中添加 Formatter 动作在流程编辑器中添加动作节点后搜索并选择 Formatter即可看到三大类动作。这三大类在 动作聚合入口 中注册为text、numbers、dateTime三个动作动作key能力摘要Texttext大小写、HTML/Markdown 互转、抽取邮箱与数字、复数化、替换、去空白、默认值等Numbersnumbers数学运算、随机数、数字格式化Date / Timedate-time日期时间格式化、当前时间戳每个动作的配置界面都由一个必选的Transform下拉框驱动。当你选择某个具体转换项后表单会自动加载该项对应的参数这是通过动态字段机制实现的下文会展开例如选择 Replace 后才会出现Find与Replace输入框。这意味着你只需要为当前选中的转换填写必要的参数无需理解其他无关选项。Text 文本类转换详解官方文档列出的文本类能力共 10 项全部位于 actions/text 目录。除此之外当前仓库源码还额外实现了 6 个转换项Base64 互转、URI 编码、UUID、JSON 解析合计 16 个下面逐一说明。1. Capitalize首字母大写把输入文本中每个单词的首字母转为大写、其余字母转为小写。实现位于 capitalize.js它借助 lodash 的capitalize配合正则/\w/g逐词处理const capitalizedInput input.replace(/\w/g, lodashCapitalize);例如输入hello world会得到Hello World适用于对人名、标题、品牌词做规范化。2. Convert HTML to MarkdownHTML 转 Markdown将一段 HTML 字符串转换为 Markdown 文本实现见 html-to-markdown.js底层使用node-html-markdown库的NodeHtmlMarkdown.translate(input)。当你从网页抓取、RSS 摘要等来源拿到 HTML 片段需要写入支持 Markdown 的目标应用如 Notion、Discord时非常有用。3. Convert Markdown to HTMLMarkdown 转 HTML反向转换把 Markdown 渲染为 HTML实现见 markdown-to-html.js底层使用showdown库的Converter().makeHtml(input)。适合把面向编辑的 Markdown 内容转成富文本 / 邮件正文场景。4. Extract Email Address抽取邮箱地址从一段自由文本中抽取第一个匹配的邮箱地址实现见 extract-email-address.js核心是标准邮箱正则const emailRegexp /[a-z0-9!#$%*/?^_{|}~-](?:\.[a-z0-9!#$%*/?^_{|}~-])*(?:a-z0-9?\.)a-z0-9?/; const email input.match(emailRegexp); return email ? email[0] : ;注意无匹配时返回空字符串而非报错可安全用于后续步骤若需要提取多个邮箱可从该实现逻辑推断当前版本只返回第一个匹配项。5. Extract Number抽取数字从文本中抽取第一个数字串实现见 extract-number.js其注释明确列出了一系列支持的数字形态包括123、-123、121,234、-121.234、1,234,567.89、-1.234.567,89等千分位与小数分隔符组合匹配正则如下const numberRegexp /-?((\d{1,3})\.?,?)/g; const numbers input.match(numberRegexp); return numbers ? numbers[0] : ;例如从总金额为 1,234,567.89 元中可抽出1,234,567.89。6. Lowercase转小写将输入文本全部转为小写。适合对关键词、标签、邮箱地址等做归一化处理避免因大小写不一致导致后续匹配失败。对应入口定义见 text/index.js。7. Pluralize复数化将英文单词转换为复数形式实现见 pluralize.js底层使用pluralize库。例如apple→applesperson→people。适合在生成报表文案、通知消息时动态构造正确语法。8. Replace文本替换在输入文本中查找并替换内容实现见 replace.js。它有两个重要能力普通替换input.replaceAll(find, replace)替换所有出现的位置正则替换开启useRegex后使用new RegExp(find, flags)构造表达式并支持ignoreCase忽略大小写最终同样执行replaceAll。值得关注的是源码中的一道安全保护replace.js正则模式会先设置一个 100ms 的定时器若正则执行如灾难性回溯导致超时会通过$.execution.exit()提前终止执行避免正则表达式长时间阻塞流程运行const timeoutId setTimeout(() { $.execution.exit(); }, 100); const regex new RegExp(find, flags); const replacedValue input.replaceAll(regex, replace); clearTimeout(timeoutId);对应参数定义在动态字段 list-transform-options/text/replace.js 中Input必填、Find必填、Replace可选替换为空即删除、Use Regular Expression下拉 Yes/No选择 Yes 后会动态追加忽略大小写选项。注意若要使用捕获组引用等能力应直接编写完整正则。9. Trim Whitespace去除首尾空白去除输入文本两端的空白字符空格、制表符、换行等。适合清洗从表单、表格或外部 API 取回的用户输入避免多余空白影响后续的匹配、比较或入库。入口定义见 text/index.js。10. Use Default Value空值兜底当输入为空或仅为空白时返回预设的默认值实现见 use-default-value.jsif (input input.trim().length 0) { return input; } return $.step.parameters.defaultValue;这是典型的数据管道兜底模式上游字段可能缺失或为空用它可以在流程早期把空值替换为可预期的默认值防止下游步骤因空值而失败或产生错误分支。11~16. 仓库额外实现的文本转换除文档列出的 10 项外当前源码还注册了以下 6 项见 text/index.js 的 options 列表Base64 to String/String to Base64字符串与 Base64 编码互转base64-to-string.js、string-to-base64.js适合处理带附件的邮件内容、API 返回的编码数据Create UUID生成 UUIDcreate-uuid.js可用于为记录生成唯一标识Encode URI/Encode URI Component分别对应encodeURI与encodeURIComponentencode-uri.js、encode-uri-component.js构造 URL 参数或拼接请求地址时常用Parse stringified JSON解析字符串形式的 JSONparse-stringified-json.js把上游返回的 JSON 字符串变成结构化数据供后续步骤引用。Numbers 数字类转换详解数字类动作位于 actions/numbers官方文档列出 3 项仓库中还包含第 4 项格式化电话号码。1. Perform Math Operation数学运算对一组数值执行指定运算实现见 perform-math-operation.js内部把每个输入值Number()化后通过 lodash 方法规约计算运算行为add累加初始值 0subtract依次相减按输入顺序从第一个开始减去后续值multiply连乘初始值 1divide依次相除注意除数为 0 时结果为Infinitymodulo依次取余makeNegative对每个值取相反数返回数组适用于计算订单小计、批量金额汇总、折扣后价格等场景。多个数值通过values列表传入每个元素为{ input: ... }结构源码中values.map((value) Number(value.input))体现了这一点。2. Random Number随机数在指定范围内生成随机数实现见 random-number.jsconst lowerRange Number($.step.parameters.lowerRange); const upperRange Number($.step.parameters.upperRange); const decimalPoints Number($.step.parameters.decimalPoints) || 0; return Number( (Math.random() * (upperRange - lowerRange) lowerRange).toFixed(decimalPoints) );参数为Lower Range、Upper Range闭区间采样和可选的Decimal Points小数位数默认 0。可用于抽奖、AB 分流、生成临时验证码等场景。注意随机范围默认不校验上下界大小关系使用时请自行保证upperRange lowerRange。3. Format Number数字格式化将数字按指定的千分位 / 小数分隔符风格输出实现见 format-number.js底层使用accounting库并自动根据输入值的小数位数保留精度To Format取值千分位分组符小数点0逗号,句点.如1,234,567.891句点.逗号,如1.234.567,892空格句点.如1 234 567.893空格逗号,如1 234 567,89使用时可指定Input Decimal Mark说明输入数字使用的小数点符号配合To Format实现跨地区数字格式互转比如把美国格式1,234,567.89转为欧洲格式1.234.567,89。4. Format Phone Number格式化电话号码对手机号进行格式化输出实现见 format-phone-number.js国家码选项来自 common/phone-number-country-codes.js。适合在发送短信如 Twilio、SignalWire、Telegram或写入 CRM 前统一号码显示格式。Date / Time 日期时间类转换详解日期时间类动作位于 actions/date-time官方文档列出 1 项仓库中另外提供 2 个时间戳获取转换项。1. Format Date / Time日期时间格式化对既有时间值做格式与时区的双重转换实现见 format-date-time.js底层使用luxon库。需要配置 5 个参数定义见 dynamic-fields 中的 format-date-time.js参数是否必填说明Input是要格式化的原始时间字符串支持变量引用上游数据From Format是输入时间的格式使用 Luxon 格式令牌From Timezone是输入时间所在的时区如Asia/ShanghaiTo Format是输出时间的格式To Timezone是输出目标时区源码中还有一个容易被忽略的细节当From Format为X时输入被当作秒级 Unix 时间戳DateTime.fromSeconds(Number(input))为x时被当作毫秒级时间戳DateTime.fromMillis(Number(input))。也就是说直接粘贴1700000000这样的秒级时间戳也能正确解析无需先转成字符串日期。核心转换逻辑如下const outputDateTime inputDateTime.setZone(toTimezone).toFormat(toFormat);时区选项取自Intl.supportedValuesOf(timeZone)的全量列表见 options/timezone.js覆盖全球各大时区。典型场景是把外部 API 返回的 UTC 时间统一转换为业务所在地时间例如从2024-01-15T08:00:00.000ZUTC转为2024-01-15 16:00Asia/Shanghai。2. 获取当前时间戳两个变体Get current timestamp返回毫秒级 Unix 时间戳get-current-timestamp.jsGet current timestamp in seconds返回秒级 Unix 时间戳get-current-timestamp-in-seconds.js。两个转换项不需要任何参数可用于为记录打时间戳、构造签名参数、或作为流程排他去重的依据。转换分发的底层机制Transformer 与动态字段理解 Formatter 的源码结构有助于你预判每个转换项的行为统一分发三个动作text / numbers / date-time的run方法完全同构都以$.step.parameters.transform为 key从各自的 transformers 映射表中取出对应函数并执行再通过$.setActionItem({ raw: { output } })把结果写入执行记录。以 Text 为例见 text/index.js 的 run 方法。这意味着每个转换项本质都是一个纯函数输入来自$.step.parameters输出即动作结果。动态字段Formatter 的每个动作都声明了additionalFieldsgetDynamicFieldslistTransformOptions当Transform下拉框的值变化时后端动态字段接口会根据该值返回对应的参数字段列表。因此不同转换项的参数字段是按需加载的这也是为什么你在界面上只会看到当前转换所需的输入框。相关实现位于 dynamic-fields/list-transform-options 目录与 transformers 一一对应。无连接、无触发器从应用注册的supportsConnections: false与仅注册actions两个特征可以确认Formatter 只能作为动作节点插入到已有触发器如 Webhook、Scheduler、表单提交之后作为数据管道的中间处理环节。实战使用建议数据管道中放中间把 Formatter 动作放在数据来源步骤与目标应用动作之间先清洗再入库可显著减少下游因脏数据导致的执行失败。组合使用例如 RSS 抓取的文章 HTML →Convert HTML to Markdown→Replace清理冗余片段 → 写入 Notion / Discord或表单邮箱字段 →Trim WhitespaceLowercase→ 查询 CRM。注意空值语义Extract Email Address、Extract Number在无匹配时返回空字符串而非报错若希望空值时走默认值分支可再接一个Use Default Value转换。正则替换的边界Replace 的正则模式会全局匹配flags 含g并受 100ms 超时保护超长或高回溯复杂度的正则仍建议先在本地验证。结语Formatter 用最少的配置成本解决了自动化流程中最常见的数据整形需求文本清洗、数字运算、日期时间与时区转换一应俱全且完全离线运行、无外部依赖。结合 官方动作列表文档 与仓库源码应用注册见 index.js转换实现见 actions 目录你可以随时查阅每个转换项的参数定义与实现细节把这条免连接的格式化链路熟练地嵌入你的 Automatisch 工作流中。【免费下载链接】automatischThe open source Zapier alternative. Build workflow automation without spending time and money.项目地址: https://gitcode.com/GitHub_Trending/au/automatisch创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考