以前、Gmailの未読メールの件数を表示する投稿 をしましたが
今度はメールの内容を一部表示するよう対応しようとした際に
1メッセージに4秒もかかってしまうものがあり
なぜ????と悩んでしまったので備忘録です。
コード.gsにLogger.logを至る所に差し込んでみたところ
原因は getMessages() でした
Threadに対してgetMessages()でメッセージを取得するのですが
なにかしらの条件に当てはまる内容?であると
異常に重くなるようです。
でなんでやーと色々やってみた結果
getMessagesForThreadsを使えば早くなりました!
以前の遅いコードは以下です
以下は速度改善したコードです。
今度はメールの内容を一部表示するよう対応しようとした際に
1メッセージに4秒もかかってしまうものがあり
なぜ????と悩んでしまったので備忘録です。
コード.gsにLogger.logを至る所に差し込んでみたところ
原因は getMessages()
Threadに対してgetMessages()でメッセージを取得するのですが
なにかしらの条件に当てはまる内容?であると
異常に重くなるようです。
でなんでやーと色々やってみた結果
getMessagesForThreadsを使えば早くなりました!
以前の遅いコードは以下です
//未読メール取得関数
function getMail(){
var datReturn =new Object();
//スレッド取得
var thds = GmailApp.search("is:unread", 0, 500);
var i = 1;
var cFrom = '';
var cSub = '';
var cMsgid='';
var cThdurl='';
for(var n in thds){
var thd = thds[n];
//*** こいつが遅い! ***
var msgs = thd.getMessages();
//******************
cThdurl = thd.getPermalink();
for(m in msgs){
var msg = msgs[m];
cFrom =msg.getFrom();
var searchchar = Session.getActiveUser().getEmail();
var searchidx = cFrom.search(searchchar);
if (searchidx <= 0 && msg.isUnread() === true){
cTo = msg.getTo();
cSub = msg.getSubject();
cMsgid = msg.getId();
datReturn['from' + i] =cFrom;
datReturn['subject' + i] = cSub;
datReturn['msgid' + i] = cMsgid;
datReturn['url' + i] = cThdurl;
i++;
}
}
}
datReturn['count'] = i;
return(datReturn)
}
以下は速度改善したコードです。
//コード.gsのトップに以下の1行だけ記載しておく
var cachedata = CacheService.getScriptCache();
//未読メール取得関数
function getMail(){
var datReturn =new Object();
var key = "MailAdress"
//スレッド取得
var thds = GmailApp.search("is:unread", 0, 500); //
var k = 1;
var cFrom = '';
// メールアドレスはキャッシュしておく
var searchchar = suna_cache.get(key);
if (searchchar === null){
searchchar = Session.getActiveUser().getEmail();
suna_cache.put(key,searchchar);
}
//一括取得しgetMessages()を使わない!
var msgs = GmailApp.getMessagesForThreads(thds);
for (var i = 0 ; i < msgs.length; i++) {
for (var j = 0; j < msgs[i].length; j++) {
cFrom = msgs[i][j].getFrom();
var searchidx = cFrom.search(searchchar);
if (searchidx <= 0 && msgs[i][j].isUnread() === true){
datReturn['from' + k] =cFrom;
datReturn['subject' + k] = msgs[i][j].getSubject();
datReturn['msgid' + k] = msgs[i][j].getId();
datReturn['url' + k] = msgs[i][j].getThread().getPermalink();
k++;
}
}
}
datReturn['count'] = k;
return(datReturn)
}
//キャッシュ
var suna_cache = {
put: function(key,data){
cachedata.put(key,data,60*60*48); //
},
get: function (key){
return cachedata.get(key);
}
};
いずれも同じ結果を取得します。
遅いコード側は遅くなるメールがあると1件4秒でしたが
速い方は遅くなるメールがいても0.5秒程度で完了してます
重くなる原因のメール内容はGoogleからくるお知らせなんですが
なんなんでしょうねぇ
まぁgetMessagesForThreads
当たり前なのかもしれませんが;
ついでにメール表示するテストページを作ってみました
もちろんGoogleにログインしてないと見れませんし
ボタンが表示されておりますので押して承認して頂いたあと
リロードする必要があります
悪さなどしておりませんが
承認してもいいよ~って方だけ見てください
テストページへ
0 件のコメント:
新しいコメントは書き込めません。