Типы строк и форматирование вывода текста - PullRequest
1 голос
/ 30 июня 2019

Я написал скрипт Служб Google, который извлекает одну ячейку электронной таблицы из новых записей формы Google и отправляет ее содержимое по электронной почте.

Сценарий работает хорошо, но содержимое ячейки отправляется как один блоктекст (новые строки, абзацы и т. д. удаляются).Запись в форме Google имеет тип «Абзац / длинный текст», и я хотел бы сохранить форматирование авторов в сгенерированном электронном письме.

Я работаю со строковыми типами, но не могу найти нужногосочетание.Любой совет будет очень ценен.Код ниже.

function SendEmail() {

    // find out how many rows exist
    var numRows = SpreadsheetApp.getActiveSheet().getRange("A:A").getLastRow();

    // fetch entry
    var messageRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Form Response").getRange("D" + numRows);

    // build message
    var message = {
        to: "destination@email.net",
        subject: "New Entry Posted",
        htmlBody: 'Hello, a new entry was posted.<p>&nbsp;<p>' + messageRange.getValues() + "<p>&nbsp;<p><a href=\"www.some_link.com\">Link here</a>."
    };

    // send
    MailApp.sendEmail(message);
}

1 Ответ

0 голосов
/ 01 июля 2019

Сохранение разрывов строк

Для сохранения разрывов строк проблема заключается в том, что разрывы строк на основе текста (возврат каретки, \r или перевод строки, \n) игнорируются в HTML.Лучший способ создать интервал между строками - это использовать выделенный элемент «разрыв строки» или разделить текст на отдельные элементы и добавить интервал с помощью CSS.

К счастью, преобразование строки Google Sheetsвзломать HTML действительно легко.Просто измените messageRange.getValue() на messageRange.getValue().replace(/[\r\n]{1,2}/g,"<br>").

Расширенное форматирование

Если вы хотите сохранить более сложное форматирование, такое как цвета и изображения, решение становится немного сложнее.И range.getValue(), и событие range.getRichTextValue().getText() оба возвращают простой текст.Чтобы преобразовать в HTML, вам нужно использовать кучу других методов, таких как range.getFontColors();, и проанализировать вывод в CSS и объединить его со значением простого текста.Для этого есть специальная библиотека SheetConverter , и вы можете посмотреть этот SO-ответ для подробностей.

Другие вещи, которые я заметил:

Я заметил несколько других вещей в вашем коде, которые вы можете изменить.Возможно, вы заметили в моем решении, что я использовал messageRange.getValue(), но в вашем коде у вас есть messageRange.getValues().Это потому, что вам нужно одно значение, но range.getValues() предназначено для получения нескольких значений из диапазона> 1 ячеек.

В вашем htmlBody также есть некорректный HTML.Вы открываете кучу <p> тегов, но никогда не закрываете их с помощью </p>.

Другое дело, что способ получения последнего ряда на самом деле не имеет смысла.Вы проверяете последнюю строку «A: A» на активном листе, но активный лист может измениться, и нет никакой гарантии, что он совпадает с «Form Response», или что A: A имеет ту же последнюю строку, что и D: D.Я думаю, что более безопасным решением было бы что-то вроде этого (которое также включает вышеупомянутые рекомендуемые изменения):

function SendEmail() {

    var formResponseSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Form Response");

    // fetch entry
    var messageRange = formResponseSheet.getRange("D" + formResponseSheet.getLastRow());

    // build message
    var message = {
        to: "destination@email.net",
        subject: "New Entry Posted",
        htmlBody: 'Hello, a new entry was posted.<p>' + messageRange.getValue().replace(/[\r\n]{1,2}/g,"<br>") + "</p><a href=\"www.some_link.com\">Link here</a>."
    };

    // send
    MailApp.sendEmail(message);

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...