How to add hyperlinks strings within gmail in google sheet using - google-apps-script

I have a google form which connected to a google sheet. When filling out the questionnaire, the user will immediately get a mail based on which options the user chose.
Assume that the option:
A
B
C
D
If the user chose the option A, will get the content(with hyperlinks):
A1(with A1’s hyperlink)
A2(with A1’s hyperlink)
A3(with A1’s hyperlink)
My problem is that I can’t do this at the same time.
I only can do with only plain text.

You need to set de Advanced Options params to the MailApp.send();
For example
MailApp.send({
to: currentEmail,
subject: subjectLine,
htmlBody: `<p>Clic here for details</p>` // This htmlBody param makes an HTML link in Mail Body.
});
To see the full list of Advanced Options visit https://developers.google.com/apps-script/reference/mail/mail-app#advanced-parameters_1

Related

Google Apps Script Gmail getPlainBody Line Breaks

With the Google Apps Script Gmail library, when I use the function GmailMessage.getPlainBody(), the API seems to take what used to be one paragraph and break it up into multiple, potentially by using a character limit. For instance, a paragraph of my email reads:
From the link you sent me, I gleaned that Gmail refers to their secure email as confidential.
But when I call this function on the email, it becomes:
From the link you sent me, I gleaned that Gmail refers to their
secure email as confidential.
And, when I split the email text on a new line delimitor and do a bit of cleanup to create an array with my output, I end up with:
['From the link you sent me, I gleaned that Gmail refers to their', 'secure email as confidential.']
I viewed this Reddit post, which seemed to deal with the similar problem. But, I tried the resolution suggested by the person who posed the question:
body = message.getPlainBody().replace(/\r\n\r\n/gm,'aaaLINEBREAKERaaa').replace(/\r\n/gm,' ').replace(/aaaLINEBREAKERaaa/gm, '\r\r').replace(/ /gm,' ')
And it didn't quite give me what I need. Has anyone else encountered this problem, and if so, do you have a suggested workaround? Thanks!
I had the same issue. In that case, I used a workaround.
When I checked the email, I noticed that the HTML body is included in the message body and the HTML body has the original paragraph, and I used this situation. So, in this workaround, the original text is retrieved from the HTML body and the HTML is converted to a text. By this, the original paragraph is obtained. The sample script is as follows.
Sample script:
This script uses Drive API for converting HTML to text. So pelase enable Drive API at Advanced Google services.
var message = // Here, please use your "message".
var html = message.getBody();
var id = Drive.Files.insert({title: "temp", mimeType: MimeType.GOOGLE_DOCS}, Utilities.newBlob(html, MimeType.HTML)).id;
var text = DocumentApp.openById(id).getBody().getText(); // or DocumentApp.openById(id).getBody().getText().trim();
DriveApp.getFileById(id).setTrashed(true);
console.log(text)
References:
getBody()
Files: insert

Google App Script Attaching an image from an OverGridImage to a MailApp email

I'm trying to create a form using Google Sheets. The user can input data into cells, some stuff is done, and an email is sent. I want to include the ability to add image snips to that email by pasting them over cells in the sheet. I can collect an OverGridImage array using
var images = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Input').getImages();
and I have the email all sorted using
MailApp.sendEmail({
to: email,
cc: cc,
subject: subject,
htmlBody: body,
attachments:attachments
});
}
But I'm very stuck on changing the OverGridImage array into something that I can pass as an attachment to MailApp.
Unfortunately what you want cannot be done. Google Sheets doesn't have the capacity to return the blob of an image, only a reference to the image which means that you cannot retrieve the images and attach them afterwards in an e-mail using Google Apps Script.
An alternative would be to use the =IMAGE() function to insert the images in a cell and afterwards you can retrieve them by using the Sheets API V4.

Embedded Google form in email?

I'm embedded Google form in email by Google apps script but the form doesn't submit correctly from Outlook and from iPhone. It works from Google Mail client only?
Is there's away to solve this problem of submission from iphone or outlook?
Thanks
Amany
To use forms embedded in emails, the email client needs to support html forms. Outlook has its own forms, but does not support the html form element (reference). I haven't found a reference for iPhone, but it's likely that it also limits the html support. (I use the gmail client on my phone... it supports forms.)
If you're using the code from Send form by email and track responses in spreadsheet, then you can extend your script to provide a doGet function for users that don't have HTML Forms support in their email clients.
The previous gist has been updated with these changes. (Actually, the gist already had the doGet() function.)
Code.gs
Extend this code by adding a doGet() function, which will host the exact same form that you're embedding in the email.
/**
* GET handler to provide alternate online form.
*/
function doGet() {
// Build survey body
var template = HtmlService.createTemplateFromFile('emailTemplate');
template.scriptUrl = ScriptApp.getService().getUrl();
template.serialNumber = getGUID(); // Generate serial number for this response
var app = template.evaluate();
return app;
}
Make the following modification to the sendSurvey() function:
var plainText = 'Please complete this survey online at: ' + scriptUrl;
html += '<p>Alternatively, you may complete this survey online.';
// Send email form
GmailApp.sendEmail(recipient, subject, plainText, {htmlBody:html} );
Now, recipients without HTML support in their email client will have a plain text message with an address they can paste into a browser, while HTML clients without <FORM> support will have a clickable link to the online form.

