« MT4.1 で PostgreSQL | トップページ | 年齢制限 »

2008年4月18日 (金)

'Reply to all' on GMail

ここにあるスクリプトはGMailの仕様変更によってもう動作しません。あしからず。


GMail を使っていて前から思っていたのだけど、普通メールに返信する時って、送信者だけじゃなくて Cc に入ってる人も含めて返信したくない?

オイラはずっと「返信 = 全員に返信」のインターフェースでやってきた。特定の人にだけ送りたい場合は To: や Cc: を編集するというのが習慣。なのだけど、GMail は返信のために textarea にカーソルを focus すると「送信者のみに返信」されるのよね。もちろん、送りたくない人に送ってしまうリスクを回避する意味もあるんだろうけど、全員に送るためには 'Reply to all' を押さなきゃダメで、オイラは忘れそうになるわけです。
どっかでデフォルトの返信設定を変更できるのかなぁと探したんだけど見つからず。

常々「めんどくせーなー」と思っていたところが、先日ノリノリでメール書いて送った後で一人にしか返していないことに気がついた。それも文面はどっちかっていうと Cc: に入ってる人向けだったのに。
これは悔しいということで、textarea に focus したときの関数をハックして…と思ったのだけど、GMail のスクリプトは若輩者の俺様にはとても読めるものではなく。

そういえば GMail に GreaseMonkey 用API が出てたのを思い出して、これならなんとかなるかなーと。
で、早速拾えるイベントを探したのだけど、拾えるイベントは画面遷移時のものだけで、返信用 textarea にカーソルが入ったのは拾えない。残念。後、細かなボタン類にイベントを渡すAPIも無いのでどうすっかなぁと。

とりあえず、サンプルを参考に以下の手順で。
「Conversation が開かれたら、Reply to all のボタン(div)に Mouse click のイベントを送りつける」
ボタンはDOM取ってきてクラス名(K98VUe)を頼りに XPath で頑張って見つける。
こうすることで、いきなり返信用のフォームが開いてしまうのだけど、最低限の目標は達成できる。

で、このボタンを探すのが結構大変で、というか XPath に慣れてないからなんだけど何とか作りましたよ。欠点としては本文読みたくても一番下までスクロールしてしまうことなんだけど、一応問題なく動いてる感じ。namespace は適当。間違い有ればご指摘いただけるとうれしいかも。


// ==UserScript==
// @name          Gmail 'Reply to All' switcher
// @namespace     http://abiys.cocolog-nifty.com/blog/
// @description   When entering compose mode, send click event to 'Reply to All'
// @include       http://mail.google.com/*
// @include       https://mail.google.com/*
// ==/UserScript==

window.addEventListener('load', function() {
    if (unsafeWindow.gmonkey) {
    unsafeWindow.gmonkey.load('1.0', function(gmail) {
        function checkViewType() {
        if (gmail.getActiveViewType() == 'cv') {
            pushReplyToAll(gmail);
        }
        }
        gmail.registerViewChangeCallback(checkViewType);
    });
    }
}, true);

function pushReplyToAll(gmail) {
    var doc = gmail.getActiveViewElement().ownerDocument;
    var button = xpath(doc, "//div[contains(concat(' ',@class,' '),' K98VUe ')]");
    if (button.length == 1) {
    var event = button[0].ownerDocument.createEvent("MouseEvents");
    event.initMouseEvent('click', true, true, button[0].ownerDocument.defaultView, 1, 50, 50, 50, 50, false, false, false, false, 0, button[0]);

    button[0].dispatchEvent(event);
    window.scrollBy(-50,0);
    }
}

function xpath(doc, query) {
    var results = doc.evaluate(query, doc, null,
                   XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);

    var ret = new Array();
    for(var i=0; i<results.snapshotLength; i++){
        ret.push(results.snapshotItem(i));
    }
    return ret;
}

何か最後に強引に scrollBy で巻き戻してるのが我ながら格好わるいんだけどとりあえず。

で、実はどっかに設定画面が有るというオチとか…

|

« MT4.1 で PostgreSQL | トップページ | 年齢制限 »

てっく」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/232324/37749793

この記事へのトラックバック一覧です: 'Reply to all' on GMail:

« MT4.1 で PostgreSQL | トップページ | 年齢制限 »