【发布时间】:2012-01-20 02:29:16
【问题描述】:
调用时如何去掉所有格式化标签:
GmailApp.getInboxThreads()[0].getMessages()[0].getBody()
使得文本的唯一剩余部分是可以阅读的。
格式化可以被破坏;正文中的文本只需要解析即可,但标签如:
"&"
<br>
可能还有其他人,需要删除。
【问题讨论】:
标签: javascript html tags google-apps-script
调用时如何去掉所有格式化标签:
GmailApp.getInboxThreads()[0].getMessages()[0].getBody()
使得文本的唯一剩余部分是可以阅读的。
格式化可以被破坏;正文中的文本只需要解析即可,但标签如:
"&"
<br>
可能还有其他人,需要删除。
【问题讨论】:
标签: javascript html tags google-apps-script
即使 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& 世界酒吧!”。
为了解释,第二个参数为“true”的 Xml.parse 将文档解析为 HTML 页面。然后我们遍历文档(将用缺少的 HTML 和 BODY 元素等进行修补,并变成有效的 XHTML 页面),将文本节点转换为文本并扩展所有其他节点。
诚然,这没有很好的记录;我通过玩弄 Xml 对象并记录中间结果来写这个,直到我让它工作。我们需要更好地记录 Xml 内容。
【讨论】:
我注意到您正在编写 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 有自己的方式来格式化 de body,并且不会使用 HTML 中所有可能存在的标签,只使用它的一个子集;那么我们的 GMail 特定代码会更短。
【讨论】:
html=html.replace(/<\/p>\s*<p>/ig, '</p><p>'); 这可能是我特有的,但我在两个 p 标签之间有很多空格,所以这把它们去掉了!
我找到了一种更简单的方法来完成这项任务。
在 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 我会更新这篇文章。到现在为止还挺好!
【讨论】:
Google 现在拥有getPlainBody() 函数,可以从电子邮件正文中获取纯文本。它在文本类中。
我一直在使用脚本发送电子邮件以将其转换为任务,而谷歌通过更改上述 Corey 答案的功能来打破它。我已将其替换为以下内容。
var taskNote = ((thread.getMessages()[0]).getPlainBody()).substring(0,1000);
【讨论】:
我不确定您所说的 .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 />标签导致的换行符。)
【讨论】:
\n)。