Integration of Google Form with Salesforce causing "405 METHOD_NOT_ALLOWED" error

17 views Asked by At

I'm encountering an issue while attempting to integrate a Google Form with Salesforce. Whenever a form submission occurs,

An error occurred in onFormSubmit: { [Exception: Request failed for https://xxxxxxxx_developper.sandbox.lightning.force.com returned code 405. Truncated server response:
[{"errorCode":"METHOD_NOT_ALLOWED","message":"HTTP Method 'GET' not allowed. Allowed are POST"}] (use muteHttpExceptions option to examine full response)] name: 'Exception' }

// Constants for Salesforce API endpoints
var AUTHORIZE_URL = 'https://test.salesforce.com//services/oauth2/authorize';
var TOKEN_URL = "https://test.salesforce.com/services/oauth2/token";

// Function to handle form submission errors
function handleFormSubmitError(error) {
  console.error('An error occurred in onFormSubmit:', error);
}

// Function to handle successful form submission (assuming successful update)
function handleFormSubmitSuccess() {
  console.log('Form submission successful!');
  // You can add further actions here, like displaying a success message
}

function onFormSubmit(e) {
  try {
    var formResponse = e.response;

    // Check if form response is undefined
    if (!formResponse) {
      console.error('Form response is undefined.');
      return;
    }

    var formItems = formResponse.getItemResponses();

    // Check if form items are undefined or empty
    if (!formItems || formItems.length === 0) {
      console.error('Form items are undefined or empty.');
      return;
    }

    // Get Salesforce access token (assuming asynchronous retrieval)
    getSalesforceToken()
      .then(salesforceTokenData => updateSalesforceLead(formItems, salesforceTokenData))
      .catch(handleFormSubmitError);
  } catch (error) {
    handleFormSubmitError(error);
  }
}

// Function to check if access token is expired (replace with your logic)
function isTokenExpired(tokenData) {
  // Implement logic to check token expiration based on its properties (e.g., expires_at)
  return false; // Placeholder for now
}

function updateSalesforceLead(formItems, salesforceTokenData) {
  // Check if token data or access token is missing
  if (!salesforceTokenData || !salesforceTokenData.access_token) {
    console.error('Failed to get Salesforce access token.');
    return;
  }

  // Prepare Salesforce payload based on form data
  var salesforce_payload = {
    'Email': formItems[0].getResponse(),
    'Num_SIREN__c': formItems[1].getResponse(),
    'Zip_code': formItems[2].getResponse(),
    'Opco': formItems[3].getResponse(),
    'RaisonFormation__c': formItems[4].getResponse(),
    'Benefice_attendus__c': formItems[5].getResponse(),
    'Date_Souhaite__c': formItems[6].getResponse(),
    'NumberOfEmployees': formItems[7].getResponse(),
    'Intra_inter__c': formItems[8].getResponse(),
    'Lieux_formation__c': formItems[9].getResponse(),
    'Message__c': formItems[10].getResponse(),
  };

 
  var feedUrl = 'https://xxxxxx--developper.sandbox.lightning.force.com/services/apexrest/v1/googleform';

  
 var options = {
  method: 'POST', 
  headers: {
    'Authorization': 'Bearer ' + salesforceTokenData.access_token,
    'Content-Type': 'application/json'
  },
  payload: JSON.stringify(salesforce_payload)
};

  
  UrlFetchApp.fetch(feedUrl, options)
    .then(response => {
      console.log('Salesforce response:', response.getContentText());
      handleFormSubmitSuccess(); // Call success handler if response is successful (update logic needed)
    })
    .catch(handleFormSubmitError);
}



async function getSalesforceToken() {
 
  var grant_type = 'password';
  var client_id = 'xxxxxxxxxxx';
  var client_secret = 'xxxxxxxxxx';
  var salesforce_username = 'xxxxxxxxx';
  var salesforce_password = 'xxxxxxxxxxx';

  var payload = {
    'grant_type': grant_type,
    'client_id': client_id,
    'client_secret': client_secret,
    'username': salesforce_username,
    'password': salesforce_password
  };

  try {
    
    var response = await UrlFetchApp.fetch(TOKEN_URL, {
      method: 'post',
      contentType: 'application/x-www-form-urlencoded',
      payload: payload
    });

    if (response.getResponseCode() === 200) {
      var tokenData = JSON.parse(response.getContentText());
      console.log('Salesforce access token obtained successfully:', tokenData.access_token);
      return tokenData;
    } else {
      console.error('Failed to get Salesforce access token. Response:', response.getContentText());
      throw new Error('Failed to get Salesforce access token.');
    }
  } catch (error) {
    console.error('Error fetching Salesforce access token:', error);
    throw error;
  }
}

0

There are 0 answers