Gorav Seth

Salesforce MVP (HOF) | Permaculture designer

Read this first

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 it doesnt 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.

example

/lightning/o/Opportunity/new?recordTypeId=012400000009dr3&defaultFieldValues=...\

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 page.

d) you...

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.

exprsiv.png

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 →


tracking number of simultaneous users in salesforce

in setup - session management, you can filter to see session where
SessionType = UI
ParentSessionId = null

and those are your currently logged in users.

i needed to track that over time, to see what our numbers look like for internal purposes.

i wanted to track this every 30 mins, to capture spikes. we have session length set to 2 hours, so that clears out inactive sessions reasonably fast.

so via flow i could get records of the authSession object, but scheduled flows are max 1x/day, without hackery. didnt want to write any code for this, so went to power automate.

was very easy to setup a get records to query salesforce, and then write the number of simultaneously logged in users to an excel online file. and power automate lets you schedule to run very frequently, even in seconds. so every 30 mins is no issue.

flow.png

and…voila

excel.png

Continue reading →


using flows in system mode allows for alternative approaches to changing ownership

The standard sharing button and change owner button are great for hierarchical organizations, as the ‘power’ magically flows up the role hierarchy - so bigger fish higher up the role hierarchy can change owner / share records of all the little fish underneath them.

this is not so great when there is a high degree of collaboration within roles. in my case, each role represents a country office and country offices are collaborative entities. anyone in the country office should be empowered to change the owner of a contact owned by anyone else in the office, without asking the current owner.

while the standard ‘change owner’ functionality is carved in stone cannot be overridden, you can add a custom button and a flow in system mode that allows for alternative models like this.

its quite simple. the flow runs in system mode. it checks if $user.role = owner.role, and if so, lets them...

Continue reading →


using screen multi-select choice in formula uses label not value

sorry the images turned out huge and this article is hard to read

if you reference a screen multi-select choice element in a formula, the formula uses the choice label, not the choice value.

choice with value defined

Screenshot from 2021-06-21 13-08-24.png

choice is used in screen multiselect checkbox group :

Screenshot from 2021-06-21 13-11-05.png

formula field references screen field

Screenshot from 2021-06-21 13-01-23.png

output uses choice labels

output-labels.png

but, if you first assign the screen field to a variable, and use the variable in the formula, then you get the values.

assign screen field to variable

asstIntermediateVar.png

formula uses variable

formula_var.png

output uses choice values

output-values.png

feature or bug…you decide!

Continue reading →


email to case auto-responder and contact emails

Email to case matches on all email fields, including custom email fields.

However, if email to case finds a matching contact, the auto-response email appears to always include the contact’s preferred email, which is problematic if one thinks about it for a few nanoseconds. Contact submits a case from email abc and the autoresponse is sent to email xyz (and also email abc, if you check the box to copy all email addresses on the autoresponse).

There is now an easy declarative way to remove the contact from the case, using before-save flows, which fires before the auto-response rule!

The flow needs to set case.contactId and case.preferredEmail to blank (global constant empty string). I assume both are required, did not test them independently.

caseFlow.png

Continue reading →


translation workbench is a dumpster fire

i just spent an hour trying to get an import file working, because translation workbench…

the documentation ON THE IMPORT PAGE says

Include the language attribute at the top of the file. Your format should look like Language = “en_US” and include a valid language reference.

proof:
proof.png

Nice, if it was true, but its complete fabrication. It makes not a single iota of difference if it is there or not or filled with garbage.

What is required, is the following

Language code: [valid language code]
Type: [source | bilingual | data]

I spent a freaking hour trying to do shit with Language = xyz, making sure my file is utf8 etc etc etc. What garbage.

So this worked fine

Language = "dumpsterfire"
Language code: es
Type: Source

 KEY   LABEL

CustomLabel.FD_GAR  I am a Sucker

magic.png

Continue reading →