Tip:
Highlight text to annotate it
X
IKAI LAN: Hi, everybody.
Welcome to a very special edition of
Google Developers Live.
My name is Ikai Lan.
ARUN NAGARAJAN: Arun Nagarajan here.
IKAI LAN: And today we're going to be talking about how
to integrate Google Apps with Salesforce
using Google Apps Script.
And when I say we, I mean Arun's going to be doing this
and I'm going to be following along just explaining things
about Apps Script.
Because I don't know very much about the Salesforce API at
all, whereas Arun knows a lot.
ARUN NAGARAJAN: All right, yeah.
So actually, one of the things that I realized this morning
was that the very first time that I worked with
salesforce.com was in 2006.
Yeah, which is decades ago in tech.
And it was back when we were building some mobile
applications, and we had to tap into the API.
And all they had was a fairly early-on version
of their SOAP API.
So I was very happy to know that things
have come a long way.
It's much more robust, much more secure, very easy to
connect to.
And it's always been cloud-based.
So it's a great fit for Google Apps in general to exchange
data, documents, spreadsheet-type
data, things like that.
And before we kind of dive into the API aspect of things,
maybe for yourself and the other viewers that are out
there, maybe I'll just give a very quick overview of what
Salesforce is.
IKAI LAN: What is Salesforce, Arun?
ARUN NAGARAJAN: Exactly, ask me the question, right?
IKAI LAN: What is it?
ARUN NAGARAJAN: Salesforce.com is a CRM system.
So there are many like it.
Oracle, Microsoft-- a lot of these vendors have their own
CRM systems that are on the cloud.
IKAI LAN: And a CRM system is--
ARUN NAGARAJAN: A CRM system stands for Customer
Relationship Management.
It allows you to track contacts with your customers--
for sales, for service--
and it allows you to track accounts and contacts and
opportunities against them.
Opportunities are things like deals.
So you may want to know--
I started to market to this customer.
It took them a couple weeks to get to know what it is.
Now they're evaluating us against another vendor.
And then finally, they procure our software
and paid us our bills.
So if you're a small company, a big company, this is a
typical flow for a salesperson to have.
It's a pretty common business purpose software.
So what I'll do is just give you a little overview of the
components and the contents that a CRM system may have.
By the way, everything that I'll be doing today is
something that you guys can follow along.
Salesforce.com actually has a free developer version.
And it's actually--
I think it's free unlimited and allows you to have
hundreds of records for testing purposes and a lot of
good things there.
And obviously, it's great for testing as well.
You can actually add your content and get a good sense
for what it's like.
So a typical CRM system, when you come in, you have--
the key moving pieces are Accounts.
So accounts are like companies, right?
So these are-- if I just go in, I can see all the
different companies here.
You have United Oil & Gas, Express Logistics, GenePoint,
Grand Hotels.
Contacts are people that work at accounts.
If I just go into Contacts, these are people.
They have title, they have phone numbers, they have email
addresses, and so on.
And Opportunities are what I mentioned before.
These are sort of the deals.
So a single account can have multiple opportunities
associated with it.
They could be for different amounts, and they could be in
different stages with different
probabilities as well.
So those are the three main pieces that most
folks will deal with.
So that's salesforce.com.
So what we'll do is actually, we'll start off real easy.
And we'll actually kind of create a spreadsheet to dump
some data from salesforce.com.
So we'll try to do three things today--
get data out of salesforce.com.
We will then try to push data into salesforce.com.
And then we'll try to do some interesting workflow-type
things where we tap into an email and then upload data
into salesforce.com contextually.
IKAI LAN: So to clarify a little bit, what are some of
the things that you can do in salesforce.com?
And what would be some examples of reasons that you'd
want to get this into Google Apps?
ARUN NAGARAJAN: So there are a couple of important things
that I think people will end up doing in salesforce.com.
One is--
so if you're a salesperson that you're on the road, you
want to be able to quickly look up these contacts.
You want to be able to log a meeting.
You want to be able to say, I met with this person on so and
so date, the call went well, things like that.
Also, if you're an internal sales or marketing person,
you're oftentimes bulk-editing data.
So you want to load data en masse.
So you want to import it from a lead spreadsheet and then
put it into salesforce.com, for instance.
Or if you're a sales manager, a lot of times you want to run
analytics on it.
You want to be able to look at--
what are the different stages of the opportunities that I'm
tracking right now and all sorts of
interesting things like that.
So those are the key use cases that I see.
And I'll actually start with the one that I mentioned,
which is downloading data en masse.
So what I'll do is I'll go ahead and--
I'm in Drive, so drive.google.com.
And like I said, everything that I'm doing here you should
be able to follow along.
Some of it might be a little tricky.
But what I'll do is--
in this, for the very first one, we're actually going to
use a canned script.
So someone has written a really nice script that works
really well with the Google Apps Script platform.
So I'll go to the Script gallery.
IKAI LAN: And the script gallery is-- you can always
submit something to the script gallery.
You can do this when you're in the script editor at
script.google.com.
Others Submit to Gallery.
I think there's a little bit of confusion between Submit to
Gallery and Publish.
So Publish is what you do when you want to expose your
application as a web service or web app.
Whereas Publish to Gallery is to publish it into the script
gallery here, which you can access right now through a
spreadsheet.
You go to Spreadsheet.
You go to Tools and Script Gallery.
You can look for things that people have published.
ARUN NAGARAJAN: And I'll go ahead and--
I just searched for Salesforce--
and try clicking on Install.
And this is actually one of the members that a contributor
did, Sanjay Gidwani.
I'm going to authorize this script.
Going to close--
close it here.
And you will notice that there's a new menu available
now called Cloud Connector--
great name for it.
In this one, the way it's going to work is it's going to
actually ask me for a password.
So it's using the old mechanism to authenticate.
It's going to actually make me type in my password, which
obviously may not be the most secure approach.
Let me log in here.
And then one of the things that Salesforce instituted a
few years ago was that, for a third-party app to access--
it's sort of like an application-specific password,
except it's for all third-party apps.
And I actually have to save it-- they email you it.
And I'm going to save that.
So that's another reason this approach is not the best--
IKAI LAN: This is kind of a really funny approach if you
think about it.
Because the whole thing about using OAuth and third-party
authentication is that you want to give people a password
that's not the same password they're likely
using somewhere else.
So in this case, they're asking for your password, and
they're asking for initial security.
So they're protecting their system, but they're not
protecting you.
ARUN NAGARAJAN: That's about it.
That's fair.
So I'm going to log in.
So it's sort of stages of things.
I type in my credentials.
I have to hit Login.
And then I can query.
So this is actually interesting.
So the Salesforce interface is based on the
syntax called SQQL--
SQOL--
IKAI LAN: So it's like SOQL.
ARUN NAGARAJAN: Exactly.
It stands for Salesforce Query Language--
that's a typo there.
This is the right version, SOQL And it looks like SQL.
It's got most of the properties of SQL.
But sort of like some of the systems we have, it's got some
things that SQL cannot do-- things like Group By, some of
the advanced structures.
So what I'll start off with is some of the simple ones.
So I can say Select ID, FirstName, LastName.
So this requires some familiarity with the system,
but then it's actually quite nice to use it.
So I can say From Contact.
I hit Query, and it's going to dump the data into a nice
spreadsheet.
So now I have it into a Google spreadsheet, and I can go
ahead and export it.
I can save it, and share it as a PDF.
It's in a spreadsheet, so I can do a lot of cool things.
And I can create another tab of the sheet here.
And what I'll do here is query for--
let's get account information.
I'll show a couple examples here as to why
this might be useful.
So I'll say Select ID, Name from Account.
IKAI LAN: I notice that this script caches
the credentials somewhere.
ARUN NAGARAJAN: That's right.
IKAI LAN: So do you know where it does that?
ARUN NAGARAJAN: Yeah, it does it under User Properties.
I don't want to show it because my
password will be there.
And I'll do--
IKAI LAN: You almost fell for my trick there.
ARUN NAGARAJAN: So I'm actually going to
create a new tab first.
And there's a lot of benefits to this approach.
And I'll show you the real reason why this might be
really beneficial for a sales manager.
I'll say Select Name--
let's see--
Amount, remembering my Probability from Opportunity--
"opp-or-tunity"--
if I can spell.
All right, so this is going to download the sales deals.
100% means it's sold.
60% means the salesperson thinks it's getting close.
And then if it's 20%, they just started this opportunity.
IKAI LAN: Is that probability or progress?
Well, I guess it depends on how people want to use it.
ARUN NAGARAJAN: Yeah, so the field is called Probability,
so let's kind of go with that.
So what I can do as a sales manager--
and this is just the fact that it's in--
oop, [? can't see. ?]
All right, so let me actually go back in, say Data, and
create a pivot table.
So what I can do very quickly is add something as a pivot
table and add values for amount.
And you can see that very quickly, I have a
little stage here.
And I can add another field for Amount, and this one I'll
do just Count.
And you can see that, as a sales manager, I can see that
my sales pipeline is left-heavy.
So a lot of deals are stuck in the early stages.
And I can just go ahead very quickly and then select these
guys and insert a chart.
And we'll call this a typical pipeline chart.
And there it is.
So as a sales manager, ignore the ones that are 100%.
That's kind of skewing the data.
Just look at this part.
I can see that a lot of these deals are just starting up.
So I cannot expect a great next two weeks, because it
takes a couple of weeks for deals to move.
So these are the types of data and these are the types of
reports that a sales manager likes to see.
So that hopefully was a little example of why you want to
bring it into a spreadsheet and analyze--
IKAI LAN: That's a very good example.
And there's one more thing you could do here, which I think
is kind of cool, is that, with this chart-- you can publish
this chart.
ARUN NAGARAJAN: That's right, that's right.
So you can actually publish it to a site or a dashboard, And
then that person doesn't have to have access to the
salesforce.com interface.
So this data is now published and very similar to the
analytics example a couple weeks ago.
IKAI LAN: And that's interesting because Salesforce
also provides functionality that allows you to create
dashboards.
And some people might prefer that method.
Some people prefer this method.
There are advantages and disadvantages to both.
If you use Salesforce natively, it has native access
to the data.
Whereas when you're using Google Apps and Apps Script,
you have to remember to import the data and always get the
newest data.
But you also get access to other Google properties such
as-- you could access Calendar, Gmail, and, I don't
know, Finance.
ARUN NAGARAJAN: Yeah, Sharing, all the versioning, all that
good stuff.
And let's actually go ahead and take a quick look at the
code as well.
This gentleman did a real good job here of calling the SOAP
service for the login part, but then followed it up with
the ability to call the Salesforce REST API.
Sorry, my font's a little funky here.
So you can see all the menus that get added.
And then let's just take a quick look-- so here's the
login process.
So that's the SOAP message that gets sent up.
And then they follow it up with the ability to call the
REST data, which is through a very simple
function called Query.
And you can see that that is a really straightforward call.
So this is the beauty of Salesforce API or
really any REST API.
And one of the nice things that you'll see hopefully is
that, anything that we're showing, hopefully you'll be
able to adapt conceptually and also code-wise into any other
system that you may have.
IKAI LAN: Do me a favor and scroll back up real
quick to the XML.
So a couple of things to point out here are that, when we're
constructing the XML, it looks like this developer has done
so by building the string directly.
Another method you could do this is using the XML Service.
Now, I personally think that for smaller XML documents,
sometimes it's just much easier to do it this way with
direct string.
Because you don't have to remember, where in
the DOM tree am I?
You just go ahead, you construct your XML, and you're
ready to go.
ARUN NAGARAJAN: Right, absolutely.
That's correct.
IKAI LAN: The only thing to be aware of is, when you do use
tools like XML Service, it takes care of
escaping for you.
So you have to remember-- which quotes am I using?
Am I escaping or not escaping, greater than, less than?
Just be aware of these things when you're writing XML you
want to send as part of an API.
ARUN NAGARAJAN: Right, so if my login name had an
apostrophe in it, that system would break--
which is valid.
IKAI LAN: Oh yeah, makes sense.
ARUN NAGARAJAN: So hopefully, that was interesting.
And that's a script that we didn't have to write.
A great member of our community wrote it, and it's
available today for you to try out.
What we'll do next is actually use the REST API and actually
upload some data in bulk.
And for this, we'll actually use OAuth.
IKAI LAN: OK, OAuth, yeah.
ARUN NAGARAJAN: Yes, this is going to involve a little bit
of copy-pasting of the code I wrote ahead of time.
IKAI LAN: So again, while he's doing this I'll talk a little
bit about OAuth.
OAuth, if you don't know what it is-- it's a mechanism for
authorizing third parties to use your service.
So a good description I've seen on the OAuth website is
that it's like a valet key for the internet.
So for instance, if Arun has a service and he calls it Arun's
Social Network.
He's got a total of maybe three or four people that are
using it, but I want to write applications against this API.
So me as a user--
you don't want to train your users to give out their
password to third-party APIs.
Now, this is something that was very common in Web 1.0.
It started to become less common in Web 2.0.
And nowadays, everything, whether it's Facebook or
Twitter, you get an authentication panel.
In your browser, users get to see HTTPS
Twitter, HTTPS Facebook.
So you know they're giving their password to the right
authority and not to ikaismaliciousscript.com.
ARUN NAGARAJAN: That's right.
And Salesforce actually does a really good job of explaining
this as well.
They have a really good resource here on their
Developerforce wiki.
And you should be able to just search for it, and we'll make
sure to include a link for this as well.
It's a really good overview of all the cool things that the
API can do, different approaches.
And you want to use the web server flow when you're
dealing with Apps Script.
And we will get into this probably deeper into a blog
post or a separate session on this by itself.
It's a fairly complicated topic.
And it's a pretty sophisticated piece of
documentation that they have on how this all works.
And we are the client application in this case.
OK, so what we'll do is I'll have to-- for this, I just
created a script against the spreadsheet.
So I went to Tools, Create Script Editor.
I'm just going to create a blank project.
IKAI LAN: So he's not going straight to script.google.com.
He's creating a spreadsheet, and he's going to Tools,
Script Editor.
ARUN NAGARAJAN: That's right.
And a lot of the ideas will apply even if
I start from scratch.
In this case, it's a lot easier for me to kind of
showcase this in a spreadsheet container.
OK, so what I'll do is-- actually, I wrote up all the
code ahead of time, both for sharing it and for
me to copy and paste.
So if you go to my GitHub page, it's all there.
So you can follow along as well.
IKAI LAN: And what's your GitHub username?
ARUN NAGARAJAN: Entaq--
E-N-T-A-Q.
IKAI LAN: Does that stand for something?
ARUN NAGARAJAN: No, it's--
don't put me on the spot.
IKAI LAN: Do you know what my GitHub name is?
It's Ikai, I think.
ARUN NAGARAJAN: You have a very unique name.
OK, so what we're going to do is I'm going to go ahead and
copy some of this code.
So the one called RowUtilities--
this one should look really familiar.
This one is just code right from our documentation.
This has all the utilities around converting a sheet into
a JavaScript object.
It allows you to query for them by range, and then all
sorts of good stuff.
So let's go to the Raw here, copy this, and
then come in here.
IKAI LAN: I'm sorry, let's go back.
That was kind of on the quick side.
So when you're using GitHub, if you're new at GitHub, one
thing you're doing when you look at code is that you can
copy-paste the code.
But look for the Raw link.
Because it's sometimes easier to click the Raw link and open
up just the text of the code.
So that's what Arun is doing right here.
ARUN NAGARAJAN: That's right.
And when they show you the preview, it's really nice to
get all the syntax highlighting and comments and
things like that.
But when you want to copy it, you don't want that
formatting.
All right, so we paste that in.
And I'm going to save this project as Salesforce Scripts.
And I'm going to rename this just to make sure I
understand.
So I'll call this RowUtilities.
And then I'm going to create a new script.
OK, and we'll call this Salesforce.
IKAI LAN: You're creating a new file.
ARUN NAGARAJAN: I'm sorry, yeah, that's right.
Thank you.
And I'll go back and then pick this guy, the OAuth code.
And I'll call this guy-- again, doing it quickly.
But all I'm doing is bringing the code over so that I'm not
typing this in front of you.
And you can use this today.
I should say that it's not production caliber.
We're working on cleaning that up and publishing it as a
sample at some point soon.
But it's great to get started and get a sense for what the
script does.
IKAI LAN: I'm kind of already seeing where you're going with
this when it has the authorization page.
I can't wait because I can already tell it's going to be
really ugly.
ARUN NAGARAJAN: I said not production ready.
All right, cool.
So we've got the stuff.
So what we want to do now is actually a couple of things.
So I want to--
in order for OAuth to work, your script is both bound to a
container and also published as a web app.
So that's kind of a tricky concept to get to make sure it
makes sense to you.
So it's got two entry points, one from the spreadsheet,
another one when it gets called in from the browser.
So if you can think about that, that's necessary for the
callback that the OAuth service
returns with the token.
IKAI LAN: Let's try to rephrase that again.
So you're saying that we need two entry points.
Because when you're doing OAuth, in a typical OAuth
flow, after you go to, say, your service,
arunssocialnetwork.com, and you say, yes, grant
ikaismaliciousscripts.com access to my personal info,
it's going to redirect you back to my site.
So that's what he's talking about when he says he needs to
expose a web app, which he's doing right now.
Because inside this app, arunssocialnetwork.com is
going to pass a bunch of authorization codes that you
can then use to do some key exchanges and make API calls
on my behalf.
Now again, the scope of OAuth is big and can be very
complicated.
So we're not going to go too much into it.
But that's why he needs a web interface for this even though
he's not going to be serving a web application.
ARUN NAGARAJAN: That's right, and hopefully you'll be able
to watch it again and get the flow if we're going too fast.
But this should all make sense in a little bit.
OK, so now what I did was I copied the URL that this
service was published as.
And what I'm going to do now is go into Salesforce and
register a new application.
So this is me telling salesforce.com that it's OK
for this custom third-party application to access my data.
And the administrator does this.
So we go to Setup.
We'll go down to Develop.
We'll go down to Remote Access.
And I have a couple of samples, but this is all-- you
want to do this from scratch.
So you want to go down to hit New.
So this is the application registration.
Again, this is something that a single administrator does
for all their Salesforce users.
So we'll call this Ikai Demo.
This is a great live demo, hopefully.
And I've saved myself a little logo.
I'm going to put that in.
And I'm going to just point to our developer site if
something goes wrong, and then just use my
email address there.
And now here's the important bit.
It wants a callback URL.
So this is the callback URL that the web app calls into,
the redirect calls into.
Oh, I lost it.
IKAI LAN: Right, so again, this is the page that he's
publishing.
This is the page where Salesforce is going to give
back a token.
This is how Salesforce is going to give
Apps Script a token.
ARUN NAGARAJAN: So I'm going to paste that in.
Now, there's one thing that you have to tweak.
So when a script is bound to a container, it's not
scripts.google.com.
It's docs.google.com.
So this is a manual edit, and hopefully we'll
correct this very soon.
And then another thing that's really great about it is, as
an administrator, you can give domain-wide privileges.
So you can make this application available for all
users without them having to authorize it.
All they need to do is log in so that they don't get that
warning message saying, hey, there's a third-party
application.
Do you trust it?
Which may alarm some people.
So I won't check it for this case because
it's just me for now.
So I'm going to hit Save.
And what this is going to do is you can see that it just
registered this application.
The application's called Ikai Demo.
You have the callback URL that I pasted in.
And there are two bits of information that are very
critical here, the key and the secret.
So I'm going to reveal it.
You can use it.
I'll delete this after.
And this needs to get pasted into the application.
So copy this and--
IKAI LAN: I know that some joker out there is going to
try to hack this account.
But just so you guys know, this is a test account.
You're going to get absolutely nothing of any
value out of this.
ARUN NAGARAJAN: So what I'm going to do is copy over the
dummy one that I had saved in there, delete it, paste it,
and then also copy over the secret.
So this is a little bit of a set up.
There's an overhead involved with OAuth.
But in the end, your users are more--
their data is more secure.
They trust the applications more.
So it's a really worthwhile thing to do.
So that's what I've done so far, the ID and the secret.
So that's the pairing that explains that this code is
Ikai's demo application that we registered.
All right so, so far so good.
And I'm going to quickly test this as well.
So for now, since I'm the editor, I'll just pop open
this script directly.
So I'll just hit Run.
That'll make me authorize it.
IKAI LAN: So this is a demo.
But if this were a real script, there are a lot of
things that we could do to enhance the user interface.
Like, for instance, there's the bit about replacing the
URL script in Docs.
We could have made that a UI that came up where we replace
it-- where we just go ahead and do a string substring.
But we're not trying to do that right now.
We're trying to show you guys how to access
Salesforce using apps.
ARUN NAGARAJAN: Yeah, the goal is to give you guys the sample
code, a bunch of recipes, and the building blocks with which
you can go ahead and build the greatest Salesforce
integration we've ever seen.
So I'm going to click on just one option here called Upload
to SalesForce.
And actually, one thing that I'll want to do is clean some
things up here.
So ignore this for a second.
Ignore that.
IKAI LAN: Was that your password out there?
ARUN NAGARAJAN: No.
Oh, was it in there?
IKAI LAN: I don't know.
We're changing it after the show.
ARUN NAGARAJAN: I'm going to hit Run salesforceEntryPoint,
hit the button.
And what that's going to do is say, hey, this is the first
time you're calling this.
I don't know who you are.
I tried to log into Salesforce.
It wanted me to go in and then hit Login.
So I'm going to hit Click Here to Start.
IKAI LAN: It's opening a new tab.
ARUN NAGARAJAN: So now you can see that it says, Ikai Demo is
requesting permission to access your information.
You can see the logo that we supplied, the description, and
all sorts of useful things that I think is important.
And I'm already logged in.
That's why it didn't ask me to log in.
If I weren't logged in, it'll actually make me log in again.
So now I'm going to go ahead and say Allow.
And now you can see that the URL callback--
client identifier invalid.
I screwed something up.
Let's take a look.
Let's try one more time.
IKAI LAN: Ah, your client ID.
Now, you pasted over the client secret as well as the
key, but I don't think you set the client ID.
ARUN NAGARAJAN: No, what I didn't do is, once I pasted in
the code, I didn't republish it.
IKAI LAN: Ah, of course.
ARUN NAGARAJAN: So this is one of the things that-- you kind
of have to publish it first, and then you'll get the new
credentials.
And you have to paste it in and then republish it--
a little bit of an annoyance.
All right, go ahead.
IKAI LAN: So this is OAuth 2.0.
In OAuth 1.0, they had all these different parameters you
had to pass in.
And one of them, I believe, was a client ID.
So I don't think you have to do that anymore
in OAuth 2.0, but--
there you go.
ARUN NAGARAJAN: Cool, so I just refreshed it.
Hopefully the error message will not happen when you're
doing this for the first time.
But you can see that, at this point, the URL is
[? rpublishservice ?].
So this is the callback that I was talking about.
OK, so I can close this window, go back in here into
the spreadsheet-- again, so this is not very nice.
You could have a little timer in here.
You could automatically close it.
I was being a little lazy.
So actually, before I use it, let's set up the context as to
why we want to do this.
So if I go into my Account section here-- or Contacts, I
should say--
I have a lot of contacts here.
But maybe I want to bulk-enter a bunch of contacts.
I'm an admin, I'm familiar with spreadsheets, I don't
want to deal with salesforce.com directly.
So what I'll do is just type in a bunch of contacts, type
in some numbers--
do you want to give your real email out, Ikai?
IKAI LAN: Yeah, that's fine.
How did you know?
ARUN NAGARAJAN: Let me fix this.
I think there's some format checkers.
I think it makes sure that it's at least numbers.
And we'll use our producer, Eric, as well.
eric@test.com.
All right, so we've just punched in three contacts
really quickly-- their names, their contact info.
What I'm going to do is go ahead and say Upload to
SalesForce.
And I'll show you the code as well, so that this doesn't
seem like magic.
And this time, it again says, hey, you know what?
You don't have to log in this time.
I already have the token.
And I've gone ahead and uploaded these people.
Beautiful, isn't it?
IKAI LAN: I'm, like, laughing at this right now.
You made the message the giant title box.
ARUN NAGARAJAN: Of course, man.
So what I'll do is actually go into New This Week,
and there they are.
So the contacts that we just added--
hopefully you guys can see on the line there.
But that's the power of Apps Script.
So you can work with the simple tools that you're
familiar with, things like
Spreadsheets, things like Docs.
And then through a couple clicks--
boom, publish out to another service.
IKAI LAN: And there are lots of reasons why you might want
to use the Spreadsheets UI to do this.
Now, could we go ahead and show us how you would create a
new contact using the Salesforce UI?
ARUN NAGARAJAN: Yes, New Contact.
IKAI LAN: So we're going to click New Contact.
And now you'll see that, OK, you've got to jump around from
field to field.
So you get a lot more features here for instance, but you
could always modify the script to include additional fields.
It's just that suppose that-- he very quickly entered in
three contacts.
And now it would probably--
here you go.
It's taking a little bit longer to do it.
ARUN NAGARAJAN: And then I would have to
do it again, yeah.
IKAI LAN: And he'd have to do it again and again.
So there are definitely lots of reasons.
Other reasons are, for instance, maybe you have a
Google Form attached to your spreadsheet where people
submit their contact information.
ARUN NAGARAJAN: We're not going to show that right now.
But for instance, you could just go and say
Tools, Create a Form.
And it's smart enough to know that the fields are FirstName,
LastName, Email, and Phone.
And this is a very simple thing you can publish out.
And yeah, that's great.
So I'll show you the code real quick.
We won't dwell on it too much because there are a lot of
moving pieces.
But what it really does is calls the Utilities function
getRowsData--
hopefully you guys can see that--
and then just iterates through all the objects, creates a
little post payload, and then just sends it
up using URL Fetch.
So URL Fetch is your friend in these cases.
And then further down-- and you can see this in the script
as well-- there's lot of set up that needs to happen to
preserve the user's properties for the token, for the
callback server for themselves.
You need to make sure that the authorization header is passed
where the OAuth token that was downloaded is passed up.
So these are the things that you need to keep in mind, but
hopefully all the samples will make it
easier for you get started.
Does that make sense to you?
IKAI LAN: Makes sense.
ARUN NAGARAJAN: All right, cool.
So let's do the last bit, and then hopefully there are some
questions as well that we can take.
Great, so the last thing that I wanted to do
was let's go into--
so I set up this sample account called Arun DevRel.
All right, so this account--
he's a COO.
And he's got a bunch of details about him-- the last
time I talked to him, the last time I tried to sell to him,
and whatnot.
So this is a contact that I have a relationship with for
business purposes.
IKAI LAN: So I'm thinking about this demo.
And we should have named it [? Colleague ?] because now
it's just going to be confusing.
Do you know what I mean?
ARUN NAGARAJAN: Yeah, probably.
There are a lot of--
yeah, I should probably have thought about that.
You're right.
So what we're going to do for this demo is we're actually
going to paste in a new function, which is going to
allow the Apps Script environment to go ahead and
seek into my inbox and find matches for
emails from this person.
And then actually if there's an attachment associated with
it, take that attachment and push it up to Salesforce as an
attachment that's available within the system.
So that when I'm collaborating with someone through
salesforce.com, they can reach into this.
They can edit it.
They can add notes to it, and so on.
IKAI LAN: So again, to disambiguate the accounts,
he's receiving emails from Arun DevRel,
and he is Arun Nagarajan.
ARUN NAGARAJAN: That's right, and I'll actually showcase
that one more time.
So the email associated here is appsscript@gmail.com.
So that's my DevRel account--
Developer Relations, code for.
And I'm actually logged in to this account, so this is-- you
can see that, it's Arun DevRel.
And this is my inbox associated with Salesforce.
So this is just my test inbox.
You see there's a few messages in there.
OK, so what I'm going to do is pretend to be this customer of
Arun and hit Compose.
And I'm going to say, my details for you.
Sending this doc for review.
And I'm going to actually--
I think it's called Sales Detail or something like that.
And it's actually a Microsoft Word documents as well.
IKAI LAN: So a lot of reasons why Salesforce allows
attachments is that a lot of times, you have these things
called RFPs, which stands for Request For Proposal.
So typically, people tend to use Word or PDFs.
Now as much as I would love to see people doing this in
Google Docs, the reality is that there are lots of times
when you want to send out a PDF.
Or perhaps you want to send out a Visio doc that says,
here's how you would wire up your network.
ARUN NAGARAJAN: Right, there are a lot of people that
haven't seen the light, I guess, with Google Docs.
So what I'll do is I'll paste in this other function.
And this is called scanEmail.
And for now, we're just going to run it manually.
But this, as you can see after this runs, can be triggered
every hour or every minute, whatever makes sense for your
personal purposes.
I'm going to save this.
And I'm going to go ahead and pick that function to run.
And I'm going to say--
so it's going to realize that I'm now trying to trick it and
read my email.
So it's going to make sure that I reauthorize it--
Grant Access, Close, this time run it for real.
All right, so what is it doing?
So it's going into this inbox, looks through my email, sees
that there's an email from this particular email address,
which matches a Contacts email address in Salesforce.
And then, if the demo gods are with me, there should be a new
attachment that wasn't there before now visible.
And it's in fact also converted into a PDF.
So I can click on it and view it.
IKAI LAN: Wow, very nice.
ARUN NAGARAJAN: Make sense?
Yeah, so let me just show you the code real quick.
So for the purposes of this demo, I made it just so that
it scans the last five threads.
You could go and be a bit more intelligent, remember where it
left off and do some pretty interesting backoff there.
IKAI LAN: So when I've been programming with Gmail App,
one thing that I like to do is look for a document that looks
for saved searches.
Because there are a lot of very powerful things you can
do with Gmail searches.
You can say, label dash label.
You could say, has colon attachment.
There are lots of things you could do to filter down before
you start iterating over things.
ARUN NAGARAJAN: That's a good one, yeah.
IKAI LAN: Since this is a demo, we're just going to go
over the last five emails.
ARUN NAGARAJAN: Exactly, I'm cheating.
So what I'm going to do is then also look for emails with
an attachment.
I probably should have used your trick.
That's a really good one.
Then I'm going to find the first attachment.
And then I'm going to read the attachment as a PDF.
So this is that sort of online conversion that Apps Script
provides that I think is ultra-powerful.
And then I'm going to take the bytes and then
Base64 encode it.
So this is something that the Salesforce API stipulates.
It only likes documents as Base64 encoded blobs.
And then it gets the email address of the person.
The address comes in this format, so there's a little
regular expression magic that happens.
Then it sees, is that email address associated with the
contact in Salesforce?
Runs that--
IKAI LAN: And you're using--
that's not SQL, that's SOQL.
ARUN NAGARAJAN: Then it's going to use the original name
and attach a PDF extension to it along with some details,
give it a parent ID of that person that matches that email
address, and then just run it.
IKAI LAN: And the parent ID, what does that represent?
ARUN NAGARAJAN: In this case, the contact ID.
So it runs the Select against that entity, gets the contact
ID like so, and then it associates it with the parent.
So most objects in Salesforce can have attachments.
So I can have a parent ID of an account ID, and that'll be
an attachment against the account.
So hopefully that made sense.
So what we've been able to do is automatically find an email
with an attachment in it for people that have a record in
my salesforce.com instance, and then be able to send an
attachment to that record.
So this code--
again, all of this is on GitHub.
Go check it out-- pretty easy to find.
If you just go to github.com/entaq, it's the
second project there, hopefully.
There it is.
And then if you just look through it, all the code we
talked about is there.
And then you'll be able to create a sample account in
salesforce.com yourselves and try this all yourself.
IKAI LAN: Very, very cool.
In fact, I think that-- we keep talking about SOQL,
"so-quill," and I think that you're so cool for being able
to pull this demo off.
I've been waiting for that one all show.
You've gotta give this to me.
ARUN NAGARAJAN: No, that's good.
IKAI LAN: Let's take a look to see if there any questions in
Google Moderator.
There weren't any when we started up the show.
But it's possible that we have live viewers that, as
watching, came up with questions.
So we'll see if there's anything there.
ARUN NAGARAJAN: I actually don't have a link to that
directly, so let me see if I can find it.
IKAI LAN: So-- developers.google.com/live--
so if you're finding this show from our YouTube channel at
youtube.com/googledevelopers, you can always find out about
future live shows at developers.google.com/live.
It's going to take a little bit.
There we go.
ARUN NAGARAJAN: All right, let's see.
So "could you write an Apps Script to integrate with
Salesforce Chatter, Salesforce's social media
channel for the enterprise?
That would be neat." This is Marc R from Waltham.
So the answer is, yes.
So the Chatter API is also exposed to the REST interface.
And you're able to query against it and run clouds
about which people are chatting the most, which
people are liking my posts, and things like that.
So the social enterprise can be brought into the Google
Docs platform as well--
Google Apps platform, I should say.
IKAI LAN: Good question.
ARUN NAGARAJAN: Really good question.
All right, let's see. "You're probably already
planning to do this.
Please include a few minutes of Goo Salesforce for those
who are not using it."
IKAI LAN: For Goo Salesforce.
ARUN NAGARAJAN: I'm not sure what that is, but I'll have to
look into that.
Hopefully, that's a typo.
But maybe they were just talking about just an
introduction to Salesforce.
So another resource that I didn't point out
is this REST API.
So take a look at this one as well.
So salesforce.com/us/developer has all these docs.
And this kind of outlines all the real API endpoints that
they expose--
by objects, by version.
So you can actually go ahead and take a look at how we
figured out the attachment example.
So I can just go in here, go into Working with Records,
Creating a Record.
So this is the example that I used to figure out how to
upload a contact, for instance--
very straightforward.
Cool.
Does that make sense to you?
IKAI LAN: It makes sense to me.
Let's see if he's come in with any more questions.
Because sometimes what happens is, when we're doing these
live shows, more and more questions come in.
And if not, you guys know where to find us and you can
feel free to post comments on the YouTube video as well.
We're going to take a look at this every once in a while and
see if anyone has any new questions or comments.
Again, you can always find us at the standard channels, too.
So all right.
Is there anything else you want to show us?
ARUN NAGARAJAN: Let's see.
I think that that about covers everything that I
want to talk about.
Hopefully this gives you some ideas, some sort of building
blocks with which you can take and build your own cool
applications and workflows.
Think about integrating with the Google Calendar.
Think about doing some interesting things with Gmail
Labels and [? Start ?]
Emails and things like that.
Do you have any other ideas that would make sense in this?
IKAI LAN: Yeah, a very common thing that we used to do is,
sometimes you talk to people, you talk to prospects, and
they're not ready to buy yet.
They don't have budget yet.
But they tell you, I'm going to have budge in Q3 or Q4.
Now, Salesforce does have an interface that says, find me
these people when I should contact them.
But if you're already using Google Calendar, that's
another very interesting use case.
ARUN NAGARAJAN: Yep, setting up reminders and things like
that, that's really cool.
IKAI LAN: Right, and there's so many things that you could
do once you integrate with Google Apps.
You're taking all the power of Salesforce, which you're
likely already using if you're a Salesforce shop, and you're
just extending it.
Because a lot of times I see people that are doing these
very manual things.
ARUN NAGARAJAN: Right, yes.
Any time you find yourself doing something that's mundane
or repeatable, find a way to write a script for that.
IKAI LAN: Right.
OK, so I think that's all we have for today then, isn't it?
ARUN NAGARAJAN: Yeah, that covered all the three things
that I wanted to talk about.
Thank you for watching.
IKAI LAN: Thank you guys for watching.
Again, we'll be having these shows of various topics.
And this is for people that are on the live show.
We'll be doing a show about triggers.
This will be happening next Tuesday.
So check developers.google.com/live,
and you'll be able to see when that show's going to be.
So if you were watching this show and you're thinking,
well, this is all very cool, but I want to periodically
update a spreadsheet, or I want to periodically
send an email out.
Now, I'm pretty sure you can do that in Salesforce.
But suppose you prefer programmatically editing it
and sending it out in Gmail.
Well, you can do that using triggers.
And we'll be talking about how to use triggers.
And that'll be happening next Tuesday.
So again, go to developers.google.com/live.
And you'll be able to find details about future shows.
OK, so yeah, that's our show.
ARUN NAGARAJAN: Thank you very much.
IKAI LAN: Thank you guys very much.
You guys have a great weekend.
And we'll see you next time.