(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();
})();
Assign Filtered SC Tasks to Me
Hint: Bulk-assign SC Tasks matching a query to yourself, with a progress popup
Trigger: \assignmytasks