如何在 Airtable 脚本中通过表单配置批量创建记录

1次阅读

如何在 Airtable 脚本中通过表单配置批量创建记录

本文详解如何使用 airtable 自动化脚本(Scripting Extension)正确接收用户输入并批量生成多条记录,重点纠正 input.numberAsync 等非法调用错误,提供可运行的 input.config() 标准实现方案。

本文详解如何使用 airtable 自动化脚本(scripting extension)正确接收用户输入并批量生成多条记录,重点纠正 `input.numberasync` 等非法调用错误,提供可运行的 `input.config()` 标准实现方案。

在 Airtable 的 Scripting Extension 中,不存在 input.numberAsync()、input.dateAsync() 等方法——这是开发者常因混淆前端表单逻辑或过时教程而产生的典型错误。Airtable 官方脚本环境仅支持统一的 input.config() 接口来声明式定义运行时参数,所有输入值均通过其返回的对象同步获取,而非异步调用。

✅ 正确做法:使用 input.config() 声明输入字段

input.config() 是 Airtable 脚本唯一受支持的用户输入机制。它会在脚本执行前弹出一个标准化配置对话框,支持 number、date、StringBooleanselect 等多种类型,并以同步方式返回结构化配置对象:

let config = input.config({   title: '创建分期付款记录',   description: '请填写付款计划参数,系统将自动生成对应数量的记录',   items: [     { type: 'number', name: 'numRecords', label: '付款期数', min: 1, max: 100 },     { type: 'date', name: 'firstDueDate', label: '首期应付款日' },     { type: 'number', name: 'paymentAmount', label: '每期金额', precision: 2 },     { type: 'select', name: 'frequency', label: '频率', options: ['monthly', 'quarterly'] }   ] });  const { numRecords, firstDueDate, paymentAmount, frequency } = config;

⚠️ 注意:input.config() 返回的是同步对象,无需 await;所有字段名(name)将作为属性键直接可用,命名应语义清晰、避免保留字(如 date、number)。

✅ 批量创建记录:按月递推日期 + 异步写入

假设目标表为 Payments,字段包含 Due Date(日期)、Payment Amount(数字)、Installment #(序号)和 Frequency(文本),以下为完整可运行脚本示例:

// 1. 获取用户配置 let config = input.config({   title: '生成分期付款记录',   items: [     { type: 'number', name: 'count', label: '记录数量', min: 1, max: 200 },     { type: 'date', name: 'startDate', label: '首期日期' },     { type: 'number', name: 'amount', label: '每期金额', precision: 2 },     { type: 'select', name: 'freq', label: '频率', options: [         { label: '每月', value: 'monthly' },         { label: '每季度', value: 'quarterly' }       ]     }   ] });  // 2. 解构配置并校验 const { count, startDate, amount, freq } = config; if (!startDate || count < 1) {   output.markdown(`❌ 输入无效:请确保填写有效日期与正整数期数。`);   return; }  // 3. 获取当前表(请替换为你的实际表名) let table = base.getTable('Payments');  // 4. 生成并批量创建记录(推荐 batch 操作提升性能) let recordsToCreate = []; for (let i = 0; i < count; i++) {   let dueDate = new Date(startDate);   if (freq === 'monthly') {     dueDate.setMonth(startDate.getMonth() + i);   } else if (freq === 'quarterly') {     dueDate.setMonth(startDate.getMonth() + i * 3);   }    recordsToCreate.push({     fields: {       'Due Date': dueDate,       'Payment Amount': amount,       'Installment #': i + 1,       'Frequency': freq === 'monthly' ? '每月' : '每季度'     }   }); }  // 5. 批量创建(最多 50 条/批,自动分片) try {   await table.createRecordsAsync(recordsToCreate);   output.markdown(`✅ 已成功创建 **${count}** 条付款记录!`); } catch (error) {   console.error('创建失败:', error);   output.markdown(`❌ 创建失败:${error.message}`); }

? 关键注意事项

  • 不要尝试扩展 input 原型:网上某些“补丁”方案(如手动挂载 numberAsync)违反 Airtable 运行时沙箱规范,可能导致脚本崩溃或审核不通过,官方明确不支持。
  • 日期计算需谨慎:JavaScript Date 对象的 setMonth() 会自动处理跨年/月末(如 1月31日 + 1月 → 2月28日),符合业务预期;若需严格固定日(如总为每月15日),建议用 setDate(15) 配合 setMonth()。
  • 性能优化:单次 createRecordsAsync 最多接受 50 条记录;超量时 Airtable 自动分批,但显式分片(如每 40 条一批)更利于错误定位。
  • 字段名必须精确匹配:fields 中的键名需与 Airtable 表中字段名称完全一致(含空格、大小写),建议复制粘贴字段标题确认。

掌握 input.config() 的声明式输入模式,是构建健壮 Airtable 自动化的基石。它不仅规避了非法 API 调用风险,还提供了类型安全、ui 统一、权限可控的交互体验——真正让脚本从“能跑”走向“可靠可用”。

text=ZqhQzanResources