Skip to main content

Latest Post

Custom Metadata Types vs Custom Settings vs Custom Labels

  Custom Metadata Types vs Custom Settings vs Custom Labels 💬 In plain words:  Three lookalikes: Custom Metadata = configuration that DEPLOYS with your code (best for app settings). Custom Settings = org/user-specific values, changeable at runtime (hierarchy type is great for bypass switches). Custom Labels = translatable text for the UI. 📌 Example:  API endpoint URLs per environment → Custom Metadata (deploys with code, sandbox vs prod values). A 'Bypass_Automation__c' checkbox an admin flips during data load → hierarchy Custom Setting. The word 'Submit' translated to Hindi → Custom Label. 🎬 Real-Life Example: The Fee Table Trapped Inside Code  Skyline charges a different delivery fee per city. Apex needs those rates on every booking. The Old/Bad Way:  if (city == 'Delhi') fee = 50. Else if (city == 'Mumbai') fee = 65. … Every rate change is a code change, a test run, and a deployment. Why this is bad:  Business data is trappe...

Integrating Google Bulk API with Apex Code in Salesforce

Introduction:

The Google Bulk API provides a powerful way to manage and manipulate large sets of data in Google services. In this blog post, we will explore how to integrate the Google Bulk API with Apex code in Salesforce, allowing you to efficiently process and manipulate bulk data in Google services such as Google Sheets. We will provide code examples and step-by-step instructions to help you get started with the integration.


Step 1: Set Up the Google Bulk API:


