Skip to content

Instantly share code, notes, and snippets.

@erickoledadevrel
Last active November 30, 2022 12:57
Show Gist options
  • Star 15 You must be signed in to star a gist
  • Fork 3 You must be signed in to fork a gist
  • Save erickoledadevrel/11143648 to your computer and use it in GitHub Desktop.
Save erickoledadevrel/11143648 to your computer and use it in GitHub Desktop.
Send a Google Doc in an email using Apps Script
/**
* Sends an email using the contents of a Google Document as the body.
*/
function sendDocument(documentId, recipient, subject) {
var html = convertToHtml(documentId);
html = inlineCss(html);
GmailApp.sendEmail(recipient, subject, null, {
htmlBody: html
});
}
/**
* Converts a file to HTML. The Advanced Drive service must be enabled to use
* this function.
*/
function convertToHtml(fileId) {
var file = Drive.Files.get(fileId);
var htmlExportLink = file.exportLinks['text/html'];
if (!htmlExportLink) {
throw 'File cannot be converted to HTML.';
}
var oAuthToken = ScriptApp.getOAuthToken();
var response = UrlFetchApp.fetch(htmlExportLink, {
headers:{
'Authorization': 'Bearer ' + oAuthToken
},
muteHttpExceptions: true
});
if (!response.getResponseCode() == 200) {
throw 'Error converting to HTML: ' + response.getContentText();
}
return response.getContentText();
}
/**
* Inlines CSS within an HTML file using the MailChimp API. To use the API you must
* register for an account and then copy your API key into the script property
* "mailchimp.apikey". See here for information on how to find your API key:
* http://kb.mailchimp.com/article/where-can-i-find-my-api-key/.
*/
function inlineCss(html) {
var apikey = CacheService.getPublicCache().get('mailchimp.apikey');
if (!apikey) {
apikey = PropertiesService.getScriptProperties().getProperty('mailchimp.apikey');
CacheService.getPublicCache().put('mailchimp.apikey', apikey);
}
var datacenter = apikey.split('-')[1];
var url = Utilities.formatString('https://%s.api.mailchimp.com/2.0/helper/inline-css', datacenter);
var response = UrlFetchApp.fetch(url, {
method: 'post',
payload: {
apikey: apikey,
html: html,
strip_css: true
}
});
var output = JSON.parse(response.getContentText());
if (!response.getResponseCode() == 200) {
throw 'Error inlining CSS: ' + output['error'];
}
return output['html'];
}
@fsperoni
Copy link

fsperoni commented Feb 4, 2020

Hello Eric. I was trying to use your script and I'm getting an error on line 49 that says:
"Exception: Request failed for https://us4.api.mailchimp.com returned code 500. Truncated server response: {"status":"error","code":104,"name":"Invalid_ApiKey","error":"API key can not be blank"} (use muteHttpExceptions option to examine full response)"
I have created an account in mailchimp using the same email address I'm signed in to Apps Scripts. The API has been generated and I replaced it in the script along with the quotation marks. I'm not sure what I could be missing, wondering if you could please assist me.
Thank you,
Fabio

@erickoledadevrel
Copy link
Author

It could be that you cached an empty value first, before entering the key correctly. You'll just need to debug it more.

@fsperoni
Copy link

fsperoni commented Feb 5, 2020

I see, thank you Eric

@e-dong
Copy link

e-dong commented Mar 31, 2022

This still works for me, it is not deprecated. You just need to make sure you enable the Drive API under services.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment