Skip to content

Instantly share code, notes, and snippets.

@Sunil02kumar
Created December 23, 2023 10:38
Show Gist options
  • Save Sunil02kumar/1c1060b4931d9c0f01b2a33d8c7c639e to your computer and use it in GitHub Desktop.
Save Sunil02kumar/1c1060b4931d9c0f01b2a33d8c7c639e to your computer and use it in GitHub Desktop.
Export all Custom Metadata Records in CSV file using Apex
public class SK_CustomMetadataUtility {
public static void exportAllCMRecordsInCSV(){
Map<string,List<string>> objToFieldsMap = new Map<string,List<string>>();
Map<String, Schema.SObjectType> schemaMap = Schema.getGlobalDescribe();
for(String ss1: schemaMap.keyset()){
Schema.SObjectType objToken=schemaMap.get(ss1);
//find details about sobject
Schema.DescribeSObjectResult objDescribe=objToken.getdescribe();
string objAPIName= string.valueof(objDescribe.getName());
//filter object for which APi name ends with _mdt
//filter manage package objects as they contain __ twice in their API name
if(objAPIName.endsWith('__mdt') && objAPIName.countMatches('__')==1){
//system.debug('***custom metadata name:'+objAPIName);
objToFieldsMap.put(objAPIName,new List<string>());
//finding all fields of sobjects
Map<String, Schema.SObjectField> fieldMap = objDescribe.fields.getMap();
objToFieldsMap.get(objAPIName).add('DeveloperName');
objToFieldsMap.get(objAPIName).add('MasterLabel');
for(String ss:Fieldmap.keyset()){
Schema.DescribeFieldResult fd=fieldMap.get(ss).getDescribe();
string fieldAPIName=string.valueof(fd.getName());
//check if field is custom or not
if(fd.isCustom()){
objToFieldsMap.get(objAPIName).add(fieldAPIName);
}
}
}
}
system.debug('**objToFieldsMap size:'+objToFieldsMap.size());
system.debug('**objToFieldsMap:'+objToFieldsMap);
integer count =0;
string csvString = 'Name,DeveloperName,MasterLabel,Fields\n';
for(string objAPIName: objToFieldsMap.keyset()){
if(count<100){ //here we are restricting script to export only 100 custom metadata records
Map<string,List<string>> developerNameWithFieldValuesMap= new Map<string,List<string>>();
String qryString = 'SELECT '+ string.join(objToFieldsMap.get(objAPIName),',') +' From '+objAPIName;
system.debug('**qryString-'+objAPIName+'-:'+qryString);
for(sobject sb: Database.query(qryString)){
string developerName= string.valueof(sb.get('developerName'));
developerNameWithFieldValuesMap.put(developerName,new List<string>());
for(string field: objToFieldsMap.get(objAPIName)){
if(sb.get(field)!=null && field!='developerName' && field!='MasterLabel'){
//Fields coulm will contains Field API and its corresponding value
//here &SK& is delimiter to differentiate the API name with value
developerNameWithFieldValuesMap.get(developerName).add(field+'&SK&'+sb.get(field));
}
}
csvString = csvString + objAPIName+','+string.valueof(sb.get('DeveloperName')).escapeCsv()+','+ string.valueof(sb.get('MasterLabel')).escapeCSV()+','+ string.join(developerNameWithFieldValuesMap.get(developerName),',').escapecsv()+'\n';
}
count= +1;
}
}
Messaging.EmailFileAttachment csvAttc = new Messaging.EmailFileAttachment();
blob csvBlob = Blob.valueOf(csvString);
string csvname= 'Custom metadata records.csv';
csvAttc.setFileName(csvname);
csvAttc.setBody(csvBlob);
Messaging.SingleEmailMessage email =new Messaging.SingleEmailMessage();
String[] toAddresses = new list<string> {UserInfo.getUserEmail()};
String subject = 'Custom metadata records -'+system.now();
email.setSubject(subject);
email.setToAddresses( toAddresses );
email.setPlainTextBody(subject);
email.setFileAttachments(new Messaging.EmailFileAttachment[]{csvAttc});
Messaging.SendEmailResult [] r = Messaging.sendEmail(new Messaging.SingleEmailMessage[] {email});
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment