谷歌应用程序脚本和GmailApp:获取新消息

时间:2012-10-16 21:42:43

标签: google-apps-script

我正在尝试实现一个简单的google脚本来处理gmail用户收到的每条消息。
我找到了一个像这样的例子:

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)

6 个答案:

答案 0 :(得分:9)

对于迟到的回复感到抱歉,但我遇到了同样类型的问题,最后我使用了GmailApp.search()...希望这有帮助。

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

警告

  

当所有线程的大小太大而系统无法处理时,此调用将失败。如果线程大小未知,并且可能非常大,请使用“分页”&#39;调用,并指定在每次调用中检索的线程范围。

看看GmailApp.search(query)GmailApp.search(query, start, max)

答案 1 :(得分:7)

不幸的是,没有触发器会触发每条收到的消息。但是有一个很好的解决方法:

设置过滤规则,为所有传入消息分配一个特殊标签“ToBeProcessedByScript”。由于通配符在Gmail过滤器中不起作用,请使用to:字段。

运行时间触发的脚本,使用GmailApp.getUserLabelByName("ToBeProcessedByScript").getThreads()收集所有新的消息线程。在处理新消息之前删除特殊标签。

答案 2 :(得分:3)

你可以使用

GmailApp.getInboxThreads(0, 50);

用前五十个邮件初始化变量。

答案 3 :(得分:2)

我已经扩展了代码,检查第一条消息是否真的是未读的消息。如果不是,它将检查下一条消息,并将继续直到它找到未读消息:

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
          }
       }
     }
   }
 }

答案 4 :(得分:1)

您可以像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
          }
       }
     }
   }
 }

答案 5 :(得分:1)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/contentMainLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:weightSum="100">

    <LinearLayout

        android:id="@+id/linearLayout1"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="75">

        <ScrollView
            android:id="@+id/mainScrollView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_margin="10dp"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent">

            <LinearLayout
                android:id="@+id/mainScrollLL"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:orientation="vertical"></LinearLayout>
        </ScrollView>
    </LinearLayout>

    <LinearLayout
        android:id="@+id/linearLayout2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="20dp"
        android:layout_weight="25"
        android:orientation="horizontal">

        <Button
            android:id="@+id/startTrade"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Start Trade"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"
            android:text="Stop Trade"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    </LinearLayout>
</LinearLayout>