183d034716
Reorganizing by Feature sections Capabilities folders to give an overview of each feature How-Tos folders to give guidance for advanced customizations Reorganized the Developers section as well, moving the API sub section there added some new visuals and videos to illustrate the How-Tos articles checked the typos, the links and added a section at the end of the doc.json file to redirect existing links to the new ones (SEO purpose + continuity of the user experience) What I have not updated is the "l" folder that, per my understanding, contains the translation of the User Guide - that I only edited in English <!-- CURSOR_SUMMARY --> --- > [!NOTE] > <sup>[Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) is generating a summary for commit 5301502a32856e5b45d7ef30253fa7db6dc55233. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY --> --------- Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com> Co-authored-by: github-actions <github-actions@twenty.com> Co-authored-by: Abdul Rahman <ar5438376@gmail.com> Co-authored-by: Félix Malfait <felix.malfait@gmail.com>
81 lines
2.6 KiB
Plaintext
81 lines
2.6 KiB
Plaintext
---
|
|
title: Handle Arrays in Code Actions
|
|
description: Learn how to properly handle array inputs in workflow Code actions.
|
|
---
|
|
|
|
When working with arrays in Code actions, you may encounter two common challenges:
|
|
1. **Arrays passed as strings** — data from external systems or previous steps arrives as a string instead of an actual array
|
|
2. **Can't select individual items** — you can only select the entire array, not specific fields within it
|
|
|
|
Both can be solved with a Code node.
|
|
|
|
## Parsing Arrays from Strings
|
|
|
|
Arrays are often passed between workflow steps as strings or JSON rather than native arrays. This happens when:
|
|
- Receiving data from external APIs via HTTP Request
|
|
- Processing webhook payloads
|
|
- Passing data between workflow steps
|
|
|
|
**Solution**: Add this pattern at the start of your Code action:
|
|
|
|
```javascript
|
|
export const main = async (params: {
|
|
users: any;
|
|
}): Promise<object> => {
|
|
const { users } = params;
|
|
|
|
// Handle input that may come as a string or an array
|
|
const usersFormatted = typeof users === "string" ? JSON.parse(users) : users;
|
|
|
|
// Now you can safely work with usersFormatted as an array
|
|
return {
|
|
users: usersFormatted.map((user) => ({
|
|
...user,
|
|
activityStatus: String(user.activityStatus).toUpperCase(),
|
|
})),
|
|
};
|
|
};
|
|
```
|
|
|
|
The key line `typeof users === "string" ? JSON.parse(users) : users` checks if the input is a string, parses it if needed, or uses it directly if it's already an array.
|
|
|
|
## Extracting Individual Fields from Arrays
|
|
|
|
A webhook might return an array like `answers: [...]`, but in subsequent workflow steps you can only select the **entire array** — not individual items within it.
|
|
|
|
**Solution**: Add a Code node to extract specific fields and return them as a structured object:
|
|
|
|
```javascript
|
|
export const main = async (params: {
|
|
answers: any;
|
|
}): Promise<object> => {
|
|
const { answers } = params;
|
|
|
|
// Handle input that may come as a string or an array
|
|
const answersFormatted = typeof answers === "string"
|
|
? JSON.parse(answers)
|
|
: answers;
|
|
|
|
// Extract specific fields from the array
|
|
const firstname = answersFormatted[0]?.text || "";
|
|
const name = answersFormatted[1]?.text || "";
|
|
|
|
return {
|
|
answer: {
|
|
firstname,
|
|
name
|
|
}
|
|
};
|
|
};
|
|
```
|
|
|
|
The Code node returns a structured object instead of an array. In subsequent steps, you can now select individual fields like `answer.firstname` and `answer.name` from the variable picker.
|
|
|
|
<Note>
|
|
We're actively working on making array handling easier in future updates.
|
|
</Note>
|
|
|
|
<Tip>
|
|
Click the square icon at the top right of the code editor to display it in full screen — helpful since the default editor width is limited.
|
|
</Tip>
|