我编写了一个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> <p>' + messageRange.getValues() + "<p> <p><a href=\"www.some_link.com\">Link here</a>."
};
// send
MailApp.sendEmail(message);
}
答案 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);
}