Gorav Seth

Salesforce MVP (HOF) | Permaculture designer

Read this first

flow rich text email with list of records

now that we have rich text emails in flow, its pretty simple to create a nice looking email that includes a list of records. throw it in a scheduled flow and you have some serious magic potential.

my use case : send opportunity owner a list of their open opportunities that have passed the close date.

here is the full flow

will break down each piece below

Schedule : the flow is scheduled on the user object, and fires for all users where isActive = true

getOpportunities: get all opportunities, where ownerid = $record.id and closeDate is less than $flow.current date

getReport: In the email, I include a link to a report so they can edit it using inline editing for reports (while I dream of the day when the engineering gods allow editing of currency fields in reports). So instead of hard coding that link, I query for the report, since i built in sandbox, and some say you shouldn’t...

Continue reading →

bulk deleting reports from salesforce

i swear i used to have a way of deleting reports via the metadata api in bulk many years ago but i could not get that to work

this works:

query reports via workbench to csv

run delete - but not via bulk api - as delete operation not supported on bulk api

so you can do about 1-2 k at a time, vs the native interface which gives you 250, so its better

works for private reports also by adding using SCOPE allPrivate (and ensuring you have the perms to do so) see : https://help.salesforce.com/s/articleView?id=000317823&type=1

works for reports

SELECT Id, Owner.Name FROM Report USING SCOPE allPrivate WHERE Owner.IsActive = false limit 1200

and for dashboards

SELECT Id, RunningUser.Name, Title FROM Dashboard USING SCOPE allPrivate WHERE RunningUser.IsActive = false limit 1200

Continue reading →

truncating case description in case assignment email

sure its 2022 and we have force lightning powers that emperor palpatine himself could only dream of, but if you want a good case assignment email, you need visualforce.

i rolled up a nice visualforce email template years ago that includes the case commments - sorted by date!

but the template includes case description, and sometimes people initiate a case via a gigantic email, and all of that email thread would come through on the visualforce assignment email

so i just need to truncate the length of the description.

the original
<apex:outputField value="{!relatedTo.Description}"></apex:outputField>

tried inserting a left in there, could not get anything to save

apex:outputText would lose the formatting, regardless of how I tried to work with it, like


I even tried abbreviating the string in a vf component, but outputText would lose the...

Continue reading →

Marking fields used in Integrations

Another way to mark fields used in Integrations.

2 years back I conjured up this approach to prevent deletion of fields used in integrations.

I still needed a better way to flag these fields. Description field is pretty good, but wanted to add the picklist value “Integrated” to the field usage picklist.

Turns out that you can only do this via the metadata api, so this is how to do it

  • create a file named package.xml with the following content
<Package xmlns="http://soap.sforce.com/2006/04/metadata">
  • login to workbench.developerforce.com and go to migration - retrieve
  • upload that package.xml file
  • click ‘download zip file’

this downloads the existing values for Field Usage picklist, in case someone has customized it before you!

  • Unzip the file
  • Edit the file...

Continue reading →

Single Sign On from Production to Sandbox

Make it oh-so-easy for users to test changes in a sandbox by seamlessly logging in from production!

With this approach, your users can login to a sandbox directly from the app launcher in production. This requires no code, just clicks, and you can control exactly which users can use this option via profiles or permission sets.

Here is a gif to show how simple this is for users, in case you have never clicked on an app in the app launcher before.


The Technical Details:
This approach uses production as the identity provider and a sandbox as a service provider. Authentication is managed using an identity-provider initiated oauth flow.

This implementation is a variation on the approach described in this H&T article. The approach in the article requires users to navigate to the sandbox my domain in their browser, where they can click on a button that authenticates against...

Continue reading →

custom links that work in both classic and lex

if you want a single custom link that works in classic or lightning, you need to create the links in a very simple visualforce page and embed the page in the page layout, which will show in classic and lex and looks pretty fine. you can make it look better if you really want.

note : you must set target = blank or target = top for the lightning portion of the link. if you do not specify target, or use self or parent, then opening the link in a new window will open the home page in lex.

if you try to use IF logic to evaluate UITheme on a custom link, it almost works, but it only works if you open in the same window. if you open in a new window, it will always evaluate to classic, and the known issue for this is marked as ‘no fix’. because of course…and you cannot prevent users from opening in new window.

the suggested workaround on the KI is to use a formula field. a formula...

Continue reading →

enabling email on records in lex

enabling email on records in lex is not what i imagined spending much time on in our migration…but here we are.

if you are in a sandbox, deliverability must be set to all email, else the action wont show up on any records period.

you need to add the sendemail action to the global publisher layouts, or override the specific page layouts to include it. makes sense.

per this doc, the send email action only works in lex but must be in the classic actions section also. some mumbo jumbo about inheritance. just tested and indeed it is the way. just dont ask.

once you finally get it to show up on the page, you may get a big red error message when you try to actually use it. has happened to me more than once! try disabling and re-enabling enhanced email per this thread on success. again, just dont ask.

you can indeed customize the layout for the email action. I removed...

Continue reading →

create record with pre-populated values in lex

the documentation on this spring20 feature is so bad its almost like the feature doesn’t exist at all.

this is all you get - one example and 2 notes

Screenshot from 2021-10-05 10-02-26.png

some missing ‘details’

a) date fields need to be converted to string using the TEXT formula

b) you can pass RecordTypeId (case sensitive) via a separate url parameter, but not in the default field values. the docs just say its not supported yet and strange things may happen. what is the point of having this feature without supporting record types? insert snide remark about confetti here.



c) the nooverride=1 parameter works in lex. if you have overridden the ‘new’ button on the object with say a visualforce page for example so people can only create opps from contacts or accounts, you can pass nooveride=1 and it will let you bypass that...

Continue reading →

Expresiv application in Salesforce user login history

cleaning up our integration user, and found a large number of logins from a mysterious application named “Expresiv” with an AWS IP address.


a few posts on salesforce forums over the years, mostly very old

i had a hunch, that turned out to be correct, that in my case these came from old formassembly forms that were connected via basic auth (un / pwd / token) instead of the new (c 2014) oauth option.

so now i gotta track these down and update them bc basic auth is no bueno.

View →

checking for record access in visual workflow

the UserRecordAccess object “Represents a user’s access to a set of records”.

in apex, you can query this object to determine if a user can view, edit, delete, share, or transfer a record.

SELECT RecordId, HasReadAccess, HasTransferAccess, MaxAccessLevel
FROM UserRecordAccess
WHERE UserId = [single ID]
AND RecordId = [single ID]

in flow, you can query this object to test for edit before updates, in theory, but its got some quirks because it has very specific requirements around how the query is structured, and the standard flow “get records” element does not meet them.

the docs specify these requirements for the query. the 2nd and 3rd ones come into play here.

SOQL restrictions:

  • When the running user is querying a user’s access to a set of records, records that the running user does not have read access to are filtered out of the results.
  • When filtering by UserId...

Continue reading →