Сопоставить элементы с файлом html в файле скрипта Google Apps - PullRequest
1 голос
/ 10 марта 2020

У меня есть Google Apps Script WebApp, который автоматизирует электронную почту для определенных событий с помощью webhooks.

У меня есть массив объектов, которые мне нужно сопоставить с файлом шаблона html в том же каталоге.

Например, мой файл Code.gs выглядит так:

function doThing() {
  if ('Some condtition' === true) {
    let template = HtmlService.createTemplateFromFile('my-template')

    let items = [
      { name: 'John Smith', age: 20, address: '123 fakestreet' },
      { name: 'Sam Smith', age: 27, address: '123 fakestreet' },
      { name: 'Phil Smith', age: 10, address: '123 fakestreet' }
    ]

    template.items = items

    MailApp.sendEmail({
      to: 'John@gmail.com',
      subject: 'This is an automated email',
      htmlBody: template.evaluate().getContent()
    })
  }
}

И файл my-template. html выглядит следующим образом:

<body>
<!-- This is how to call the passed variable -->
    <?= items ?> 

    <!-- I want to map my items like this -->
    <div>
        <div>John Smith</div>
        <div>20</div>
        <div>123 fakestreet</div>
    </div>
    <div>
        <div>Sam Smith</div>
        <div>27</div>
        <div>123 fakestreet</div>
    </div>
    <div>
        <div>Phil Smith</div>
        <div>10</div>
        <div>123 fakestreet</div>
    </div>
</body>

У меня есть попытался использовать теги сценария в файле html, но они, похоже, не выполняются, возможно, из-за его отправки по электронной почте.

Я также попытался отобразить каждый элемент в строку и передать строку в html вот так:

let items = '<div>
        <div>John Smith</div>
        <div>20</div>
        <div>123 fakestreet</div>
    </div>
    <div>
        <div>Sam Smith</div>
        <div>27</div>
        <div>123 fakestreet</div>
    </div>...'

Но это просто записывает строку с тегами.

Ответы [ 2 ]

2 голосов
/ 10 марта 2020

Вам нужно l oop над items, используя стандартные скрипты :

<? for(const item of items){?>
   <div>
        <div><?= item.name ?></div>
        <div><?= item.age ?></div>
        <div><?= item.address ?></div>
    </div>
<? } ?>
1 голос
/ 10 марта 2020

Скриплеты

Согласно документам, существует ровно три типа скриплетов:

  1. Стандарт - заключенный код выполняется с без вывода
  2. Печать - возврат значение экранирование и вывод
  3. Принудительная печать - то же самое, что и печать, но значение не экранировано

Различие между печатью и принудительной печатью может быть легче увеличить asp визуально:

document.querySelector('#escaped').textContent += '<a href="#">this is a link</a>';

Что еще попробовать

Поскольку вы, вероятно, используете V8 и, скорее всего, не имеете дело с ненадежным вводом (в items) Array, вы можете воспользоваться новейшими функциями (+ я согласен, что оценка шаблона для простой разметки излишне):

Нет шаблона

const divify = (text) => `<div>${text}</div>`;

const itemsMarkup = items
  .map(item => {
    const { address, age, name } = item;
    return divify(divify(name) + divify(age) + divify(address));
  })
  .join("");

Примечания

  1. === true в условных выражениях обычно чрезмерны, они будут выполнять блок, связанный с результатом истинности / ложности при оценке выражения (обратите внимание, что строки также правдиво): if('Some condtition').
  2. , поскольку его отправлено по электронной почте - нет, оценка выполняется до sendEmail(), ключ htmlBody получает строку html, полученную в результате оценки шаблона и последующего содержимого извлечение.
  3. mid-edit-note : поскольку ответ TheMaster и комментарий Tanaike касаются проблемы, поэтому я изменил ответ в качестве дополнительного объяснения.
  4. действительно нужен тег <body>, div будет отображаться просто отлично (если вы чувствуете, что педанти c - заверните их в <div>)?

Ссылка

Истина значения в JS Инициализатор объекта ссылка Шаблон HTML направляющая
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...