Playing around with SoqlX

A fun thing about starting new jobs is being exposed to different tools & ways of doing things. This is my first job where my computer is a Mac instead of PC. A popular tool in the toolkit of Salesforce Admins is DemandTools. It’s a pretty nifty software but at its core it’s a GUI for using SOQL to find and update records. And it only runs on PC. What’s an enterprising Salesforce user supposed to do?

I was introduced to SoqlX, an open source tool for Mac users to edit, update, and query data. I’m going to walk through some of things I’ve learned since I’ve started using it. Between SoqlX and Dataloader, I’m pretty set and don’t miss DemandTools at all.

Ever since I started using SoqlX I pretty much avoid using Salesforce’s report builder. I find SOQL faster and easier overall, plus the added benefit of being able to edit a record directly within the UI of SoqlX.

Getting familiar with SoqlX

The SoqlX UI

I use the tool 100% for querying data, but you can also explore the schema and run anonymous Apex. All your objects (and fields!) are on the left. You write your query in the white box at the top.

The Recent button in the upper right shows you your past ~3 most recent queries. Which is super helpful if you forget to save your queries.

You can save your queries (DemandTools users might know these as “scenarios”). I highly recommend doing this when you think you’ll use it again. Especially if you took the time to write out a bunch of custom fields.

All my saved queries so far.

Command + S saves a query for you & Command + Shift + S saves the query results into a CSV.

SOQL 101

SOQL stands for Salesforce Object Query Language, it’s basically the command you tell Salesforce to give you the data you want. If you’ve ever used report builder in Salesforce it’s SOQL that’s running it under the hood.

Here’s a simple query, where I’m asking Salesforce to give me all the leads where Smith is the Last Name.

SELECT Id, LastName, State
WHERE LastName = 'Smith'
You can edit records in-line too. So I could change MICHIGAN to MI.

Once I run the query, I’m given all the records that fit the criteria, up to 2000.

You can also count how many records that fit a certain criteria as well by modifying the query (the answer is 1,362)

WHERE LastName = 'Smith'

SOQL is pretty powerful. If you aren’t super familiar with it I recommend reading SFDC’s developer docs, which are quite clear and useful.

Searching against the database

This is obviously one of the main benefits of DemandTools, but can be achieved using SoqlX as well if you have a little bit of a patience and a coworker (thanks Leon!) who can help you write a nifty Excel formula.

I usually need to search against Salesforce using email addresses. This is a common situation where a user extracts a list, but then they want to know more attributes about the records.

“Do you have record IDs?” I ask. “No just emails,” they say with a shrug. 🙄 (Note: I’d use the same steps below if they had record IDs, I just prefer them over emails because they are unique.)

When writing a query using emails, it needs to be formatted like this.

SELECT ID, FirstName, LastName, State
WHERE Email in ('','')

You don’t write an equals sign because you’re looking for many records. The syntax is pretty straight forward, but what do you do when you have a 100+ emails? Certainly you’re not going to write them out by hand.

The Excel formula allows you to take a row of emails and immediately format them so they are read-for-SOQL. I made a Google Sheet that you can copy here.

The formula concatenates all your emails while respecting the single quote comma syntax that SOQL wants. Note: SOQL has a 20,000 character limit for queries so keep that in mind–if you try to shove too many emails into a single search you’ll get an error.

Let me know if you try out any of the above or if you have better tips that I’m missing! 👋🏻

Today’s the day: Write your first Visualforce email template!

I shied away from Visualforce email templates for much longer than I should have. Mostly because there was never a burning need for me to create anything. Then, two situations arose that called for some snazzier email templates than plain text could provide. Time to write some Visualforce!

Visualforce templates are good for when you want to render information conditionally and/or you want to show a list of related records. You can’t render information conditionally in a plain text email or HTML email. And you certainly can’t show a list of records.

Read on for two examples and code samples that you can copy + paste!

The Conditional Render

I do best with real world examples, so here’s an example of a plain text email that needs a serious refresh:

V.1: Lots of superfluous information.

This email gets the job done but is missing a few things:

  1. Clear formatting that explains what the user should be looking at. There is no bolding or anything so it’s easy for the eyes to glaze over.
  2. Usage of “1” instead of “Yes.” It’s not fair to assume that your users will understand a boolean value (notice how I wrote the little explainer at the bottom to be on the safe side).
  3. There are no notes about the lead’s marketing…yet that label is there. 😕

