📤 Built a useful command? Submit it here — we'll review & add it to the library.

Assign Filtered SC Tasks to Me

Hint: Bulk-assign SC Tasks matching a query to yourself, with a progress popup

Trigger: \assignmytasks

(function() {
  // CONFIG
  // Encoded sysparm_query for the sc_tasks you want to grab.
  // Default: active, state = Open (1), currently unassigned.
  var QUERY = 'active=true^state=1^assigned_toISEMPTY';
  var NEW_STATE = '-5'; // Pending. Use '1' (Open) or '2' (Work In Progress) if you prefer.

  var token = window.g_ck || document.querySelector('input[name="sysparm_ck"]')?.value || '';
  var myUserId = (window.g_user && g_user.userID) ? g_user.userID : '';
  if (!myUserId) { alert('Could not detect the current user.'); return; }

  var overlay = document.createElement('div');
  Object.assign(overlay.style, {
    position: 'fixed', top: '0', left: '0', width: '100%', height: '100%',
    background: 'rgba(0,0,0,0.6)', zIndex: '999999', display: 'flex',
    alignItems: 'center', justifyContent: 'center'
  });
  var box = document.createElement('div');
  Object.assign(box.style, {
    background: '#1a1a2e', color: '#fff', borderRadius: '12px',
    padding: '32px 40px', minWidth: '420px', maxWidth: '560px',
    boxShadow: '0 8px 32px rgba(0,0,0,0.5)', fontFamily: 'sans-serif'
  });
  box.innerHTML =
    '<div style="font-size:18px;font-weight:700;margin-bottom:16px;">Assigning SC Tasks</div>' +
    '<div id="sn-sc-status" style="font-size:14px;margin-bottom:12px;color:#a0aec0;">Fetching tasks...</div>' +
    '<div style="background:#2d3748;border-radius:8px;height:12px;margin-bottom:12px;overflow:hidden;">' +
    '<div id="sn-sc-bar" style="height:100%;width:0%;background:#0070d2;transition:width 0.3s ease;border-radius:8px;"></div></div>' +
    '<div id="sn-sc-count" style="font-size:13px;color:#68d391;margin-bottom:8px;"></div>' +
    '<div id="sn-sc-log" style="font-size:12px;color:#a0aec0;max-height:200px;overflow-y:auto;line-height:1.8;"></div>';
  overlay.appendChild(box);
  document.body.appendChild(overlay);

  function setStatus(msg) { document.getElementById('sn-sc-status').textContent = msg; }
  function setProgress(current, total) {
    var pct = Math.round((current / total) * 100);
    document.getElementById('sn-sc-bar').style.width = pct + '%';
    document.getElementById('sn-sc-count').textContent = current + ' / ' + total + ' processed (' + pct + '%)';
  }
  function addLog(msg, color) {
    var log = document.getElementById('sn-sc-log');
    var line = document.createElement('div');
    line.style.color = color || '#a0aec0';
    line.textContent = msg;
    log.appendChild(line);
    log.scrollTop = log.scrollHeight;
  }
  function finish(success, failed, failedNums) {
    setStatus('Done. ' + success + ' tasks assigned.');
    addLog('Success: ' + success + '   Failed: ' + failed, '#68d391');
    if (failedNums.length) addLog('Failed: ' + failedNums.join(', '), '#fc8181');
    var btnRow = document.createElement('div');
    btnRow.style.cssText = 'margin-top:16px;display:flex;gap:10px;';
    var refreshBtn = document.createElement('button');
    refreshBtn.textContent = 'Refresh Page';
    Object.assign(refreshBtn.style, { background:'#0070d2', color:'#fff', border:'none', borderRadius:'6px', padding:'8px 16px', cursor:'pointer', fontSize:'13px' });
    refreshBtn.onclick = function() { location.reload(); };
    var closeBtn = document.createElement('button');
    closeBtn.textContent = 'Close';
    Object.assign(closeBtn.style, { background:'#4a5568', color:'#fff', border:'none', borderRadius:'6px', padding:'8px 16px', cursor:'pointer', fontSize:'13px' });
    closeBtn.onclick = function() { overlay.remove(); };
    btnRow.appendChild(refreshBtn);
    btnRow.appendChild(closeBtn);
    box.appendChild(btnRow);
  }

  var xhr = new XMLHttpRequest();
  xhr.open('GET', '/api/now/table/sc_task?sysparm_query=' + encodeURIComponent(QUERY) + '&sysparm_fields=sys_id,number&sysparm_limit=1000', false);
  xhr.setRequestHeader('Accept', 'application/json');
  xhr.setRequestHeader('X-UserToken', token);
  xhr.send();

  var records = JSON.parse(xhr.responseText).result;
  if (!records || records.length === 0) { setStatus('No tasks found matching the filter.'); return; }

  setStatus('Found ' + records.length + ' tasks. Processing...');
  addLog('Found ' + records.length + ' sc_tasks to assign', '#90cdf4');

  var success = 0, failed = 0, i = 0, failedNums = [];
  function processNext() {
    if (i >= records.length) { finish(success, failed, failedNums); return; }
    var rec = records[i]; i++;
    var patch = new XMLHttpRequest();
    patch.open('PATCH', '/api/now/table/sc_task/' + rec.sys_id, true);
    patch.setRequestHeader('Content-Type', 'application/json');
    patch.setRequestHeader('Accept', 'application/json');
    patch.setRequestHeader('X-UserToken', token);
    patch.onreadystatechange = function() {
      if (patch.readyState !== 4) return;
      if (patch.status === 200) { success++; addLog(rec.number + ' assigned', '#68d391'); }
      else { failed++; failedNums.push(rec.number); addLog(rec.number + ' failed (HTTP ' + patch.status + ')', '#fc8181'); }
      setProgress(i, records.length);
      processNext();
    };
    patch.send(JSON.stringify({ assigned_to: myUserId, state: NEW_STATE }));
  }
  setProgress(0, records.length);
  processNext();
})();