Skip to main content
以下是一些常用的自动化脚本示例,覆盖了日常工作中最常见的场景。每个示例都包含上下文说明,帮助你理解何时以及如何使用。

调用外部 API

从外部服务获取数据,用于丰富记录信息或获取实时数据。
const res = await fetch("https://api.example.com/data");
const data = await res.json();
output.set("apiData", data);

调用 Teable API 创建记录

在脚本中直接调用 Teable API 创建新记录,适合需要在一个脚本中完成多步操作的场景。
const base = process.env.PUBLIC_ORIGIN + "/api";
const token = process.env.AUTOMATION_TOKEN;

const res = await fetch(`${base}/table/tblXXXXXX/record`, {
  method: "POST",
  headers: {
    Authorization: `Bearer ${token}`,
    "Content-Type": "application/json"
  },
  body: JSON.stringify({
    records: [{ fields: { fldName: "新记录", fldStatus: "待处理" } }]
  })
});
const result = await res.json();
output.set("created", result);

批量创建多条记录

当需要一次性创建多条记录时(如根据模板初始化项目任务),可以在一个 API 调用中批量完成。
const base = process.env.PUBLIC_ORIGIN + "/api";
const token = process.env.AUTOMATION_TOKEN;
const tableId = "tblXXXXXX";

const newRecords = [
  { fields: { fldTask: "需求分析", fldPhase: "第一阶段", fldDays: 5 } },
  { fields: { fldTask: "设计评审", fldPhase: "第一阶段", fldDays: 3 } },
  { fields: { fldTask: "开发实现", fldPhase: "第二阶段", fldDays: 10 } },
  { fields: { fldTask: "测试验收", fldPhase: "第三阶段", fldDays: 5 } }
];

const res = await fetch(`${base}/table/${tableId}/record`, {
  method: "POST",
  headers: {
    Authorization: `Bearer ${token}`,
    "Content-Type": "application/json"
  },
  body: JSON.stringify({ records: newRecords })
});
const result = await res.json();
output.set("createdCount", result.records?.length || 0);

调用外部 API 并写回数据

从外部 API 获取数据后,更新当前触发记录的字段。适用于汇率查询、物流状态查询等场景。
const actionIds = Object.keys(input);
const data = input[actionIds[0]];
const recordId = data.record.id;

// 调用外部 API 获取汇率
const res = await fetch("https://api.exchangerate-api.com/v4/latest/USD");
const rates = await res.json();
const cnyRate = rates.rates.CNY;

// 更新 Teable 记录
const base = process.env.PUBLIC_ORIGIN + "/api";
const token = process.env.AUTOMATION_TOKEN;
const tableId = "tblXXXXXX";

await fetch(`${base}/table/${tableId}/record/${recordId}`, {
  method: "PATCH",
  headers: {
    Authorization: `Bearer ${token}`,
    "Content-Type": "application/json"
  },
  body: JSON.stringify({
    record: { fields: { fldExchangeRate: cnyRate } }
  })
});

output.set("rate", cnyRate);

解析 JSON 字符串

将存储在文本字段中的 JSON 字符串解析为对象,方便后续引用其中的具体字段。常见于从 Webhook 或 API 获取的原始数据。
const actionIds = Object.keys(input);
const data = input[actionIds[0]];
const jsonStr = data.record.fields.fldJsonData;

try {
  const parsed = JSON.parse(jsonStr);
  output.set("parsed", parsed);
  output.set("success", true);
} catch (e) {
  output.set("parsed", null);
  output.set("success", false);
  output.set("error", `JSON 解析失败: ${e.message}`);
}

日期计算

计算两个日期之间的天数差、生成未来日期等。适用于截止日期提醒、工期计算等场景。
const actionIds = Object.keys(input);
const data = input[actionIds[0]];

// 计算距离截止日期还有多少天
const dueDate = new Date(data.record.fields.fldDueDate);
const today = new Date();
today.setHours(0, 0, 0, 0);
dueDate.setHours(0, 0, 0, 0);

const diffDays = Math.ceil((dueDate - today) / (1000 * 60 * 60 * 24));

let status;
if (diffDays < 0) {
  status = `已逾期 ${Math.abs(diffDays)} 天`;
} else if (diffDays === 0) {
  status = "今天到期";
} else if (diffDays <= 3) {
  status = `还剩 ${diffDays} 天,即将到期`;
} else {
  status = `还剩 ${diffDays} 天`;
}

output.set("diffDays", diffDays);
output.set("status", status);

// 生成未来日期(例如 7 天后)
const futureDate = new Date(today);
futureDate.setDate(futureDate.getDate() + 7);
const futureDateStr = futureDate.toISOString().split("T")[0];
output.set("followUpDate", futureDateStr);

