To convert the given natural language description of an optimization problem into a symbolic representation and subsequently into Gurobi code, we first need to identify the variables, objective function, and constraints based on the provided information.

### Variables:
- Let `x0` represent the number of scissors.
- Let `x1` represent the number of color printers.

### Objective Function:
The goal is to minimize the total cost, which can be represented as `9.7*x0 + 3.74*x1`.

### Constraints:
Based on the problem description, we have several constraints:

1. **Cost Constraint**: The total cost should not exceed $105 and must be at least $45. This can be represented by two inequalities: `9.7*x0 + 19*x1 >= 45` (minimum spend) and `9.7*x0 + 19*x1 <= 105` (maximum spend).
2. **Usefulness Rating Constraint**: The total usefulness rating should be at least 119 but not more than 319. This translates to: `30*x0 + 7*x1 >= 119` (minimum rating) and `30*x0 + 7*x1 <= 319` (maximum rating).
3. **Sustainability Score Constraint**: The total sustainability score must be at least 36 but not more than 83. Thus, we have: `21*x0 + 23*x1 >= 36` (minimum score) and `21*x0 + 23*x1 <= 83` (maximum score).
4. **Scissors and Color Printers Balance Constraint**: The constraint `-7*x0 + 7*x1 >= 0` ensures a balance between scissors and color printers.
5. **Integer Constraints**: Both `x0` and `x1` must be integers, as they represent the number of items.

### Symbolic Representation:
```json
{
    'sym_variables': [('x0', 'scissors'), ('x1', 'color printers')],
    'objective_function': '9.7*x0 + 3.74*x1',
    'constraints': [
        '9.7*x0 + 19*x1 >= 45',
        '9.7*x0 + 19*x1 <= 105',
        '30*x0 + 7*x1 >= 119',
        '30*x0 + 7*x1 <= 319',
        '21*x0 + 23*x1 >= 36',
        '21*x0 + 23*x1 <= 83',
        '-7*x0 + 7*x1 >= 0'
    ]
}
```

### Gurobi Code:
```python
from gurobipy import *

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

# Define variables
x0 = m.addVar(vtype=GRB.INTEGER, name="scissors")
x1 = m.addVar(vtype=GRB.INTEGER, name="color_printers")

# Set objective function
m.setObjective(9.7*x0 + 3.74*x1, GRB.MINIMIZE)

# Add constraints
m.addConstr(9.7*x0 + 19*x1 >= 45, "min_cost")
m.addConstr(9.7*x0 + 19*x1 <= 105, "max_cost")
m.addConstr(30*x0 + 7*x1 >= 119, "min_usefulness")
m.addConstr(30*x0 + 7*x1 <= 319, "max_usefulness")
m.addConstr(21*x0 + 23*x1 >= 36, "min_sustainability")
m.addConstr(21*x0 + 23*x1 <= 83, "max_sustainability")
m.addConstr(-7*x0 + 7*x1 >= 0, "balance")

# Optimize the model
m.optimize()

# Print solution
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Scissors: {x0.x}")
    print(f"Color Printers: {x1.x}")
else:
    print("No optimal solution found")
```