actions/create-multiple-records/create-multiple-records.mjs
import chunk from "lodash.chunk"; import airtable from "../../airtable_oauth.app.mjs"; import common from "../common/common.mjs"; import { ConfigurationError } from "@pipedream/platform"; const BATCH_SIZE = 10; export default { key: "airtable_oauth-create-multiple-records", name: "Create Multiple Records", description: "Create one or more records in a table in a single operation with an array. [See the documentation](https://airtable.com/developers/web/api/create-records)", version: "0.0.13", annotations: { destructiveHint: false, openWorldHint: true, readOnlyHint: false, }, type: "action", props: { ...common.props, records: { propDefinition: [ airtable, "records", ], }, customExpressionInfo: { type: "alert", alertType: "info", content: `You can use a custom expression that evaluates to an object for each entry in the array, e.g. \`{{ { "foo": "bar", "id": 123 } }}\`. \\ You can also reference an object exported by a previous step, e.g. \`{{steps.foo.$return_value}}\`. \\ If desired, you can use a custom expression in the same fashion for the entire array instead of providing individual values.`, }, typecast: { propDefinition: [ airtable, "typecast", ], }, returnFieldsByFieldId: { propDefinition: [ airtable, "returnFieldsByFieldId", ], }, }, async run({ $ }) { const baseId = this.baseId?.value ?? this.baseId; const tableId = this.tableId?.value ?? this.tableId; let data = this.records; if (!Array.isArray(data)) { data = JSON.parse(data); } data = data.map((fields, index) => { if (typeof fields === "string") { try { fields = JSON.parse(fields); } catch (err) { throw new ConfigurationError(`Error parsing record (index ${index}) as JSON: ${err.message}`); } } return { fields, }; }); if (!data.length) { throw new Error("No Airtable record data passed to step. Please pass at least one record"); } const responses = []; for (const c of chunk(data, BATCH_SIZE)) { try { const records = await this.airtable.createRecord({ baseId, tableId, data: c, opts: { typecast: this.typecast, returnFieldsByFieldId: this.returnFieldsByFieldId, }, }); responses.push(...records); } catch (err) { this.airtable.throwFormattedError(err); } } const l = responses.length; $.export("$summary", `Added ${l} record${l === 1 ? "" : "s"} to ${this.baseId?.label || baseId}: [${this.tableId?.label || tableId}](https://airtable.com/${baseId}/${tableId})`); return responses; }, };