1. Enable the Google Sheets API:


  •  Go to the Google API Console (https://console.developers.google.com/).
  •  Create a new project or select an existing one.
  •  Enable the Google Sheets API for the project.

2. Obtain API Credentials:


  •  Create API credentials (OAuth 2.0 Client ID) for your project.
  •  Make sure to set the correct redirect URI.

Step 2: Apex Code Integration:


public class GoogleBulkAPIIntegration {

    // Google Bulk API Endpoint URLs

    private static final String AUTH_ENDPOINT = 'https://accounts.google.com/o/oauth2/auth';

    private static final String TOKEN_ENDPOINT = 'https://accounts.google.com/o/oauth2/token';

    private static final String BULK_API_ENDPOINT = 'https://www.googleapis.com/batch';


    // Google Bulk API Client ID and Secret

    private static final String CLIENT_ID = '<YOUR_CLIENT_ID>';

    private static final String CLIENT_SECRET = '<YOUR_CLIENT_SECRET>';

    private static final String REDIRECT_URI = '<YOUR_REDIRECT_URI>';


    // Google Bulk API Scopes

    private static final String[] SCOPES = new String[]{'https://www.googleapis.com/auth/spreadsheets'};


    // Access Token variables

    private static String accessToken;

    private static String refreshToken;


    // Authenticate with Google Bulk API

    public static void authenticate() {

        String authUrl = AUTH_ENDPOINT + '?response_type=code' +

                '&client_id=' + EncodingUtil.urlEncode(CLIENT_ID, 'UTF-8') +

                '&redirect_uri=' + EncodingUtil.urlEncode(REDIRECT_URI, 'UTF-8') +

                '&scope=' + EncodingUtil.urlEncode(String.join(' ', SCOPES), 'UTF-8');


        // Redirect the user to the Google Bulk API authorization page

        PageReference authPage = new PageReference(authUrl);

        authPage.setRedirect(true);

    }


    // Callback method to retrieve the access token

    public static void getToken(String code) {

        Http http = new Http();

        HttpRequest request = new HttpRequest();

        request.setEndpoint(TOKEN_ENDPOINT);

        request.setMethod('POST');

        request.setHeader('Content-Type', 'application/x-www-form-urlencoded');


        String requestBody = 'code=' + EncodingUtil.urlEncode(code, 'UTF-8') +

                '&client_id=' + EncodingUtil.urlEncode(CLIENT_ID, 'UTF-8') +

                '&client_secret=' + EncodingUtil.urlEncode(CLIENT_SECRET, 'UTF-8') +

                '&redirect_uri=' + EncodingUtil.urlEncode(REDIRECT_URI, 'UTF-8') +

                '&grant_type=authorization_code';


        request.setBody(requestBody);


        HttpResponse response = http.send(request);

        if (response.getStatusCode() == 200) {

            Map<String, Object> responseMap = (Map<String, Object>) JSON.deserializeUntyped(response.getBody());


            accessToken = (String) responseMap.get('access_token');

            refreshToken = (String) responseMap.get('refresh_token');

        }

    }


    // Method to perform bulk operations with the Google Bulk API

    public static void performBulkOperations() {

        Http http = new Http();

        HttpRequest request = new HttpRequest();

        request.set


Endpoint(BULK_API_ENDPOINT);

        request.setMethod('POST');

        request.setHeader('Authorization', 'Bearer ' + accessToken);

        request.setHeader('Content-Type', 'multipart/mixed; boundary=batch');


        // Construct the batch request body

        String requestBody = '--batch\r\n' +

                'Content-Type: application/http\r\n\r\n' +

                'GET /sheets/v4/spreadsheets/{spreadsheetId}/values/Sheet1!A1:D4 HTTP/1.1\r\n' +

                'Authorization: Bearer ' + accessToken + '\r\n\r\n' +

                '--batch\r\n' +

                'Content-Type: application/http\r\n\r\n' +

                'PUT /sheets/v4/spreadsheets/{spreadsheetId}/values/Sheet1!E1:E4 HTTP/1.1\r\n' +

                'Authorization: Bearer ' + accessToken + '\r\n\r\n' +

                '["Value1","Value2","Value3","Value4"]\r\n' +

                '--batch--';


        request.setBody(requestBody);


        HttpResponse response = http.send(request);

        if (response.getStatusCode() == 200) {

            // Process the response of the batch operation

            // ...

        }

    }

}


Step 3: Use the Google Bulk API Integration:


To use the Google Bulk API integration, you need to call the methods from the GoogleBulkAPIIntegration class. For example:


// Step 1: Redirect the user to the Google Bulk API authorization page

GoogleBulkAPIIntegration.authenticate();


// Step 2: Implement the callback method to retrieve the access token

String authorizationCode = '<Authorization_Code_from_Google_Redirect>';

GoogleBulkAPIIntegration.getToken(authorizationCode);


// Step 3: Perform bulk operations with the Google Bulk API

GoogleBulkAPIIntegration.performBulkOperations();


Remember to replace <YOUR_CLIENT_ID>, <YOUR_CLIENT_SECRET>, and <YOUR_REDIRECT_URI> with your actual Google Bulk API credentials and redirect URI.


Note: This example covers basic operations, and you may need to handle additional scenarios like handling access token expiration and constructing valid requests according to the Google Bulk API documentation (https://developers.google.com/sheets/api/guides/batchupdate). Ensure that you comply with Google's API usage policies and guidelines while integrating with external services.


Conclusion:


Integrating the Google Bulk API with Apex code in Salesforce allows you to efficiently manage and manipulate large sets of data in Google services. By following the steps and using the provided code examples, you can leverage the power of the Google Bulk API to perform batch operations on Google Sheets or other Google services within your Salesforce org.


Please note that the provided code is a starting point, and you may need to adapt it based on your specific use case and requirements. Happy integrating with the Google Bulk API in Salesforce!

Popular Posts

Salesforce LWC Code for Multi-Select Lookup

Introduction: In Salesforce Lightning Web Components (LWC), implementing a multi-select lookup field can enhance the user experience and provide greater flexibility for selecting multiple related records. In this blog post, we will walk through the process of creating a multi-select lookup field using LWC. We will cover the required code snippets and provide step-by-step instructions to help you implement this functionality in your Salesforce org.