字符串类型和文本输出格式

时间:2019-06-30 14:28:57

标签: javascript html google-apps-script google-sheets

我编写了一个Google Apps脚本,该脚本从新的Google Form条目中提取单个电子表格单元格并通过电子邮件发送其内容。

脚本运行良好,但是单元格内容作为单个文本块发送(删除了换行符,段落等)。 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 :(得分:0)

保持断行

要保留换行符,问题是在HTML中忽略基于文本的换行符(回车\r或换行符\n)。在行之间创建间距的最佳方法是使用专用的"line break" element,或将文本分成单独的元素,然后使用CSS添加间距。

幸运的是,将Google表格换行符转换为HTML确实很容易。只需将messageRange.getValue()更改为messageRange.getValue().replace(/[\r\n]{1,2}/g,"<br>")

高级格式化

如果您要保留更高级的格式(例如颜色和图像),则解决方案会有些棘手。 range.getValue()和事件range.getRichTextValue().getText()均返回纯文本。为了转换为HTML,您需要使用其他方法,例如range.getFontColors();,并将输出解析为CSS并将其与纯文本值组合。有一个名为SheetConverter的专用库可以完成此操作,有关详细信息,请参见this SO answer

我注意到的其他事情:

我注意到您可能想要更改的有关代码的其他事项。您可能已经在我的解决方案中注意到我使用了messageRange.getValue(),但是在您的代码中却有messageRange.getValues()。这是因为您想要一个值,但是range.getValues()是为了获取多个1个单元格范围之外的值。

您的htmlBody中的HTML格式也不正确。您打开了一堆<p>标签,但从未使用</p>关闭它们。

另一件事是,获取最后一行的方式实际上没有任何意义。您检查活动工作表中的“ A:A”的最后一行,但是活动工作表可以更改,并且不能保证与“表单响应”相同,或者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);

}