两年多前Gmail的一个对我来说最重要的功能被取消了,这就是Quote Selected Text,选择了一段想引用的文字,点击回复,然后在打开的回复邮件的窗口里,被选择的文字自动引用后放在邮件正文里,这个功能特别好用,但是没了,为了这事我当时还写了篇博客说明这事和当时找到的应急方案,是用AHK的脚本来实现,但后来发现操作系统级别的脚本通过浏览器然后再去Gmail的页面上做操作真的是很麻烦,而且没有效率,所以后来就慢慢放弃了这个脚本,前段时间回去翻TamperMonkey里的UserScript发现其实这些油猴的脚本的功能真的很强大,而且也是Gmail页面交互的驱动引擎,那么用UserScript实现这个功能是不是应该更简洁和高效呢?既然这么想了,就动手吧。
虽然对Javascript和VBscript很熟悉,但那毕竟是很多年前的事情了,这些年都在忙于什么大数据,AI,数据湖之类的东西,真的从头些这些脚本还有些手生,不过这些工作应该都有人做了吧,赶紧去网上搜了一下,嘿嘿,还真的有人问,也有个大神wOxxOm开发了一个脚本 https://greasyfork.org/en/scripts/34381-gmail-r-key-quotes-selection/code , 这个脚本用键击R键来自动进入回复的内容窗口然后引用内容,虽然基本实现了我想要的,但很多细节让我觉得很不满意,例如,不是挂event的handler到gmail的回复和回复所有的按钮上:
[code]window.addEventListener('keydown', e => {
if (e.ctrlKey || e.altKey || e.metaKey || e.key != 'r')
return;[/code]
打开内容窗口清除所有已有内容包括我们公司强制要求的个人签名:
[code]editor.textContent = '';[/code]
引用文字的标题行的格式等,看来还是要自己动手啊。
[code]document.execCommand('insertHTML', false, '' + ${date} ${name == email ? '' : name + ' '}<<a href="${email}" target="_blank">${email}</a>><br>
+ <blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">${selText}</blockquote>
+ ''); [/code]
既然决定了要动手那就开始吧,第一个要解决的问题是如何把我要做的事情加到“Reply”和“Reply to all”这个两个按钮上,加挂动作需要用到addEventListener到click这个点击的event上,用document这个object挂这个addEventListener就需要对点击的目标进行判断,根据WOxxOm的脚本,是用了一个奇怪的attribute叫aria-haspopup来搜索reply的[code]const replyMenu = item.parentElement.querySelector('[role="button"] + [aria-haspopup="true"]');[/code],这个让我有点困惑,在使用Chrome的开发工具找了一下这两个组件后决定用dataset.tooltip来抓取这两个按钮:[code]document.addEventListener('click', function(e) {
if (e.target.dataset.tooltip != 'Reply to all'&& e.target.dataset.tooltip != 'Reply')
// if not reply or not reply to all then quit
return;[/code]这样就完美的解决了把功能加入到回复的点击上了。
当成功把功能挂到回复按钮的点击上之后,发现了另一个问题,就是当这个功能执行的时候,又触发了另一次点击,所以要把这个点击取消掉[code]replyMenu.previousElementSibling.dispatchEvent(new MouseEvent('click'));[/code]
接下来发现这个点击动作了抓住Editor这个区域之后后续居然没有任何动作了,仔细看了一下代码发现是这三行代码在作怪,这个代码必杀之[code]e.preventDefault();
e.stopPropagation();
e.stopImmediatePropagation();[/code]
当完成了上述改动之后,主体的功能就已经基本完成,剩下的就是对引用的文字的美化,例如文字的上面加的那一行“某年某月 某人(邮件)写了”改成斜体,加灰色背景条等等,其他的也真的没有必要改动,我原本想挂上特殊的颜色之类的,但后来发现因为需要经常对引用的文字拆成多行分别回复,所以挂颜色可能会引发奇怪的效果就算了,这样就完美的实现了原来谷歌取消的功能,因为没有油猴脚本站点的账号,就先扔到我自己的bbs的site上了。
完整的需要安装的脚本的最新版本在这里: https://bbs.ausmis.com/userscripts/QuoteSelectedTextInGmail.user.js
如何安装Tamper Monkey和安装UserScript,大家可以自己在谷歌或者百度上搜索相关文章,这里就不再说明了。
文章评论
version 2.0 开始支持:
1. reply/reply to all的图标
2. 菜单里的reply和reply to all
3. 快捷键里的r 和a