You could use UMeshComponent from which both UStaticMeshComponent and USkeletalMeshComponent derive.
TSet<UMeshComponent*> MeshComponents;
if (StaticMeshComponents.Num())
{
    for (UStaticMeshComponent* sm : StaticMeshComponents)
    {
        MeshComponents.Add(sm);
    }
}
else
{
    for (USkeletalMeshComponent* sm : SkeletalMeshComponents)
    {
        MeshComponents.Add(sm);
    }
}
for (UMeshComponent* mc : MeshComponents)
{
	if (UMaterialInterface* DefaultMaterial = mc->GetMaterial(IndexOfMaterialToMakeDynamic))
	{
		DynamicMaterialInstance = UMaterialInstanceDynamic::Create(DefaultMaterial, this);
		mc->SetMaterial(IMaterialDynamic, DynamicMaterialInstance);
	}
}
Runtime DataTable : Import and export game data to and from CSV or Google Sheets while your game is running!
GSheets Operator : Interface with Google Sheets, add new and delete old sheets, edit columns and rows, make in-game spreadsheets and more!
easyCSV : Read data from any CSV and put them in an easy-to-access string map!
iTween : Free, smooth, procedural object animation