Okay, so all the important information is there just not presented in the best light. Don’t let the perfect be the enemy of the good. Notifying your users certainly beats the alternative! But, if you’re interested in cleaning up the template slightly — read on.

V.2: Cleaner, strategic bolding, and only rendering information that matters to the user.

Let’s dig into the nuts and bolts of the code that fuels this email.

Lines 1–7: Setting up our email with a series of opening tags (if you scroll down to lines 41–44 you’ll see the closing tags). The body of your email need to be in between these tags.

You can declare who the recipient will be and what object you’re referencing — in this instance a lead.

Lines 10–17: This is the main body of the email that provides all of the lead’s contact information. Something that is frustrating with Visualforce templates is the UI doesn’t provide the merge fields for you. I recommend opening up your field list for the object in question so that you can quickly reference what their API names are.

The <apex:XX> tags are specific standard components to Visualforce and each have individual behaviors. Salesforce lists all the components available in their documentation.

<apex:outputLink> is giving me my record link. Note that my instance is not hardcoded — this is a best practice. You can feel free to copy that exactly, since it’s what I did. 😇

Lines 21–24: I used the Visualforce component <apex:outputPanel> because I wanted to render all the information below depending on whether it was visible or not.

Another way to do this would be to make each line render conditionally, but it was creating a lot of weird whitespace so I went with this solution.

The rendered aspect has me checking 6 boolean fields and 1 text field to see if they are true/populated. If so, then continue to render the information below.

Lines 27–33: This is where I conditionally render the field labels and values of my boolean and text fields. I have the following fields: Restaurants, Food & bev manufacturers, Grocery, Higher-ed Admins, K-12 Admins, Agency, and Media Kit Comment.

If any of these fields are true, I want to render the label I’ve created and bold it. For example: Media Kit Comment: I’d like to purchase $100K of advertising ASAP!

I have to conditionally render this because just because Agency is true doesn’t mean I want to the field label for Media Kit Comment to show!

Lines 35–44: This is the rest of the email, and I’m closing out the tags. Notice I put a little more text after </apex:outputPanel>. If I had put it inside the tags, it would have also rendered conditionally.

The List of Related Items

Another good Visualforce email use case — what if you wanted to show a list of records related to an object, such as opportunity line items? Completely doable with the <apex:repeat> component.

Here’s an example of an email that we send internally to another department. The parent object is called a Project and the child records are Project Tasks:

This Project had 2 related Project Tasks that needed to appear in the email.

Lines 9–15: Some styling that I just left in there because I borrowed this template heavily from another template. You could remove it if you don’t care about the table headers/rows are rendered.

Lines 19–25: I am creating the labels for the columns my table will have.

Lines 27–36: This is where the magic happens. ✨ Using <apex: repeat> I’m able to set a variable name (pt) for my related object Project Tasks and iterate over them. I also utilized <apex:outputPanel> because I only wanted to render specific records. If you want to show everything, you wouldn’t need this part.

Note the pluralization! I initially wrote {!relatedto.AcctSeed_Project_Task__r} when it should have been plural. This absolutely killed me when I first started. Read this for more details on object relationships. I’m still not great with this.

Lines 37–50: This is closing out the email with all the tags, very similar to the first email.

Lines 55–71: This is actually the same email — just in plain text format! Given that this is going to an internal user and I know their email can handle it, I probably don’t need it. But leaving it in case you have a use case for it!

Line 73: Everything needs to stay inside the final </messaging:emailTemplate> component.

If you try to build a template, let me know in the comments!

Further reading:

Creating a Visualforce email template (Salesforce docs)

Not so scary VF templates for admins (Jan Vandevelde’s blog — and what inspired me to write this post)

apex:outputPanel render logic (StackExchange post)

Thanks to Jan Vandevelde and Peter Churchill for their help while I tackled these two email templates. ☁️

Lead Source quirks in Salesforce

The lead conversion process always is a bit stressful. Fields from one object are mapping to another and you want to make sure everything is working correctly and nothing is getting overwritten. Additionally, one of the most valuable fields for sales and marketers starts with the conversion process.

That field? Lead Source.

Understanding where your leads are coming from allows your team to focus their time (and marketing dollars!) on those areas. If you go to a lot of Trade Shows and *think* they’re valuable how would you know without marking the Lead Source as such?

