To solve this optimization problem, we first need to define the decision variables and the objective function. Let's denote the number of large salads as \(L\) and the number of small salads as \(S\). The objective is to maximize profit, given by \(4L + 2S\), since each large salad brings in $4 of profit and each small salad brings in $2.

The constraints are based on the availability of lettuce and sauce. For lettuce, a large salad requires 45g, and a small salad requires 30g, with a total of 1500g available. This gives us the constraint \(45L + 30S \leq 1500\). For sauce, with 10g required for each large salad and 7g for each small salad, and 1200g available, we have \(10L + 7S \leq 1200\).

Additionally, \(L\) and \(S\) must be non-negative since the shop cannot make a negative number of salads.

Now, let's translate this into Gurobi code in Python:

```python
from gurobipy import *

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

# Define decision variables
L = m.addVar(vtype=GRB.INTEGER, name="Large_Salads")
S = m.addVar(vtype=GRB.INTEGER, name="Small_Salads")

# Set the objective function: Maximize profit
m.setObjective(4*L + 2*S, GRB.MAXIMIZE)

# Add constraints
m.addConstr(45*L + 30*S <= 1500, "Lettuce_Constraint")
m.addConstr(10*L + 7*S <= 1200, "Sauce_Constraint")

# Optimize the model
m.optimize()

# Print out the results
for v in m.getVars():
    print(f"{v.varName}: {v.x}")
print(f"Objective: {m.objVal}")

```