Why Extract Field Mappings?
If you work with Qualtrics Dashboard Data, you know that managing field mappings across multiple data sources can be challenging. Manually documenting which fields are mapped to which sources is time-consuming and error-prone.
This guide provides a simple browser-based method to automatically extract all your field mappings in seconds:
- Extract field types (Date, Text Set, Number Set, Open Text, etc.)
- Capture full field names (no truncation)
- Get all data source mappings in one export
- See which fields are mapped vs "Not mapped" for each source
- Export to CSV, Excel, or JSON format
- Works with any number of data sources (2, 3, 10+)
How to Extract Your Field Mappings
This is the fastest method and works directly in your browser while viewing the Qualtrics Dashboard Data page.
Watch the 30-Second Demo
Navigate to Dashboard Data
In Qualtrics, go to your Dashboard and navigate to:
Settings → Dashboard Data
Make sure the field mapping grid is visible on your screen.
Open Browser Console
Right-click on the first field mapping row in the Dashboard Data grid (where you see "Date", "Text Set", etc.)
Select "Inspect" or "Inspect Element" from the menu
In the developer tools that appear, click on the "Console" tab
Copy and Run the Script
Copy the script below by clicking the "Copy Script" button:
/**
* Qualtrics Dashboard Field Extractor
* Extracts Field Type, Field Name, and ALL Data Source Mappings
*/
(function() {
console.log('=== Qualtrics Field Extractor Started ===');
function getDataSourceNames() {
const sourceNames = [];
const sourceContainers = document.querySelectorAll('.source-menu-container');
console.log(`Found ${sourceContainers.length} source containers`);
sourceContainers.forEach((container, index) => {
try {
const labelContainer = container.querySelector('.source-label-container');
if (labelContainer) {
const sourceName = labelContainer.textContent.trim();
sourceNames.push({
index: index,
name: sourceName
});
console.log(`Source ${index + 1}: ${sourceName}`);
}
} catch (error) {
console.warn(`Error getting source name ${index}:`, error);
sourceNames.push({
index: index,
name: `Source ${index + 1}`
});
}
});
return sourceNames;
}
function extractFieldData() {
const fields = [];
const dataSources = getDataSourceNames();
console.log(`\nData Sources Found: ${dataSources.length}`);
dataSources.forEach(ds => console.log(` - ${ds.name}`));
const fieldRows = document.querySelectorAll('li.grid-field-info');
console.log(`\nFound ${fieldRows.length} field rows\n`);
fieldRows.forEach((row, index) => {
try {
let fieldType = 'Unknown';
let fieldName = 'Unknown';
const sourceMappings = {};
const fieldTypeElement = row.querySelector('field-type .type-text');
if (fieldTypeElement) {
fieldType = fieldTypeElement.textContent.trim();
}
const fieldNameElement = row.querySelector('field-name .no-wrap-ellipsis-text.no-input');
if (fieldNameElement) {
fieldName = fieldNameElement.textContent.trim();
}
const sourceFields = row.querySelectorAll('.sources-side-row');
sourceFields.forEach((sourceField, sourceIndex) => {
try {
let mappingText = '';
const notMappedElement = sourceField.querySelector('[data-key="NOT_MAPPED"]');
if (notMappedElement) {
mappingText = 'Not mapped';
} else {
const sourceNameSpan = sourceField.querySelector('.source-field-name span');
if (sourceNameSpan) {
const allSpans = sourceField.querySelectorAll('.source-field-name span');
for (let span of allSpans) {
const text = span.textContent.trim();
if (text && text !== 'Not mapped') {
mappingText = text;
break;
}
}
}
}
const sourceName = dataSources[sourceIndex] ? dataSources[sourceIndex].name : `Source ${sourceIndex + 1}`;
sourceMappings[sourceName] = mappingText || 'Not mapped';
} catch (error) {
console.warn(`Error processing source ${sourceIndex} for field ${index}:`, error);
const sourceName = dataSources[sourceIndex] ? dataSources[sourceIndex].name : `Source ${sourceIndex + 1}`;
sourceMappings[sourceName] = 'Error';
}
});
if (fieldType !== 'Unknown' || fieldName !== 'Unknown') {
const fieldData = {
index: index + 1,
fieldType: fieldType,
fieldName: fieldName,
...sourceMappings
};
fields.push(fieldData);
if ((index + 1) % 5 === 0) {
console.log(`Processed ${index + 1} fields...`);
}
}
} catch (error) {
console.warn(`Error processing row ${index}:`, error);
}
});
return fields;
}
function displayAsTable(fields) {
console.log('\n=== EXTRACTED FIELDS ===\n');
console.table(fields);
console.log(`\nTotal fields extracted: ${fields.length}`);
}
function convertToCSV(fields) {
if (fields.length === 0) return '';
const allKeys = new Set();
fields.forEach(field => {
Object.keys(field).forEach(key => allKeys.add(key));
});
const keys = Array.from(allKeys).filter(key => key !== 'index');
const orderedHeaders = ['fieldType', 'fieldName', ...keys.filter(h => h !== 'fieldType' && h !== 'fieldName')];
const headerRow = orderedHeaders.map(h => {
if (h === 'fieldType') return 'Field Type';
if (h === 'fieldName') return 'Field Name';
return h;
}).map(h => `"${h}"`).join(',');
const dataRows = fields.map(field => {
return orderedHeaders.map(key => {
const value = field[key] || '';
return `"${String(value).replace(/"/g, '""')}"`;
}).join(',');
}).join('\n');
return headerRow + '\n' + dataRows;
}
function downloadCSV(csv, filename = 'qualtrics_fields.csv') {
const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });
const link = document.createElement('a');
const url = URL.createObjectURL(blob);
link.setAttribute('href', url);
link.setAttribute('download', filename);
link.style.visibility = 'hidden';
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
console.log(`✓ Downloaded: ${filename}`);
}
function copyToClipboard(text) {
const textarea = document.createElement('textarea');
textarea.value = text;
textarea.style.position = 'fixed';
textarea.style.opacity = '0';
document.body.appendChild(textarea);
textarea.select();
try {
document.execCommand('copy');
console.log('✓ CSV data copied to clipboard!');
return true;
} catch (err) {
console.error('Failed to copy to clipboard:', err);
return false;
} finally {
document.body.removeChild(textarea);
}
}
console.log('Starting extraction...\n');
const extractedFields = extractFieldData();
if (extractedFields.length === 0) {
console.error('❌ No fields found! Make sure you are on the Qualtrics Dashboard Data mapping page.');
return;
}
displayAsTable(extractedFields);
const csvData = convertToCSV(extractedFields);
window.qualtricsFieldData = extractedFields;
window.qualtricsFieldCSV = csvData;
window.downloadQualtricsCSV = function(filename) {
downloadCSV(csvData, filename || 'qualtrics_fields.csv');
};
window.copyQualtricsCSV = function() {
return copyToClipboard(csvData);
};
window.getQualtricsJSON = function() {
return JSON.stringify(extractedFields, null, 2);
};
window.downloadQualtricsJSON = function(filename) {
const json = JSON.stringify(extractedFields, null, 2);
const blob = new Blob([json], { type: 'application/json' });
const link = document.createElement('a');
const url = URL.createObjectURL(blob);
link.setAttribute('href', url);
link.setAttribute('download', filename || 'qualtrics_fields.json');
link.style.visibility = 'hidden';
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
console.log(`✓ Downloaded: ${filename || 'qualtrics_fields.json'}`);
};
console.log('\n=== ACTIONS AVAILABLE ===');
console.log('1. Download CSV: downloadQualtricsCSV()');
console.log('2. Download JSON: downloadQualtricsJSON()');
console.log('3. Copy CSV: copyQualtricsCSV()');
console.log('4. View data: qualtricsFieldData');
console.log('5. View CSV: qualtricsFieldCSV');
console.log('6. View JSON: getQualtricsJSON()');
console.log('\n✓ Extraction complete! Use the commands above to export the data.');
})();
Paste the script into the console and press Enter
View the Results
The script will display a table showing all extracted fields in the console.
Export Your Data
Use any of these commands in the console to export:
downloadQualtricsCSV() // Download as CSV filedownloadQualtricsJSON() // Download as JSON filecopyQualtricsCSV() // Copy to clipboard
Understanding Your Output
What Gets Extracted
The extraction captures complete information about your Dashboard Data configuration:
| Field Type | Field Name | Source 1 Name | Source 2 Name |
|---|---|---|---|
| Date | Survey Metadata - Start Date | Survey Metadata - Start Date | Survey Metadata - Start Date |
| Number Set | Q1 - How likely are you to recommend... | Q1 - How likely are you to recommend... | Not mapped |
| Open Text | Q2 - why did you give this score? | Q2 - why did you give this score? | Not mapped |
| Number Set | Embedded Data - NPS | NPS | Not mapped |
Field Types You'll See
- Date - Date/time fields
- Text Value - Single text values
- Text Set - Categorical text fields
- Numeric Value - Numeric measurements
- Number Set - Categorical numeric fields
- Open Text - Free-form text responses
Source Mappings
For each data source in your dashboard, you'll see:
- The exact field name from that source
- "Not mapped" if the field isn't connected to that source
- Different field names if sources use different naming conventions
Troubleshooting
Problem: "No fields found" message
- Make sure you're on the Dashboard Data page with the field grid visible
- Try scrolling down to load all fields before running the script
- Refresh the page and try again
Problem: Download button doesn't work
- Use
copyQualtricsCSV()to copy to clipboard instead - Paste into Excel, Google Sheets, or a text editor
- Check if your browser is blocking downloads
Problem: Script doesn't run or shows errors
- Make sure you copied the entire script
- Clear the console and try again
- Refresh the Qualtrics page and run the script again
Advanced Usage
Filtering Specific Sources
After running the extraction, you can filter the data in the console:
// Get only fields mapped to a specific sourcequaltricsFieldData.filter(f => f['Source Name'] !== 'Not mapped')
Custom Export Filename
downloadQualtricsCSV('my_dashboard_fields.csv')downloadQualtricsJSON('my_dashboard_fields.json')
Use Cases
Documentation
Create comprehensive documentation of your dashboard configuration for:
- Onboarding new team members
- Audit trails and compliance
- Project handoffs
- Version control and change tracking
Migration Planning
Plan data source migrations by:
- Identifying which fields are mapped vs unmapped
- Understanding field naming differences across sources
- Creating mapping specifications for new sources
- Validating that all required fields are configured
Analysis & Optimization
- Identify unused fields across data sources
- Find inconsistencies in field naming
- Spot gaps in data source coverage
- Plan field consolidation strategies
Backup & Recovery
- Create backups of your dashboard configuration
- Track changes over time
- Recover from accidental deletions
- Compare configurations across environments
Need Help with Qualtrics Survey Conversion?
While this tool extracts dashboard mappings, if you need to convert surveys between formats, check out Pirai AI's survey automation platform. We help researchers convert Word, PDF, and Excel questionnaires into Qualtrics and 19+ other platforms in minutes.