With all that said, here are some brief notes regarding the Lead Source field and the conversion process:

  • Leads, Contacts, and Opportunities all have a field called Lead Source. This field maps automatically upon lead conversion and is default Salesforce behavior.
  • Accounts have a field called Account Source and that populates with the Lead Source during conversion.
  • Opportunities will inherit a Lead Source one of two ways: If a user creates an opportunity during the conversion process OR if a user later creates an opportunity from that contact’s record. The contact will also be added as a Contact Role to that opportunity.
  • Account Source will not map to a new opportunity if a user creates an opportunity from the account record.
  • Upon merge of duplicates, make sure to preserve the Lead Source data from the oldest record. This is the closest thing you to truth.

⚠️ If your Account Source field is blank and you convert a lead to that account, the account will inherit that lead’s source. This is bad for data attribution. I have created a default Account Source field called “Unknown” which will prevent the lead conversion process from overwriting the source.

This goes against what the Salesforce docs say but I tested it and so did Amnon Kruvi and we had the same experience. Check out this thread for more:

Anything I missed or that you wish you knew when you starting managing the lead conversion process in Salesforce? Let me know!

Adventures in Salesforce formulas & validation rules with WEEKDAY(), IF(), & INCLUDES()

Formulas are one of those tricks up an admin’s sleeve that are extremely powerful and cool (or maybe that’s just how formulas make me feel.) 🤔

It almost feels like coding and you can accomplish a lot with just a few lines of formulas in a field or validation rule.

Until recently, my experience with formulas had been pretty elementary but recent projects at work and Trailhead got my gears turning and I realized the endless possibilities of formulas.

In this post, I’m going to walk through a formula I recently built and list some resources that have really helped me as I’ve expanded my formula skills.

All changes in Salesforce require clear requirements and this one was no different. I work for a company that sells online advertising. We send email blasts, newsletters, and other marketing content that advertisers can sponsor. While it’s not physical, our inventory still has restraints. For example, we only send certain email blasts on Tuesdays and Thursdays.

My Ad Operations team who is responsible for trafficking ads noticed that sometimes sales reps would put the wrong date in for a product on a contract and that would cause confusion. If the product date was Wednesday but email blasts only go out on Tuesday or Thursday some back and forth would be required to determine the correct date.

Wouldn’t it be nice if depending on the product a sales rep entered they’d only be allowed to enter specific days of the week?

Validation rules and a complex formula to the rescue! If you’re new to validation rules, check out the Salesforce docs and this Trailhead module.

I wanted the the solution to be modified by an end user and flexible. Some of our products don’t have a specific send date so I couldn’t make a solution that requires a send date or else that would be a problem.

Example of the picklist on a product record.

I created a new multi-select picklist called “Product Send Days” and put that on the Product object. Multi-selects have their downsides since they can be terrible for reporting but for this use case it was perfect. With just a couple clicks our Ad Ops team could update the days of the week our products send.

Now it’s time to flip to the validation rule and the formula. The Opportunity Product object has a relationship to the Product object, which means I’d be able to reference it in my formula. It’s import to remember that when you’re working on a formula. If there is no relationship between the objects it won’t work.

Accessing my Product Send Days field by drilling down from Opportunity Product.

IF(WEEKDAY(ServiceDate)==1 && INCLUDES(Product2.Send_Days__c,'Sunday'),false, true)

So what does the above say? Let’s break it down.

The biggest problem that I immediately saw was that I needed some way to translate the day of the week on my Product object to the actual day of the week that was being chosen on the Opportunity Product. This is where the WEEKDAY() function comes into play.

WEEKDAY checks the ServiceDate to see if it’s equal to 1, which is Sunday. ServiceDate is a field on the Opportunity Product. The INCLUDES() is a function unique to multi-select which checks to see if the multi-select has the value you want. So it’s taking my field Product2.Send_Days__c and checking to see if Sunday is selected.

We want something to happen when we ask the question “Does the ServiceDate equal Sunday and does Product2.Send_Days__c include Sunday?” So we are gonna wrap it in an IF() statement!

IF(logical_test, value_if_true, value_if_false)

We already know our logical test, that’s the WEEKDAY() and INCLUDES() where we’re checking to see if Sunday = Sunday. But here is where it gets tricky. For value_if_true we’re putting false because we don’t want the validation rule to fire. 😳

