2017-12-10 8 views
1

Gmailメッセージをスプレッドシートにインポートするスクリプトを作成しました。受信トレイルールでGmailの「インポート待ち」のGmailラベルに移動し、スクリプトがメッセージを処理した後、このラベルを削除して「インポート済み」ラベルに追加します。スレッド内のすべてのメッセージのインポートを避ける

問題は、この「インポート待ち」ラベルに電子メールが受信されると、ラベルがスレッド全体に適用されているように見えることです。メッセージは以前にインポートされたメッセージと同じ件名を持つため、スレッド内の他のすべてのメッセージがインポートされます(これらはすでにインポートされています)。

は、ここに私のスクリプトです:

var importedCount = 0; 
    var label = GmailApp.getUserLabelByName('Monitor/AwaitingImport'); 
    var threads = label.getThreads(0,50);  // An array of threads (limit set to 50, this could be increased) 

    if (threads.length != 0) { // If a thread exists 
    for (var i = 0; i < threads.length; i++) { // for each thread in the label 
     var threadsubject = threads[i].getFirstMessageSubject();  
     if (threadsubject.match(/(Check In)/)) { // if the subject contains "Check In" 
     var messages = threads[i].getMessages(); // get ALL the messages 
     for (var j = 0; j < messages.length; j++) { // for each message 
      var body = messages[j].getPlainBody(); 
      // Get key:value pairs from email into an array 
      var array = body.trim().split("\n"); 
      var newArray = []; 
      for (k = 0; k < array.length; k++) { 
      newArray = newArray.concat(array[k].toString().split("=")); 
      } 

      // Push other data to array that isn't in body of email 
      newArray.push("GmailMessageID", messages[j].getId()); 
      newArray.push("MessageDate", messages[j].getDate()); 

      // Create object 
      var newObj = {}; 
      for (var l =0 ; l< newArray.length ; l++) { 
      if (l%2 == 0){ 
       newObj[newArray[l]] = newArray[l+1]; 
      } 
      } 

      // Now insert object as record into the spreadsheet 
      insertRecordWithAnyFieldsIntoAnySheet('Incoming Logs', newObj, true); 
     } 
     // Finally remove the label from this message, mark it as read, and update the importedCount (for logging) 
     threads[i].removeLabel(GmailApp.getUserLabelByName('Monitor/AwaitingImport')); 
     threads[i].addLabel(GmailApp.getUserLabelByName('Monitor/Imported')); 
     importedCount++; 
     } 
    }  
    } 
    SpreadsheetApp.getActiveSpreadsheet().toast(importedCount + ' messages imported'); 

どのように私は、インポートされることから、スレッド内のすべてのメッセージを防止し、ちょうどちょうど受け取ったものをインポートすることができますか?

  • は、私は、これはすでにシートにインポートされたメッセージの何千ものリソース集中型の検索を伴うだろうとして、すでにGmailのメッセージIDを使用して輸入したメッセージに対して、着信メッセージをチェックする必要はありません

  • これは潜在的に

  • 最後に、私は別のものを追加することで、未読メッセージのみをインポートしようとしたがインポートされていない他のメッセージを逃すので、私は、スレッド内でのみ最後のメッセージをインポートしません私のスクリプトは、読み取りとしてメッセージをマークします(上記のスニペットに示されていない)が、これはまだデフォルトのGmailの作品では、スレッド

答えて

0

内のすべてのメッセージをインポートするように見えたベースでのスクリプト(すなわちif (messages[j].isRead()))の条件、 GmailAppはスレッドでのみ動作します。考えられる回避策があります。まずはGmailの設定に行き、会話表示をオフに設定する必要があります。オフ:これにより、各電子メールは別個のオブジェクトになります。こうすることで、ラベルがメッセージに適用されます(最初にこれを行うと、スレッド内のすべてのメッセージにラベルが付きますが、後で各メッセージにラベルが付くことに注意してください)。

私が知る限り、GmailAppはスレッドでも動作します。代わりにGmail APIを使用する必要があります。使用開始方法については、hereを読んでください。あなたがしたいことは、この行に沿ったものです。

queriedMessages = 
     Gmail.Users.Messages.list(userInfo.mail, { 
     'q': queryString, 
     'pageToken': execProperties.nextPageId 
     }); 

これは私のスクリプトの例です。 UserInfo.mailは、あなたのメールを確認する簡単な'me'に置き換えることができます。 queryStringは重要な部分です。これはGmailの高度な検索文字列と同じです。たとえば、'in:all newer_than:2d -in:chats -in:trash -in:draft'は、ハングアウトチャットではなく、ゴミ箱ではなく、下書きではなく、2日以上経過したすべてのメールを検索します。これらのクエリの記述方法については、hereを参照してください。 pageTokenは実際にはqueriedMessages.nextPageTokenにあります。これは、ページ1の代わりに検索結果のページ2を再度検索して検索したい場合にのみ必要です。

6分を超えると思われる場合に便利です。 pageTokenをユーザーまたはスクリプトのプロパティの中に格納し、トリガーを作成してスクリプトを再起動し、現在の実行を終了します。その後、再起動すると、プロパティをプルしてから中断したページから開始します。

関連する問題