Search code examples
javascriptfacebook-graph-apigoogle-apps-scriptfacebook-marketing-api

How to fix "Exception: Limit Exceeded" error when trying to upload an image to Graph API using Google Apps Script?


I am using Facebook Graph API to create a Facebook ads campaign with Google Apps Script.

I need to upload an image to my Facebook ad account. I have already tried to use the image bytes as a Base64 UTF-8 string, but when I call the API I get:

Exception: Limit Exceeded: URLFetch URL Length.

Basically, the string is too long.

I am using the following code:

function uploadTest2() {
  var image_id = 'blabla';
  var image_blob = DriveApp.getFileById(image_id).getBlob();
  var input = image_blob.getBytes();
  var docImg = Utilities.base64Encode(input);
  
  var account_id = '1111111111111';
  var facebookUrl = 
    'https://graph.facebook.com/v7.0' +
    '/act_' + account_id +
    '/adimages?bytes=' + docImg +
    '&access_token=' + TOKEN;
  Logger.log(facebookUrl);

  //var encodedFacebookUrl = encodeURI(facebookUrl);
  var options = {
    'method' : 'post'
  };

  var response = UrlFetchApp.fetch(facebookUrl, options);
  var results = JSON.parse(response);
  Logger.log(response);
}

The image does not exceed 5MB and I have already check the bytes string with an online decoder to verify it.

Do you have any idea on how to use the image URL directly in the post request?


The second version of the code:

function uploadTest2() {
  var image_id = 'blabla';
  var image_blob = DriveApp.getFileById(image_id).getBlob();
  var input = image_blob.getBytes();
  var docImg = Utilities.base64Encode(input);
  
  var account_id = '1111111111111';
  var facebookUrl = 
    'https://graph.facebook.com/v7.0' +
    '/act_' + account_id +
//    '/adimages?bytes=' + encodedImage +
//    '&access_token=' + TOKEN;
    '/adimages?access_token=' + TOKEN;
  Logger.log(facebookUrl);

  //var encodedFacebookUrl = encodeURI(facebookUrl);
  var options = {
    'method' : 'post',
    'payload' : image_blob
  }; 

  var response = UrlFetchApp.fetch(facebookUrl, options);
  var results = JSON.parse(response);
  Logger.log(response);
}

Solution

  • In order to make a post request of an image with UrlFetchApp.fetch() you must provide the method, payload (i.e the body you want to POST) and sometimes the content type (if what we are passing is not a JavaScript object).

    If you want to pass a base64Encode object obtained from a blob you should stringify this JSON object.

    What the original poster was missing was to pass the payload and after my contribution, they finally solved the issue by editing the options variable such as:

    var options = {
       'method' : 'post',
       'contentType': 'application/json',
       'payload': JSON.stringify({"bytes": docImg,"name" : 'Test'})};
       }
    

    Documentation reference: Class UrlFetchApp.