Skip to content
This repository has been archived by the owner on Dec 7, 2023. It is now read-only.

Commit

Permalink
Patch to mail-merge solution which address the issue on inline images…
Browse files Browse the repository at this point in the history
… from the Gmail draft (#173)

* Initial commit of Mail Merge solution

Create and distribute visual rich mail merges with Gmail and Google Sheets

* Minor edits to readme text

Edits based on comments in #65 (comment)

* update to head

* Updated to head

* Fix for null error when sending emails without variable tags

Fix for issue #98 on gsuitedevs branch #98

* Refactoring and V8 update

Includes ability for using formatted Google Sheets cell values for currencies, dates and more as well as detecting/ignoring filtered hidden rows. Code also updated to highlight Gmail `.sendMail()` options

* Updated mail merge solution moving Advanced Sheets Service and moving to V8

Removed dependency on Advanced Sheets Service

* Mail merge fix to escape cell data

Fix for #127 to escape cell data to make JSON safe

* Fixed EOF

https://github.com/gsuitedevs/solutions/pull/130/files/a8d745d949b33484dd6a33da4c0dfcfb1202cfdf#r431210317

* Inline image handling for mail merge

Fix for the inline image issue #163

* Nit fix for mail merge #163

* Revert "Inline image handling for mail merge"

This reverts commit 363060c.

* Fix for mail merge inline image handling #163

Added handling of inline images inserted in the Gmail draft via image upload
  • Loading branch information
mhawksey authored Feb 17, 2021
1 parent 1fc1b1c commit aaa2082
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 8 deletions.
2 changes: 1 addition & 1 deletion mail-merge/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ description: Create and distribute visually rich mail merges with Gmail and Goog
labels: Sheets, Gmail
material_icon: merge_type
create_time: 2019-09-13
update_time: 2020-04-29
update_time: 2021-02-14
---

Contributed by Martin Hawksey, follow me on Twitter [@mhawksey](https://twitter.com/mhawksey) or [read my Google Apps Script related blog posts](https://mashe.hawksey.info/category/google-apps-script/).
Expand Down
34 changes: 27 additions & 7 deletions mail-merge/src/Code.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@

/**
* Change these to match the column names you are using for email
* recepient addresses and email sent column.
* recipient addresses and email sent column.
*/
const RECIPIENT_COL = "Recipient";
const EMAIL_SENT_COL = "Email Sent";
Expand Down Expand Up @@ -95,7 +95,8 @@ function sendEmails(subjectLine, sheet=SpreadsheetApp.getActiveSheet()) {
// name: 'name of the sender',
// replyTo: '[email protected]',
// noReply: true, // if the email should be sent from a generic no-reply email address (not available to gmail.com users)
attachments: emailTemplate.attachments
attachments: emailTemplate.attachments,
inlineImages: emailTemplate.inlineImages
});
// modify cell to record email sent date
out.push([new Date()]);
Expand Down Expand Up @@ -124,10 +125,29 @@ function sendEmails(subjectLine, sheet=SpreadsheetApp.getActiveSheet()) {
const draft = drafts.filter(subjectFilter_(subject_line))[0];
// get the message object
const msg = draft.getMessage();
// getting attachments so they can be included in the merge
const attachments = msg.getAttachments();
return {message: {subject: subject_line, text: msg.getPlainBody(), html:msg.getBody()},
attachments: attachments};

// Handling inline images and attachments so they can be included in the merge
// Based on https://stackoverflow.com/a/65813881/1027723
// Get all attachments and inline image attachments
const allInlineImages = draft.getMessage().getAttachments({includeInlineImages: true,includeAttachments:false});
const attachments = draft.getMessage().getAttachments({includeInlineImages: false});
const htmlBody = msg.getBody();

// Create an inline image object with the image name as key
// (can't rely on image index as array based on insert order)
const img_obj = allInlineImages.reduce((obj, i) => (obj[i.getName()] = i, obj) ,{});

//Regexp to search for all img string positions with cid
const imgexp = RegExp('<img.*?src="cid:(.*?)".*?alt="(.*?)"[^\>]+>', 'g');
const matches = [...htmlBody.matchAll(imgexp)];

//Initiate the allInlineImages object
const inlineImagesObj = {};
// built an inlineImagesObj from inline image matches
matches.forEach(match => inlineImagesObj[match[1]] = img_obj[match[2]]);

return {message: {subject: subject_line, text: msg.getPlainBody(), html:htmlBody},
attachments: attachments, inlineImages: inlineImagesObj };
} catch(e) {
throw new Error("Oops - can't find Gmail draft");
}
Expand Down Expand Up @@ -160,7 +180,7 @@ function sendEmails(subjectLine, sheet=SpreadsheetApp.getActiveSheet()) {

// token replacement
template_string = template_string.replace(/{{[^{}]+}}/g, key => {
return escapeData_(data[key.replace(/[{}]+/g, "")]) || "";
return escapeData_(data[key.replace(/[{}]+/g, "")] || "");
});
return JSON.parse(template_string);
}
Expand Down

0 comments on commit aaa2082

Please sign in to comment.