Update Multiple Column Values
Update several column values at once for better performance and efficiency.
Finding Column IDs
Column IDs are Board-Specific
Before updating column values, you must find your board's actual column IDs. See the Items Create guide for how to query column IDs.
Basic Multiple Update
Update several columns in a single API call:
require "monday_ruby"
require "json"
Monday.configure do |config|
config.token = ENV["MONDAY_TOKEN"]
end
client = Monday::Client.new
# ⚠️ Replace all column IDs with your board's actual column IDs
column_values = {
status: { label: "Working on it" }, # Your status column ID
text: "High priority task", # Your text column ID
numbers: 85 # Your numbers column ID
}
response = client.column.change_multiple_values(
args: {
board_id: 1234567890,
item_id: 987654321,
column_values: JSON.generate(column_values)
}
)
if response.success?
item = response.body.dig("data", "change_multiple_column_values")
puts "✓ Updated multiple columns for: #{item['name']}"
else
puts "✗ Failed to update columns"
endOutput:
✓ Updated multiple columns for: Marketing CampaignPerformance Benefit
Updating multiple columns at once is more efficient than making separate API calls for each column. It also ensures atomicity - all updates succeed or fail together.
Update Mixed Column Types
Combine simple and complex column types:
# ⚠️ Replace all column IDs with your board's actual column IDs
column_values = {
status: { # Status column
label: "Done"
},
text: "Completed successfully", # Text column
date4: { # Date column
date: "2024-12-31",
time: "17:00:00"
},
people: { # People column
personsAndTeams: [
{ id: 12345678, kind: "person" } # Replace with actual user ID
]
},
numbers: 100, # Numbers column
checkbox: { # Checkbox column
checked: "true"
}
}
response = client.column.change_multiple_values(
args: {
board_id: 1234567890,
item_id: 987654321,
column_values: JSON.generate(column_values)
}
)Update Item with Full Details
Set all relevant columns when creating or updating an item:
def update_task_complete(client, board_id, item_id)
# ⚠️ Replace all column IDs with your board's actual column IDs
column_values = {
status: {
label: "Done"
},
date4: {
date: Date.today.to_s
},
text: "Task completed on time",
numbers: 100 # 100% complete
}
response = client.column.change_multiple_values(
args: {
board_id: board_id,
item_id: item_id,
column_values: JSON.generate(column_values)
}
)
if response.success?
item = response.body.dig("data", "change_multiple_column_values")
puts "✓ Task marked complete: #{item['name']}"
true
else
puts "✗ Failed to update task"
false
end
end
# Usage
update_task_complete(client, 1234567890, 987654321)Bulk Update Multiple Items
Update the same columns for multiple items:
def bulk_update_items(client, board_id, item_ids, column_values)
updated_count = 0
item_ids.each do |item_id|
response = client.column.change_multiple_values(
args: {
board_id: board_id,
item_id: item_id,
column_values: JSON.generate(column_values)
}
)
if response.success?
item = response.body.dig("data", "change_multiple_column_values")
updated_count += 1
puts "✓ Updated: #{item['name']}"
else
puts "✗ Failed to update item #{item_id}"
end
sleep(0.3) # Rate limiting
end
updated_count
end
# Usage: Mark multiple tasks as complete
# ⚠️ Replace column IDs with your actual column IDs
item_ids = [987654321, 987654322, 987654323]
values = {
status: { label: "Done" },
date4: { date: Date.today.to_s },
text: "Batch completed"
}
count = bulk_update_items(client, 1234567890, item_ids, values)
puts "\n✓ Updated #{count} items"Update with Conditional Logic
Update columns based on current values or conditions:
def update_if_in_progress(client, board_id, item_id)
# First, get current item
query_response = client.item.query(
args: { ids: [item_id] },
select: [
"id",
"name",
{
column_values: ["id", "text"]
}
]
)
return false unless query_response.success?
item = query_response.body.dig("data", "items", 0)
status = item["column_values"].find { |cv| cv["id"] == "status" }
# Only update if status is "In Progress"
return false unless status&.dig("text") == "Working on it"
# Update to next stage
# ⚠️ Replace column IDs with your actual column IDs
column_values = {
status: { label: "Review" },
text: "Ready for review",
date4: { date: Date.today.to_s }
}
update_response = client.column.change_multiple_values(
args: {
board_id: board_id,
item_id: item_id,
column_values: JSON.generate(column_values)
}
)
update_response.success?
end
# Usage
if update_if_in_progress(client, 1234567890, 987654321)
puts "✓ Task moved to review"
else
puts "Task not in progress or update failed"
endGet Updated Column Values
Retrieve updated values after the change:
response = client.column.change_multiple_values(
args: {
board_id: 1234567890,
item_id: 987654321,
column_values: JSON.generate({
status: { label: "Done" }, # ⚠️ Your column IDs
text: "Completed",
numbers: 100
})
},
select: [
"id",
"name",
"state",
{
column_values: ["id", "text", "type", "value"]
}
]
)
if response.success?
item = response.body.dig("data", "change_multiple_column_values")
puts "Updated: #{item['name']}"
puts "\nColumn Values:"
item["column_values"].each do |col_val|
next if col_val["text"].nil? || col_val["text"].empty?
puts " • #{col_val['id']}: #{col_val['text']} (#{col_val['type']})"
end
endError Handling
Handle update errors gracefully:
def update_columns_safe(client, board_id, item_id, column_values)
response = client.column.change_multiple_values(
args: {
board_id: board_id,
item_id: item_id,
column_values: JSON.generate(column_values)
}
)
if response.success?
item = response.body.dig("data", "change_multiple_column_values")
puts "✓ Updated: #{item['name']}"
true
else
puts "✗ Failed to update columns"
puts " Status: #{response.status}"
if response.body["errors"]
response.body["errors"].each do |error|
puts " Error: #{error['message']}"
end
end
false
end
rescue Monday::AuthorizationError
puts "✗ Invalid API token"
false
rescue Monday::InvalidRequestError => e
puts "✗ Invalid request: #{e.message}"
false
rescue Monday::Error => e
puts "✗ API error: #{e.message}"
false
end
# Usage
values = {
status: { label: "Done" },
text: "Task complete"
}
success = update_columns_safe(client, 1234567890, 987654321, values)Clear Multiple Columns
Remove values from several columns at once:
# ⚠️ Replace column IDs with your actual column IDs
column_values = {
status: {}, # Empty object clears the value
text: "", # Empty string for text columns
date4: {},
people: {}
}
response = client.column.change_multiple_values(
args: {
board_id: 1234567890,
item_id: 987654321,
column_values: JSON.generate(column_values)
}
)
if response.success?
puts "✓ Multiple columns cleared"
endComplete Example
Update item with full workflow transition:
require "monday_ruby"
require "dotenv/load"
require "json"
require "date"
Monday.configure do |config|
config.token = ENV["MONDAY_TOKEN"]
end
client = Monday::Client.new
def transition_to_qa(client, board_id, item_id, assignee_id)
# IMPORTANT: Replace all column IDs with your board's actual column IDs
column_values = {
status: { # ⚠️ Your status column ID
label: "QA Testing"
},
people: { # ⚠️ Your people column ID
personsAndTeams: [
{ id: assignee_id, kind: "person" }
]
},
date4: { # ⚠️ Your date column ID
date: (Date.today + 3).to_s # Due in 3 days
},
text: "Moved to QA for testing", # ⚠️ Your text column ID
numbers: 80 # ⚠️ Your numbers column ID (80% complete)
}
response = client.column.change_multiple_values(
args: {
board_id: board_id,
item_id: item_id,
column_values: JSON.generate(column_values)
},
select: [
"id",
"name",
{
column_values: ["id", "text"]
}
]
)
if response.success?
item = response.body.dig("data", "change_multiple_column_values")
puts "\n✓ Item Transitioned to QA\n#{'=' * 50}"
puts "Item: #{item['name']}"
puts "Updated Values:"
item["column_values"].each do |col|
next if col["text"].nil? || col["text"].empty?
puts " • #{col['id']}: #{col['text']}"
end
puts "#{'=' * 50}"
true
else
puts "✗ Failed to transition item"
false
end
end
# Usage
success = transition_to_qa(
client,
1234567890, # board_id
987654321, # item_id
12345678 # assignee_id - replace with actual user ID
)Output:
✓ Item Transitioned to QA
==================================================
Item: Feature Development
Updated Values:
• status: QA Testing
• people: John Doe
• date4: 2024-12-15
• text: Moved to QA for testing
• numbers: 80
==================================================Best Practices
Do's
- ✅ Update multiple related columns together
- ✅ Use JSON.generate for all column values
- ✅ Include rate limiting delays in loops
- ✅ Verify column IDs before updating
- ✅ Handle errors appropriately
Don'ts
- ❌ Update columns one-by-one when you can batch them
- ❌ Hardcode column IDs without verification
- ❌ Skip error handling
- ❌ Update too many items without rate limiting
- ❌ Mix up column IDs between boards