11

Gmailユーザーが受信した各メッセージを処理する簡単なGoogleスクリプトを実装しようとしています。

私はこのようなことをする例を見つけました:

var threads = GmailApp.getInboxThreads();
for (var i=0; i < threads.length; i++) {
   var messages = threads[i].getMessages();

   for (var j=0; j < messages.length; j++) {
       if (!messages[j].isUnread()) {
         continue; 
       }
      //process message
   }
}

つまり、受信トレイ内のすべてのメッセージを繰り返し処理し、未読メッセージを検索します。これは、1800メッセージだけでは非常に遅くなります。

理想的には、新しいメッセージが受信されるたびに起動されるトリガーを探しています。

そのようなものがない場合、私は私が見たこれを利用しようとします:

GmailApp.getMessageById(id)
4

6 に答える 6

15

応答が遅れて申し訳ありませんが、同じタイプの問題が発生し、GmailApp.search()を使用することになりました...これがお役に立てば幸いです。

// find unread messages
var threads = GmailApp.search('is:unread');
....

警告

すべてのスレッドのサイズがシステムで処理するには大きすぎる場合、この呼び出しは失敗します。スレッドサイズが不明で、非常に大きい可能性がある場合は、「paged」呼び出しを使用し、各呼び出しで取得するスレッドの範囲を指定してください。

GmailApp.search(query)GmailApp.search(query、start、max)を見てください

于 2014-08-12T20:07:17.500 に答える
9

残念ながら、受信したメッセージごとに起動するトリガーはありません。ただし、適切な回避策があります。

例として、すべての着信メッセージに特別なラベル「ToBeProcessedByScript」を割り当てるフィルタールールを設定します。Gmailのフィルタではワイルドカードは実際には機能しないため、to:フィールドを使用します。

ですべての新しいメッセージスレッドを収集するタイムトリガースクリプトを実行しますGmailApp.getUserLabelByName("ToBeProcessedByScript").getThreads()。新しいメッセージを処理する直前に、特別なラベルを削除します。

于 2013-06-05T05:24:44.720 に答える
4

あなたが使用することができます

GmailApp.getInboxThreads(0, 50);

最初の50通のメールで変数を初期化します。

于 2013-04-18T09:29:05.430 に答える
3

最初のメッセージが本当に未読のメッセージであるかどうかを確認して、コードを拡張しました。そうでない場合は、次のメッセージをチェックし、未読メッセージが見つかるまで続行します。

function getUnreadMails() {
   var ureadMsgsCount = GmailApp.getInboxUnreadCount();
   var threads;
   var messages;
   var k=1;
   if(ureadMsgsCount>0)
   {        
     threads = GmailApp.getInboxThreads(0, ureadMsgsCount);
     for(var i=0; i<threads.length; i++)
     {
       if(threads[i].isInInbox())
       {
          messages = threads[i].getMessages();
          for(var j=0; j<messages.length; j++)
          {

             while (messages[j].isUnread() === false)
             {
             threads=GmailApp.getInboxThreads(k, ureadMsgsCount);
             messages = threads[i].getMessages();
             k++;
             }
             Logger.log(messages[j].getSubject());

             // process unread message
          }
       }
     }
   }
 }
于 2017-09-21T19:31:24.450 に答える
2

djtekが述べたようにタイムトリガーを作成できますが、すべてのメッセージにラベルを付けてからラベル付きメッセージを取得する代わりに、機能するコードに従って、未読メッセージの数を取得し、0から未読メッセージの数までスレッドを取得できます。私のため:

 function getUnreadMails() {
   var ureadMsgsCount = GmailApp.getInboxUnreadCount()
   if(ureadMsgsCount>0)
   {        
     var threads = GmailApp.getInboxThreads(0, ureadMsgsCount);
     for(var i=0; i<threads.length; i++)
     {
       if(threads[i].isInInbox())
       {
          var messages = threads[i].getMessages();
          for(var j=0; j<messages.length; j++)
          {
             Logger.log(messages[j].getSubject());
             // process unread message
          }
       }
     }
   }
 }
于 2017-01-23T10:13:12.963 に答える
1
function getUnreadMessages(threadLimit) {
  function flatten(arr) { return [].concat.apply([], arr) }
  var threadsWithUnreadMessages = GmailApp.search('is:unread', 0, threadLimit)
  var messageCollection = threadsWithUnreadMessages.map(function(thread) {
    return thread.getMessages()
  })
  var unreadMessages = flatten(messageCollection).filter(function(message) { 
    return message.isUnread()
  })
  return unreadMessages
}

getUnreadMessages(100)
于 2020-02-05T03:32:16.850 に答える