如何在调用时删除所有格式标记:
GmailApp.getInboxThreads()[0].getMessages()[0].getBody()
使文本的唯一剩余部分是可以阅读的文本。
格式化可以被破坏;正文中的文本只需要解析,但标签如:
"&"
<br>
以及其他可能需要删除。
答案 0 :(得分:12)
即使Apps Script中没有DOM,您也可以解析HTML并以这种方式获取纯文本:
function getTextFromHtml(html) {
return getTextFromNode(Xml.parse(html, true).getElement());
}
function getTextFromNode(x) {
switch(x.toString()) {
case 'XmlText': return x.toXmlString();
case 'XmlElement': return x.getNodes().map(getTextFromNode).join('');
default: return '';
}
}
致电
getTextFromHtml("hello <div>foo</div>& world <br /><div>bar</div>!");
将返回
“你好foo&amp; world bar!”。
为了解释,第二个参数为“true”的Xml.parse将文档解析为HTML页面。然后我们遍历文档(将修补缺少的HTML和BODY元素等,并转换为有效的XHTML页面),将文本节点转换为文本并扩展所有其他节点。
这无疑是记录不清的;我通过玩Xml对象并记录中间结果来写这个,直到我开始工作。我们需要更好地记录Xml内容。
答案 1 :(得分:6)
我注意到您正在撰写Google Apps脚本。 Google Apps脚本中没有 DOM ,也无法创建元素并获取 innerText 属性。
getBody()以HTML格式为您提供电子邮件正文。您可以使用以下代码替换代码:
var html = GmailApp.getInboxThreads()[0].getMessages()[0].getBody();
html=html.replace(/<\/div>/ig, '\n');
html=html.replace(/<\/li>/ig, '\n');
html=html.replace(/<li>/ig, ' *');
html=html.replace(/<\/ul>/ig, '\n');
html=html.replace(/<\/p>/ig, '\n');
html=html.replace(/<br\/?>/ig, '\n');
html=html.replace(/<[^>]+>/ig, '');
可能是您可以找到更换的标签。请记住,此代码不适用于任何HTML,但适用于getBody()HTML。 GMail有自己的格式化方法,并没有在HTML中使用每个可能的现有标签,只使用它的一部分;然后我们的GMail特定代码更短。
答案 2 :(得分:2)
我找到了一种更简单的方法来完成这项任务。
在 sendEmail()的参数中使用 htmlBody 高级参数。下面是一个例子:
var threads = GmailApp.search ('is:unread'); //searches for unread messages
var messages = GmailApp.getMessagesForThreads(threads); //gets messages in 2D array
for (i = 0; i < messages.length; ++i)
{
j = messages[i].length; //to process most recent conversation in thread (contains messages from previous conversations as well, reduces redundancy
messageBody = messages[i][j-1].getBody(); //gets body of message in HTML
messageSubject = messages [i][j-1].getSubject();
GmailApp.sendEmail("dummyuser@dummysite.com", messageSubject, "", {htmlBody: messageBody});
}
首先,我发现所有线程都包含未读消息。然后,我使用 GmailApp 中的 getMessagesForThreads()方法将线程中包含的消息转换为二维数组。然后我创建了一个for循环,它运行我找到的所有线程。我将j设置为等于线程消息计数,因此我只能在线程(j-1)上发送最新消息。我通过 getBody()获取消息的HTML正文,通过 getSubject()获取主题。我使用 sendEmail(recipients,subject,body,optAdvancedArgs)来发送电子邮件并处理HTML正文。结果是发送的电子邮件格式正确,包含HTML的所有功能。这些方法的文档可以在这里找到:https://developers.google.com/apps-script/service_gmail
我希望这有帮助,再次手动解析方法确实有效,但我仍然发现一些HTML的碎片留下来,所以我想我会尝试一下,如果我发现任何问题,它对我有用longrun我会更新这篇文章。到现在为止还挺好!
答案 3 :(得分:0)
我不确定你的意思.getBody()
- 这是否应该返回一个DOM体元素?
但是,删除HTML标记的最简单方法可能是让浏览器呈现HTML并询问他的文本内容:
var myHTMLContent = "hello & world <br />!";
var tempDiv = document.createElement('div');
tempDiv.innerHTML = myHTMLContent;
// retrieve the cleaned content:
var textContent = tempDiv.innerText;
通过上面的示例,textContent
变量将包含文本
"hello & world
!"
(请注意由<br />
标记引起的换行符。)
答案 4 :(得分:0)
Google现在拥有getPlainBody()
功能,可以从电子邮件正文中获取纯文本。它在文本类中。
我一直在使用脚本发送电子邮件将其转换为任务,谷歌通过更改Corey上面的答案功能打破了它。我用以下内容替换了它。
var taskNote = ((thread.getMessages()[0]).getPlainBody()).substring(0,1000);