0

メールを交互の受信者に転送するように設定できるかどうかを調べようとしています。

メールを受信すると、GMail フィルターが一部のメールに "elephant" などのタグを付けます。

「エレファント」メールを処理できる人は複数いるので、「エレファント ハンドラー」のリストを巡回しながら、新しいメールをそのうちの 1 人に転送したいと思います。(ジョー、エイミー、タミーなど) 彼らの電子メール アドレスはスプレッドシートで確認できます。

         A
1 joe@example.com
2 amy@example.com
3 tammy@example.com

擬似コード:

Get first unread email
  Forward email to Joe
Get next unread email
  Forward email to Amy
Get next unread email
  Forward email to Tammy
Go to start

Google Apps Script でこれを達成するにはどうすればよいですか?

4

1 に答える 1

1

これは、さまざまな方法で行うことができます。テレフォニーの世界では、この動作はハント グループと呼ばれます。ここでは、その概念を借りて開始するための 1 つの提案を示します。

仮定:

  • Gmail を使用しています。
  • スクリプトは、Gmail アカウントと同じアカウント所有者に属します。

アプローチ:

  • Gmail でフィルターを設定して、基準を満たす受信メッセージ (「エレファント」メール) を識別します。

  • このフィルターでは、"elephant" というラベルを新しい電子メールに適用します。このラベルはスクリプトによって "作業" を識別するために使用されます。

  • スプレッドシートを使用して、「elephant」ラベルに関連する未読メッセージをスキャンして転送するスクリプトを含めます。

  • スクリプトは、適切な間隔でタイマーイベントでトリガーするように設定されます。

  • スプレッドシートには、(適切にフォーマットされた) 送信先の電子メール アドレスのリストが含まれます。ジョー、エイミー、タミー。スクリプトはこれらを読み取り、順番に使用します。

  • 電子メールが処理されると、「既読」としてマークされます。必要に応じて、ラベルの解除、再ラベル付け、アーカイブ、またはゴミ箱に入れることができます。

スクリプト

このスクリプトは、ScriptProperties を使用して、次の転送メッセージを受け取る受信者を追跡します。非常に多数のメッセージが予想される場合は、バッチでのメッセージの取得をサポートするように拡張する必要があります。

labelName適切に変更することを忘れないでください。

スクリプトはいくつかのエラー チェックを行いますが、電子メール アドレスを検証しません。そのため、メッセージが転送操作に失敗する可能性があります。買い手責任負担。

これはgist としても利用できます

/**
 * Retrieves a given user label by name and forwards unread messages
 * associated with that that label to a member of the Hunt Group.
 */
function huntGroupForward() {
  // get the label for given name
  var labelName = "elephant"
  var label = GmailApp.getUserLabelByName(labelName);
  if (label == null) throw new Error("No messages for label "+labelName);
  // get count of all threads in the given label
  var threadCount = label.getUnreadCount();
  if (threadCount == 0) return;  // quick exit if nothing to do.
  var threads = label.getThreads();
  var messages = [];
  for (var i in threads) {
    if (threads[i].isUnread()) {
      messages = messages.concat( threads[i].getMessages() );
    }
  }
  for (var i = 0; i < messages.length; i++) {
    if (messages[i].isUnread()) {
      messages[i].forward(nextHuntGroupMember());
      messages[i].markRead();
    }
  }
};

/*
 * Global object to store working copy of the Hunt Group
 */
var huntGroup = { next : 0, members : [] };

/*
 * Get the email address of the next Hunt Group Member
 * to forward a message to.
 */
function nextHuntGroupMember() {
  if (huntGroup.members.length == 0) {
    // Load members
    var sheet = SpreadsheetApp.getActiveSheet();
    var data = sheet.getDataRange().getValues();
    for (var i = 0; i < data.length; i++) {
      huntGroup.members.push(data[i][0])
    }
    // Make sure we have members
    if (huntGroup.members.length == 0) {
      throw new Error("Found no email addresses");
    }
  }

  // Retrieve next index. Properties are always stored as strings, so
  // we need to parse the retrieved value to use it as a Number.
  var next = parseInt(ScriptProperties.getProperty("nextHuntGroupMember"));
  if (next != null) {
    huntGroup.next = next;
  }
  else {
    next = 0;
  }

  // get next member to be used
  var nextMember = huntGroup.members[next];
  // ... then move on to new next (increment modulo list length)
  next = ++next % huntGroup.members.length;
  // store the new next value
  ScriptProperties.setProperty("nextHuntGroupMember", next);

  return nextMember;  
}

引き金

スクリプトに満足したら、定期的に実行するように設定します。これは、1 時間ごとに実行するように設定する方法です。

引き金

于 2013-04-13T05:06:49.557 に答える