The database's built-in catalog views provide the information to do this. Try this query:
SELECT 'GRANT ' + dp.permission_name collate latin1_general_cs_as
+ ' ON ' + s.name + '.' + o.name + ' TO ' + dpr.name
FROM sys.database_permissions AS dp
INNER JOIN sys.objects AS o ON dp.major_id=o.object_id
INNER JOIN sys.schemas AS s ON o.schema_id = s.schema_id
INNER JOIN sys.database_principals AS dpr ON dp.grantee_principal_id=dpr.principal_id
WHERE dpr.name NOT IN ('public','guest')
-- AND permission_name='EXECUTE'
This will spit out a bunch of GRANT commands for each of the permissions in the database. From this, you can copy-and-paste them into another query window and execute, to generate the same permissions that were in place on the original. For example:
GRANT EXECUTE ON Exposed.EmployeePunchoutReservationRetrieve TO CustomerAgentRole
GRANT EXECUTE ON Exposed.EmployeePunchoutReservationStore TO CustomerAgentRole
GRANT EXECUTE ON Exposed.EmployeePunchoutSendOrderLogStore TO CustomerAgentRole
GRANT EXECUTE ON Exposed.EmployeeReportSubscriptions TO CustomerAgentRole
Note the bottom line, commented out, that's filtering on permission_name. Un-commenting that line will cause the query to only spit out the EXECUTE permissions (i.e., those for stored procedures).