Skip to content

Commit b9b1b3f

Browse files
author
Eric Koleda
authored
Merge pull request #75 from jordan-cook/patch-1
Create salesforce.gs
2 parents d460b69 + d26662e commit b9b1b3f

File tree

2 files changed

+159
-0
lines changed

2 files changed

+159
-0
lines changed

samples/Salesforce.gs

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
/**
2+
* Saleforce's Auth flow https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/quickstart_oauth.htm
3+
*/
4+
5+
var CLIENT_ID = '...';
6+
var CLIENT_SECRET = '...';
7+
8+
/**
9+
* Authorizes and makes a request to the Saleforce API.
10+
*/
11+
function run() {
12+
var service = getService();
13+
if (service.hasAccess()) {
14+
// GET requests require access_token parameter
15+
16+
var response = UrlFetchApp.fetch(service.getToken().instance_url + '/services/data/v24.0/chatter/users/me', {
17+
headers: {
18+
Authorization: 'Bearer ' + service.getAccessToken()
19+
}
20+
});
21+
var result = JSON.parse(response.getContentText());
22+
Logger.log(JSON.stringify(result, null, ' '));
23+
} else {
24+
var authorizationUrl = service.getAuthorizationUrl();
25+
Logger.log('Open the following URL and re-run the script: %s',
26+
authorizationUrl);
27+
}
28+
}
29+
30+
/**
31+
* Reset the authorization state, so that it can be re-tested.
32+
*/
33+
function reset() {
34+
var service = getService();
35+
service.reset();
36+
}
37+
38+
/**
39+
* Configures the service.
40+
*/
41+
function getService() {
42+
return OAuth2.createService('Saleforce')
43+
// Set the endpoint URLs.
44+
.setAuthorizationBaseUrl('https://login.salesforce.com/services/oauth2/authorize')
45+
.setTokenUrl('https://login.salesforce.com/services/oauth2/token')
46+
47+
// Set the client ID and secret.
48+
.setClientId(CLIENT_ID)
49+
.setClientSecret(CLIENT_SECRET)
50+
51+
// Set the name of the callback function that should be invoked to complete
52+
// the OAuth flow.
53+
.setCallbackFunction('authCallback')
54+
55+
// Set the property store where authorized tokens should be persisted.
56+
.setPropertyStore(PropertiesService.getUserProperties());
57+
}
58+
59+
/**
60+
* Handles the OAuth callback.
61+
*/
62+
function authCallback(request) {
63+
var service = getService();
64+
var authorized = service.handleCallback(request);
65+
if (authorized) {
66+
return HtmlService.createHtmlOutput('Success!');
67+
} else {
68+
return HtmlService.createHtmlOutput('Denied');
69+
}
70+
}
71+
72+
/**
73+
* Logs the redict URI to register in the Saleforce Apps Page.
74+
*/
75+
function logRedirectUri() {
76+
var service = getService();
77+
Logger.log(service.getRedirectUri());
78+
}

samples/salesforce.gs

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
// You must create a new connected app in your Salesforce org in order to obtain the CLIENT_ID and CLIENT_SECRET
2+
// You must retrieve the Script ID, and supply the callback URL accordingly in your connected app settings
3+
4+
var AUTHORIZE_URL = 'https://login.salesforce.com/services/oauth2/authorize';
5+
var TOKEN_URL = 'https://login.salesforce.com/services/oauth2/token';
6+
var CLIENT_ID = "xxxx";
7+
var CLIENT_SECRET = "xxxx";
8+
var REDIRECT_URL = "https://script.google.com/macros/d/{SCRIPT_ID}/usercallback";
9+
var PROPERTY_STORE = PropertiesService.getUserProperties();
10+
11+
12+
function getSalesforceService() {
13+
// Create a new service with the given name. The name will be used when
14+
// persisting the authorized token, so ensure it is unique within the
15+
// scope of the property store
16+
return OAuth2.createService('Salesforce')
17+
18+
.setAuthorizationBaseUrl(AUTHORIZE_URL)
19+
.setTokenUrl(TOKEN_URL)
20+
21+
// Set the client ID and secret, from the Salesforce Connected App
22+
.setClientId(CLIENT_ID)
23+
.setClientSecret(CLIENT_SECRET)
24+
25+
// Set the name of the callback function in the script referenced
26+
// above that should be invoked to complete the OAuth flow.
27+
.setCallbackFunction('authCallback')
28+
29+
// Set the property store where authorized tokens should be persisted.
30+
.setPropertyStore(PROPERTY_STORE)
31+
32+
// Salesforce specific params
33+
.setParam('response_type', 'code')
34+
.setParam('display', 'popup');
35+
}
36+
37+
function showSidebar() {
38+
var salesforceService = getSalesforceService();
39+
//if (!salesforceService.hasAccess()) {
40+
var authorizationUrl = salesforceService.getAuthorizationUrl();
41+
var template = HtmlService.createTemplate(
42+
'<a href="<?= authorizationUrl ?>" target="_blank">Authorize</a>. ' +
43+
'Reopen the sidebar when the authorization is complete.');
44+
template.authorizationUrl = authorizationUrl;
45+
var page = template.evaluate();
46+
SpreadsheetApp.getUi().showSidebar(page);
47+
//DocumentApp.getUi().showSidebar(page);
48+
//} else {
49+
// ...
50+
//}
51+
}
52+
53+
function authCallback(request) {
54+
var salesforceService = getSalesforceService();
55+
var isAuthorized = salesforceService.handleCallback(request);
56+
if (isAuthorized) {
57+
return HtmlService.createHtmlOutput('Success! You can close this tab.');
58+
} else {
59+
return HtmlService.createHtmlOutput('Denied. You can close this tab');
60+
}
61+
}
62+
63+
function whoAmI() {
64+
var salesforceService = getSalesforceService();
65+
var token = salesforceService.getAccessToken();
66+
var instanceURL = salesforceService.getToken_().instance_url;
67+
var response = UrlFetchApp.fetch(instanceURL + '/services/data/v24.0/chatter/users/me', {
68+
headers: {
69+
Authorization: 'Bearer ' + token
70+
}
71+
});
72+
Logger.log(response);
73+
}
74+
75+
function onOpen(e) {
76+
SpreadsheetApp.getUi()
77+
.createMenu('Salesforce Connect')
78+
.addItem('Authorize', 'showSidebar')
79+
.addItem('WhoAmI', 'whoAmI')
80+
.addToUi();
81+
}

0 commit comments

Comments
 (0)