【问题标题】:String types and text output formatting字符串类型和文本输出格式
【发布时间】:2019-06-30 14:28:57
【问题描述】:

我编写了一个 Google Apps 脚本,它从新的 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);
}

【问题讨论】:

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


    【解决方案1】:

    保持换行符

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

    幸运的是,将 Google 表格换行符转换为 HTML 非常简单。只需将messageRange.getValue() 更改为messageRange.getValue().replace(/[\r\n]{1,2}/g,"&lt;br&gt;")

    高级格式化

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

    我注意到的其他事情:

    我注意到您可能想要更改的代码的其他一些内容。您可能已经在我的解决方案中注意到我使用了messageRange.getValue(),但在您的代码中您使用了messageRange.getValues()。这是因为您需要单个值,但 range.getValues() 用于从 > 1 个单元格的范围内获取多个值。

    您的htmlBody 中的 HTML 格式也不正确。你打开了一堆 &lt;p&gt; 标签,但永远不要用 &lt;/p&gt; 关闭它们。

    另一件事是你得到最后一行的方式并没有真正的意义。您检查活动工作表中“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);
    
    }
    

    【讨论】:

    • 约书亚:成功了。感谢您的帮助,我由衷的感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-12
    • 2012-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    相关资源
    最近更新 更多