Update Multiple Column Values

Update several column values at once for better performance and efficiency.

Finding 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"
end

Output:

✓ Updated multiple columns for: Marketing Campaign
Performance 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"
end

Get 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
end

Error 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"
end

Complete 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
Edit this page
Last updated