Назначение HTML-контента переменной в Google Spreadsheet Script

Я пытаюсь выполнить автопочту с помощью скрипта в Google Spreadsheet, чтобы отправить почту всем своим клиентам одновременно. Но каждый раз, когда я пытаюсь запустить скрипт, он говорит, что я неправильно назначил содержимое HTML переменной.

Код скрипта для присвоения значения был таким:

function sendMail(){

  var name = 1;
  var email = 2;
  var userEmail = 3;
  var password = 4;

  var emailTemp = HtmlService.createTemplateFromFile("MailApp");
  var ws = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Copy of OneDrive Cloud Storage");

  var data = ws.getRange("B2:E" + ws.getLastRow()).getValues();

  data.forEach(function(row){
    emailTemp.name = row[name];
    emailTemp.userEmail = row[userEmail];
    emailTemp.password = row[password];
    emailTemp.email = row[email];

    var htmlMessage = emailTemp.evaluate().getContent();

    GmailApp.sendEmail(
      row[email],
      "OneDrive 5TB Storage",
      "Your email doesn't support HTML.",
      {name: "AutoMail by Shovon", htmlBody: htmlMessage}
    );
  });
}

Ошибка была в строке: var htmlMessage = emailTemp.evaluate().getContent(); В сообщении об ошибке говорится:

Сообщение об ошибке

Я также прикрепляю HTML-код:

<html>
  <head>
    <base target="_top">
  </head>
  <body>
  <p>Dear <b> <?= name ?>, </b> </p>
  <p>I received your <b>OneDrive 5TB Cloud Storage</b> request yesterday. I'm really very sorry for being so late as I had some personal things to do.</p>
  <p>But the good news is I've successfully created the following <b>OneDrive Business Account</b> for you: </p>
  <p> User email:<b> <u><? = userEmail?> </u> </b> <br>
   Password: <b> <?= password?> </b> </p>
   <p> Please login to this <b> Microsoft</b> account as soon as possible and set up 2 steps verification method by using your own email address(e.g. <b> <u> <?= email ?> </u> </b>).</p>
   <p>To login <b> <u> <a href = "https://login.live.com/login.srf?wa=wsignin1.0&rpsnv=13&ct=1590813490&rver=7.0.6738.0&wp=MBI_SSL&wreply=https:%2F%2Faccount.microsoft.com%2Fauth%2Fcomplete-signin%3Fru%3Dhttps%253A%252F%252Faccount.microsoft.com%252F%253Frefp%253Dsignedout-index%2526refd%253Dwww.bing.com&lc=1033&id=292666&lw=1&fl=easi2">click here</a></u></b>.</p>
   <p>Yours,<br>
   <b>Md. Shahariar Shovon</b></p>
  </body>
</html>


Пожалуйста, помогите мне решить эту проблему.


person Shovon Showrov    schedule 30.05.2020    source источник
comment
Это var data = ws.getRange("B2:E" + ws.getLastRow()).getValues(); должно быть var data = ws.getRange("B2:E" + ws.getLastRow()-1).getValues();   -  person Cooper    schedule 30.05.2020
comment
Если имя находится в столбце B, то это var name = 1; должно быть этим var name = 0;, а все остальные должны быть уменьшены на единицу. Массивы, начинающиеся с нулевого столбца, начинаются с 1, а ваш диапазон начинается с столбца B, и у вас есть только 4 столбца, поэтому они должны быть 0,1,2 и 3 для индексов.   -  person Cooper    schedule 30.05.2020
comment
Мой первый столбец был отметкой времени, и я пропустил его.   -  person Shovon Showrov    schedule 31.05.2020


Ответы (2)


У вас опечатка.

<? = userEmail?> 

должно быть

<?= userEmail?> 

Таким образом, сценарий приложения пытается оценить код javascript «= userMail» вместо простого «userMail», который, по-видимому, недействителен.

person roma    schedule 30.05.2020

Вам не нужен HtmlService, так как «Служба HTML позволяет обслуживать веб-страницы, которые могут взаимодействовать с функциями сценариев приложений на стороне сервера». и это его вариант использования.

Так что просто создайте HTML с помощью JavaScript, а затем поместите его в тело. Например, представьте это в цикле for.

const infoObj = {
  name: row[name],
  email: row[userEmail]
}
const emailBody = createEmailBody( infoObj );
const params = {
   name: "AutoMail by Shovon",
   htmlBody: emailBody.html
}

GmailApp.sendEmail(infoObj.email, subject, emailBody.plain, params);

// here you can create your html body
function createEmailBody( info ) {
  return {
    plain: `Hi ${info.name}, this is your ${info.email}`,
    html: `<div>Hi ${info.name}, this is your email ${info.email} </div>`
  }
}
person Neven Subotic    schedule 30.05.2020