If the sales rep is entering the date correctly, we don’t want to stop them! So only if Sunday ≠ Sunday do we want it to fire. Note: If you put null instead of false in the 3rd position, the validation rule would not fire.

So now that we’ve broken down how to create it for Sunday, you just need to copy & paste to make it for the other 6 days of the week, like so:

IF(WEEKDAY(ServiceDate)==1 && INCLUDES(Product2.Send_Days__c,'Sunday'),false,
IF(WEEKDAY(ServiceDate)==2 &&
IF(WEEKDAY(ServiceDate)==3 && INCLUDES(Product2.Send_Days__c,'Tuesday'),false,
IF(WEEKDAY(ServiceDate)==4 && INCLUDES(Product2.Send_Days__c,'Wednesday'),false,
IF(WEEKDAY(ServiceDate)==5 && INCLUDES(Product2.Send_Days__c,'Thursday'),false,
IF(WEEKDAY(ServiceDate)==6 && INCLUDES(Product2.Send_Days__c,'Friday'),false,
IF(WEEKDAY(ServiceDate)==7 && INCLUDES(Product2.Send_Days__c,'Saturday'),false,

I didn’t talk about the double ampersands (&&) but that’s just a logical operator for AND. You could switch out && for AND and it would work just as well.

I thought this formula was looking pretty good…until I went to test it. Which is why you should always test before you release to your users. Remember when I said that some products didn’t have specific send days? Well in the formula above there is no place to allow for that. My validation rule is not going to let a user save an Opportunity Line without a correct send day.

So I added some extra logic at the very top.

NOT((ISBLANK(Product2.Send_Days__c)) || (ISBLANK(ServiceDate)))

Here I’m saying, “If the Send Days field is blank OR the ServiceDate field is blank, you can ignore and not fire.” I had to wrap it in a NOT() because I only want the validation rule to keep working if the fields aren’t blank.

Similar to the double ampersands (&&) the double pipe (||) means OR. You can use either!

So here is the final formula in all its glory. ✨

NOT((ISBLANK(Product2.Send_Days__c)) || (ISBLANK(ServiceDate)))
IF(WEEKDAY(ServiceDate)==1 && INCLUDES(Product2.Send_Days__c,'Sunday'),false,
IF(WEEKDAY(ServiceDate)==2 &&
IF(WEEKDAY(ServiceDate)==3 && INCLUDES(Product2.Send_Days__c,'Tuesday'),false,
IF(WEEKDAY(ServiceDate)==4 && INCLUDES(Product2.Send_Days__c,'Wednesday'),false,
IF(WEEKDAY(ServiceDate)==5 && INCLUDES(Product2.Send_Days__c,'Thursday'),false,
IF(WEEKDAY(ServiceDate)==6 && INCLUDES(Product2.Send_Days__c,'Friday'),false,
IF(WEEKDAY(ServiceDate)==7 && INCLUDES(Product2.Send_Days__c,'Saturday'),false,

As promised, here are some resources that have helped me a ton in my formula journey:

Shout out to Natalya Murphy who sat with me at WIT DC’s #SalesforceSaturday to work on this with me. ☁️

Let me know in the comments if you’ve tried a similar formula or if you would have done it differently!

How to use Salesforce Outbound Messages & Zapier to celebrate a closed won sale in HipChat 💸 🎉

I’ve always found Zapier to be a cool tool, but never thought of an application to use it at Industry Dive. My colleague had set up a few Zaps between Google Sheets & Salesforce and had showed me the gist of Zapier, which got my wheels turning.

Then, this happened in our sales chat:

I mean, #duh.

Spoiler Alert: This post is not about how I managed to get specific songs to play from Spotify to Sonos. We’re still using a human for that part of the equation — but if you have ideas, let me know in the comments! 🎵

We quickly polled the sales team to get everyone’s favorite song. Given that we didn’t want complete chaos on the Sonos we decided to limit playing a rep’s song to closed won deals over $15,000. This happens just infrequently enough that it would be special.

So here is where Zapier comes in: How could we notify the team in our HipChat room the second a deal was closed that met that criteria? A simple Workflow Rule in Salesforce would allow me to email the team, but a HipChat is exponentially more fun. 💬


Before following the below instructions, make sure you have the following or else you’ll just get frustrated.

  1. A paid subscription to Zapier. Salesforce is a “premium” application which means you can’t access it on Zapier’s free plan.
  2. A System Admin profile or Modify All Data permissions in Salesforce. Or, just send this to your friendly Salesforce admin, I’m sure she’d be happy to set this up for you. ☁️
  3. Ability to get the an Admin Auth Token from HipChat. This is what Zapier uses to “call” HipChat and access the HipChat room you want to message. This was the piece of the puzzle I didn’t have access to so I just hunted down one of our HipChat admins, asked them the generate the token and then send to me.

Step 1: Open up Salesforce & Zapier and set up the Outbound Message

If you have dual monitors, this will make it a lot easier so that you can flip between the two apps.

In Zapier create a new Zap and select Salesforce then type in “Outbound” into the Salesforce Trigger search. You’ll then be asked to connect your Salesforce instance to Zapier, so go ahead and do that if you haven’t already.

The next step will be to get this webhook, which is what allows Salesforce and Zapier to “talk.” Keep this page open and switch to a new tab to Salesforce.

In Salesforce, create an Outbound Message. The object you’ll want to create it on is Opportunity, because that where closed won sales happen! But you can see you can create an Outbound Message on almost any object.

Put the URL from the Zapier screen above into the Endpoint URL field in Salesforce.

The “Opportunity fields to send” section is important because that is the information you are sending back to Zapier, which will ultimately become part of the message you send to HipChat.

Side note: You’ll see that Account Name and Owner Name aren’t available options to pull over. This is why I’m bringing the IDs. We’ll convert them over to text in a later step.

Once you do this press Save on the Salesforce screen and save on Zapier. At this point, Zapier will want to pull in examples using the webhook you just added.

You’ll get something like this:

Allll the Salesforce IDs. 🔢

Step 2: Go back to Salesforce and set up a Workflow Rule

The Outbound Message is what sends all the relevant information to Zapier but something needs to kick off the Outbound Message. An Outbound Message on its own does nothing. Enter: Workflow Rule!

Create a new Workflow Rule that has the criteria you want to trigger to the Outbound Message. My criteria is fairly simple: Closed Won & over $15K.

Once you save your Workflow Rule, make sure to add an Immediate Workflow Action (choose: New Outbound Message) which is triggering your Outbound Message. Basically, you’re linking the two actions together. Otherwise, nothing will happen!

💡Admin Best Practice Side Note: I named both my Outbound Message and Workflow Rule “Over $15K for Zapier.” I also utilized the description field to explain what these actions do. When you’re stringing together different components within the system naming consistency is helpful because it shows you (and future admins!) that all these parts are related.

Before we delve into Step 3, let’s briefly cover what we did:

  1. Set up an Outbound Message from Salesforce to Zapier, which sends the relevant data from Salesforce to Zapier (which will eventually be passed to HipChat).
  2. Set up a Workflow Rule to push that information out of Salesforce based on specific criteria (since I don’t want to send a HipChat for every single sale!)

Next Steps: Use the IDs from the Outbound Message to get the text you want to include in your HipChat

This really puzzled me initially. In the screenshot above with all the Salesforce IDs you’ll note that that the only thing that is legible is the amount: 5000.00. Everything else is in Salesforce ID form. But when you go to set up your Outbound Message you don’t see an option to select “Account” just “Account ID.” Hmm. 🤔

So at first I just ignored this and plowed straight ahead into the HipChat portion of the Zap. This is what I got:


Okay, fine. I should probably figure out a more legible solution. At this point I hadn’t thought to read Zapier documentation, so I just turned to Twitter instead.

Initially I thought I’d create formula fields that would be hidden on the page layout in Salesforce so that I could pull the information over to Zapier. My heart secretly ached at the idea of creating extra fields for such a silly purpose. But then! A response!

Brilliant! Instead of creating these fields, I would just create steps in Zapier to search for the information I wanted in Salesforce and then bring it back to Zapier in the format that I wanted. I had to create a lot more steps in Zapier, but this way everything was self-contained in Zapier and I wasn’t spinning up random fields in Salesforce.

It does seem a little circular; you just called all this information from Salesforce to Zapier and now you’re sending it back to Salesforce just for the purpose of reformatting it. But since you only have IDs for these objects and nothing more, you need to query Salesforce so you can get all the fields so your HipChat message isn’t gibberish.

Step 3: Find Account

In Zapier, create a new step after your Outbound Message. Select Action, then Salesforce, and then “Find an Account.”

You’re searching by the Account ID you got in Step 1!

Select Account ID and then Notification S Object Account ID. Then follow the rest of the prompts.

Don’t worry about Account Name and other text yet! That will come later.

Step 4: Find User

This is pretty much the same as above, but instead of “Find an Account” you’ll choose “Find a Custom Object.” The User object is not a Custom Object, but that’s what Zapier calls anything that they don’t have in their system.

This is the User ID for the Opportunity Owner and how you’ll get their name.

This is what your steps in Zapier should look like so far:

Step 5: Format Currency

This is 100% optional but if you’re going to do a job you might as well do it well, right? In your Outbound Message Salesforce gives you the amount of the opportunity in this format: 50000.00. No dollar sign, no comma. Not ideal.💰

Luckily, Zapier has a solution for this called “Formatter” that will transform the number for you. Create a new Action and search for Formatter. Choose Numbers and on the next screen you’ll be presented with this:

The Currency Format part still confuses me a bit.

Your input is the amount that came over in the Outbound Message.

You’ll then get an option to test the results of the formatting. If it doesn’t look how you want it, go back to the previous screen and fiddle with the Currency Format options until you get what you want.

Step 6: String it all together to create your HipChat message! 💃

Okay, you’ve told Salesforce to send information to Zapier, you’ve searched Salesforce for the correct information you want to render in your chat and you reformatted the currency because you’re an overachiever. 💅 Let’s finally put it all together and send a HipChat message!

Back to Zapier: Create a new action, search for HipChat, and select “Send Message.”

You’ll need to connect HipChat and Zapier so this is where that Admin Auth Token will come in handy. Grab that and you’re ready to rock and roll.

Next comes the fun part: Setting up the template!

Room: The HipChat room you want to send the message to (when you are first setting this up and testing it, I recommend making a private room or sending the chats to a less populated room.)

From: This is just a free form text field and you can make it whatever you want. I thought Opportunity Bot was cute so that’s what I went with. 🤖 (Too bad I can’t add emojis in Zapier/HipChat because otherwise I totally would)

Message: Here is the what we all came for and the purpose of all those darn searches. You can now craft your message and pull information from each search step.

Basically an elaborate mail merge. 📩

I just wanted account name and user name but because you pulled in the entirety of the Account and User objects, you could pull in whatever you want — user title or maybe account phone? Really, the possibilities are endless.

Notify, Color, and Format: All pretty straight forward — make the choice that is right for you.

Before going live, I recommend sending a couple tests to a test HipChat room to make sure your chat is exactly how you want it.

Once you’re happy, change the HipChat room to real room you want to send the chats to and don’t forget to turn on your Zap!

Step 7: Wait for the sales to roll in

End of quarter sales has the Opportunity Bot working overtime. 😅

The best part of the Outbound Message is that it’s instantaneous! This is because Salesforce is pushing information to Zapier vs. asking Zapier to search your Salesforce instance. So the second a rep closes a deal, you’ll see it in HipChat.

Did you try this? Or have an idea on how it could be better? Leave a comment below or find me on Twitter. I’m always looking to meet other Salesforce enthusiasts. ☁️

In-Line Editing in List Views in Salesforce

I used to shy away from List Views because I thought of them as a less robust version of reports, so why bother with them? Recently I had a discovery that made List Views worth it: in-line editing.

Every week Industry Dive has a process where we confirm that the advertising placements we sold to a client actually ran. Our Ad Operations team confirms the placements ran and then communicates to our Accounting team that the placements can be invoiced.

In order to designate between a placement that we think ran vs. a placement that has definitely ran we have a checkbox on the record named “Reconciled?” Once this box is checked it means we’ve confirmed it has run and Accounting can invoice.

We usually run 80–100 placements a week, so checking that box for every placement would really suck. Enter: in-line editing! 🎊

Now a user can quickly reconcile placements without going into each individual record.

There are some important limitations and things to know about in-line editing and the permission to do so must be turned on by your Admin on your Profile.

If you have a situation where you are exporting a group of records to make a change on all of them that is the same, give in-line editing a try. It’s easier and less error prone than exporting and updating via Excel.