3

I'm trying to pass a variable (my name in cell A1) from my code.gs to my Index.html and email it.

Can someone please tell me what I'm doing wrong or point me in the right direction.

Code.gs

function doGet() {
return HtmlService.createHtmlOutputFromFile('Index');
}

function sendEmail() {
var ss = SpreadsheetApp.openById('MY_SPREADSHEET_ID');
var sheet = ss.getSheetByName('Sheet1');

var myName = sheet.getRange(1,1).getValue();

var template = HtmlService.createTemplateFromFile('Index');
var body = template.evaluate().getContent();

// SEND THE EMAIL
MailApp.sendEmail({
  subject:"Test Email",
  to:"[email protected]",
  htmlBody: body,
});

return myName;

Index.html

<!DOCTYPE html>

<html>  
  <body>
  <p><? var data = sendEmail(); ?><?= data ?></p>
  </body>
</html>
7
  • I think the problem is recursion. In order to send the E-mail (function sendEmail) the template has to be evaluated, but in order to evaluate the template the function sendEmail has to be executed -> eternal loop. You can escape it by seperating the sendEmail function from the template into the doGet function. Commented Sep 7, 2015 at 7:16
  • @WimdenHerder sorry but I don't understand how i can separate them. Can you please give and example? Thanks for your help so far! Commented Sep 7, 2015 at 7:53
  • Have you already replaced 'MY_SPREADSHEET_ID' with the actual spreadsheet ID ? It should look similar to this one: 1eTQYnI3jOKtyWF1V1DbuF8pdzpUwRNr9podKcoORD68. Commented Sep 7, 2015 at 18:17
  • Yes Rubén i just put that ID there for the purpose of this question Commented Sep 7, 2015 at 18:52
  • Good. If you will use Index.html to call the sendEmail function you should move the body of your email message to another place. I.E. you could build the body code in Code.gs or use a second HTML file. Commented Sep 7, 2015 at 21:18

2 Answers 2

2

Read this, pushing variables to templates

 function doGet() {
    return HtmlService.createHtmlOutputFromFile('Index');
    }

    function sendEmail() {
    var ss = SpreadsheetApp.openById('MY_SPREADSHEET_ID');
    var sheet = ss.getSheetByName('Sheet1');

    var myName = sheet.getRange(1,1).getValue();

    var template = HtmlService.createTemplateFromFile('Index');
    template.data = myName;
    var body = template.evaluate().getContent();

    // SEND THE EMAIL
    MailApp.sendEmail({
      subject:"Test Email",
      to:"[email protected]",
      htmlBody: body,
});

Index.html

<!DOCTYPE html>

<html>  
  <body>
  <p><strong><?= data ?></strong></p>
  </body>
</html>
Sign up to request clarification or add additional context in comments.

Comments

0

The question was still open when I found it and I had a similar problem, so here is my solution (without doGet()), based on the useful comments from Wim den Herder and Rubén (and the example in the documentation):

Code.gs

function sendEmail() {
var recipient = '[email protected]';
var subject = 'Test Email'; 
var message =     HtmlService.createTemplateFromFile('Index').evaluate().getContent();;


// SEND THE EMAIL 
GmailApp.sendEmail(
      recipient,         
      subject,                            
      message, {                        // body
      htmlBody: message                 // advanced options
    });

}

function getData(){
var ss = SpreadsheetApp.openById('MySpreadSheetId');
var sheet = ss.getSheetByName('Sheet1');
// Data is in cell A1
var myName = sheet.getRange(1,1).getValue();
return myName
}

Index.html

<!DOCTYPE html>

<html>  
  <body>
  <p><strong><? var data = getData() ?><?= data ?></strong></p>
  </body>
</html>

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.