格式化日期

将日期字段转换为指定格式的字符串,用于邮件正文、报告内容等。
const actionIds = Object.keys(input);
const data = input[actionIds[0]];
const dateStr = data.record.fields.fldDate;

const date = new Date(dateStr);
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, "0");
const day = String(date.getDate()).padStart(2, "0");

// 多种格式
output.set("iso", `${year}-${month}-${day}`);
output.set("chinese", `${year}${parseInt(month)}${parseInt(day)}日`);
output.set("slash", `${year}/${month}/${day}`);

条件分支处理

根据记录的字段值执行不同逻辑。例如,根据订单金额决定审批流程。
const actionIds = Object.keys(input);
const data = input[actionIds[0]];
const fields = data.record.fields;

const amount = Number(fields.fldAmount) || 0;
const category = fields.fldCategory;

let approver;
let needsReview;

// 根据金额和类别决定审批人
if (amount >= 100000) {
  approver = "总经理";
  needsReview = true;
} else if (amount >= 10000) {
  approver = "部门经理";
  needsReview = true;
} else {
  approver = "自动通过";
  needsReview = false;
}

// 特殊类别额外处理
if (category === "固定资产") {
  approver = "财务总监";
  needsReview = true;
}

output.set("approver", approver);
output.set("needsReview", needsReview);
output.set("amount", amount);

合并多个字段

将多个字段值拼接为一个字符串,用于生成摘要、通知内容等。
const actionIds = Object.keys(input);
const data = input[actionIds[0]];
const fields = data.record.fields;

const fullName = `${fields.fldLastName}${fields.fldFirstName}`;
const summary = `${fullName} - ${fields.fldDepartment} - ${fields.fldTitle}`;

output.set("fullName", fullName);
output.set("summary", summary);

数据筛选和统计

对查询结果进行筛选、分组和统计,用于生成报告或数据分析。
const actionIds = Object.keys(input);
const records = input[actionIds[0]].records;

// 筛选逾期记录
const overdue = records.filter(r => {
  const dueDate = new Date(r.fields.fldDueDate);
  return dueDate < new Date() && r.fields.fldStatus !== "已完成";
});

// 按状态统计
const statusCount = {};
records.forEach(r => {
  const status = r.fields.fldStatus || "未设置";
  statusCount[status] = (statusCount[status] || 0) + 1;
});

// 计算数字字段总和
const totalAmount = records.reduce((sum, r) => {
  return sum + (Number(r.fields.fldAmount) || 0);
}, 0);

output.set("overdueRecords", overdue);
output.set("overdueCount", overdue.length);
output.set("statusCount", statusCount);
output.set("totalAmount", totalAmount);
output.set("totalRecords", records.length);

批量生成编号

为一组记录生成带前缀的序列编号,用于订单号、工单号等场景。
const actionIds = Object.keys(input);
const records = input[actionIds[0]].records;
const prefix = "ORD";
const startNum = 1001;

const numbered = records.map((r, i) => ({
  id: r.id,
  code: `${prefix}-${String(startNum + i).padStart(6, "0")}`
}));

output.set("numberedRecords", numbered);
// 示例输出: [{id: "recXXX", code: "ORD-001001"}, {id: "recYYY", code: "ORD-001002"}, ...]

发送格式化的 Webhook 通知

将记录数据格式化后发送到 Slack、企业微信或钉钉等平台。
const actionIds = Object.keys(input);
const data = input[actionIds[0]];
const fields = data.record.fields;

// Slack 通知
const slackPayload = {
  text: `新任务创建通知`,
  blocks: [
    { type: "header", text: { type: "plain_text", text: fields.fldTitle } },
    { type: "section", text: { type: "mrkdwn", text: `*负责人:* ${fields.fldAssignee}\n*优先级:* ${fields.fldPriority}\n*截止日期:* ${fields.fldDueDate}` } }
  ]
};

const res = await fetch("https://hooks.slack.com/services/YOUR/WEBHOOK/URL", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify(slackPayload)
});

output.set("status", res.status);
output.set("success", res.ok);

企业微信 Webhook 通知

const actionIds = Object.keys(input);
const data = input[actionIds[0]];
const fields = data.record.fields;

const payload = {
  msgtype: "markdown",
  markdown: {
    content: `### 新工单通知\n> **标题**: ${fields.fldTitle}\n> **提交人**: ${fields.fldSubmitter}\n> **优先级**: <font color="warning">${fields.fldPriority}</font>\n> **描述**: ${fields.fldDescription}\n\n请及时处理。`
  }
};

const res = await fetch("https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR-KEY", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify(payload)
});

output.set("sent", res.ok);

相关文档

Last modified on April 9, 2026