To solve this optimization problem, we need to define the decision variables, objective function, and constraints. 

Let's denote:
- $x$ as the number of individual salads sold,
- $y$ as the number of family-sized salads sold.

The profit per individual salad is $4, and the profit per family-sized salad is $7. Thus, the total profit can be represented by the objective function: $4x + 7y$.

We have three constraints based on the available ingredients:
1. Lettuce constraint: $5x + 18y \leq 220$ (since each individual salad contains 5 units of lettuce and each family-sized salad contains 18 units, and there are 220 units available),
2. Tomatoes constraint: $2x + 6y \leq 150$ (each individual salad contains 2 units of tomatoes, each family-sized salad contains 6 units, with 150 units available),
3. Sauce constraint: $2x + 5y \leq 140$ (each individual salad contains 2 units of sauce, each family-sized salad contains 5 units, with 140 units available).

Additionally, $x \geq 0$ and $y \geq 0$ since the number of salads sold cannot be negative.

Here is how we can translate this into Gurobi code in Python:

```python
from gurobipy import *

# Create a new model
m = Model("Salad_Sales")

# Define variables
x = m.addVar(vtype=GRB.CONTINUOUS, name="individual_salads")
y = m.addVar(vtype=GRB.CONTINUOUS, name="family_sized_salads")

# Objective function: Maximize profit
m.setObjective(4*x + 7*y, GRB.MAXIMIZE)

# Constraints
m.addConstr(5*x + 18*y <= 220, "lettuce")
m.addConstr(2*x + 6*y <= 150, "tomatoes")
m.addConstr(2*x + 5*y <= 140, "sauce")

# Optimize model
m.optimize()

# Print solution
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Individual salads: {x.x}")
    print(f"Family-sized salads: {y.x}")
    print(f"Maximum profit: ${4*x.x + 7*y.x:.2f}")
else:
    print("No optimal solution found")
```