Google Spreadsheet Script Editor MailApp.sendEmail not setting replyTo?

I'm using Google Spreadsheet for customers to send in comments. When they submit a comment, it gets emailed to me. I use the MailApp.sendEmail method. It works as expected except for the replyTo "advanced argument":
var myAdvancedArgs = { htmlBody: myHtmlBody, replyTo: customerEmail };
MailApp.sendEmail("me#example.com", "Comments Form", myBody, myAdvancedArgs);
customerEmail is set properly because I have it output correctly in the body of the message. htmlBody works as I do get the HTML version of the email displaying in my GMail account. However, when I click the reply button in GMail, the To: address is myself. It appears the replyTo is not being set at all. But then I look in the headers of the email message by clicking the little triangle next to my name with the tooltip "Show Details" and it does mention the correct reply-to address:
reply-to: mycustomer#example.com
Is MailApp.sendEmail not setting the reply-to header correctly?
UPDATE: I've snipped a couple images to demonstrate what's happening. Either the reply-to header isn't set properly (maybe that's not how you do a reply to?) or GMail is not working properly for me.
First image, you see that there is a reply-to header created from my Google Spreadsheet script:
Second image, when I click the reply button in GMail, the to address is not filled in with the address in the reply-to header:
I found the reason to your (and my) problem.
What you are seeing is a Gmail bug, not an Apps Script bug. Basically,
if the reply-to is any email address that you have linked with your
address so you can send mail as that account from within gmail, then
reply-to is ignored. In other words, it will look broken to you, but
for any other users of your script it will work properly. Non-Gmail
users will see it work correctly in any case.
This is an old question, but if I needed it maybe others also need it!
From my testing the replyTo worked only when I sent the mail not to the form Acount mail.
If your form is on your#gmail.com acount send it to yourOtherMail#gmail.com
var reply = e.namedValues['Email'];
MailApp.sendEmail("NotFormMail#mail.com", "subject", "message",{"replyTo" : '"'+reply+'"'});
Just tested like this :
function myFunction() {
MailApp.sendEmail("serge----#gmail.com ", "test message",'empty body', {"replyTo" : "serge_test#yopmail.com"}); // replyTo son#insas
}
and it works as expected when I "reply" (using the reply button in gmail or in any mail client ) it shows up like this :
which is indeed the replyTo adress even if it is true that the sender is indeed the author of the script (which is also the expected behavior, see documentation about scripts)
So I'm afraid the issue you raised is invalid...

How to access or call "Send this form to others"?

I have a form attached to a Google Apps spreadsheet. It's a form to let my coworkers submit agenda items to our weekly review meeting. I'm writing a script to automatically email a reminder to the relevant people.
To make it less annoying & tedious for them, I'd like to actually embed the form within the email. Google Docs provides a way to manually send a form: Spreadsheet > Form > Send form. However, I can't find any way in the Google Apps Scripts documentation that lets me trigger this functionality, e.g.
A method like sendFormInEmail
Access to the email-friendly form HTML, which I could assign to the htmlBody argument of the sendEmail method.
Trigger an arbitrary menu item in Google Apps
Something else?
I could do a workaround by extracting the generated HTML from an email and assigning it as the htmlBody argument, but then I'd have to manually update the html every time we want to make a change to the form -- not what I want to happen.
Any suggestions?
Joris, you're right. You can use the method fetch() to send the form's html to the user's mailbox:
var form = FormApp.create('New Form');
....
var url = form.getPublishedUrl();
var response = UrlFetchApp.fetch(url);
var htmlBody = HtmlService.createHtmlOutput(response).getContent();
MailApp.sendEmail({
to: email,
subject: subject,
htmlBody: htmlBody,
});
...
I have the exact same requirement as you do, but unfortunately there doesn't seem to be an API call that does this.
What I think might work (though I have yet to actually try this) is to use the Spreadsheet.getFormUrl method to get the form URL, then use UrlFetchAp.fetch to obtain the HTML for the spreadsheet form, and then use that HTML as the e-mail body.
Like I said, I don't know if this will work (though on paper it should!), but I'd be very interested to know if it did!