Как создать настраиваемое поле сортировки в Outlook, заполненное формулой? - PullRequest
0 голосов
/ 21 апреля 2011

После успешного создания настраиваемого поля в Outlook с помощью формулы и анализа поля «Тема»;Теперь я столкнулся с новым препятствием.Пользовательское поле не сортируется.На текущий момент кажется, что единственный способ достичь этого - создать новое пользовательское свойство , которое затем можно будет сортировать и использовать при определении поля.

Опция также существует длявставьте все в VBA-скрипт или C # -приложение с помощью взаимодействия.В любом случае для меня это сработало бы, однако я бы предпочел пойти по VBA-маршруту и ​​сохранить его самодостаточным.

Сообщения электронной почты существуют в папке и могут быть отправлены по факту;решение не должно оставаться постоянно активным.

Если бы кто-нибудь мог указать мне на код, который может легко достичь этого, это было бы здорово.Если мне не хватает варианта сделать настраиваемое поле сортируемым, укажите его, поскольку это конечная цель.

РЕДАКТИРОВАТЬ:

Это то, что у меня есть в настоящее время...

Sub SortCustomField()

    Dim olApp As Outlook.Application
    Dim objLotusInbox As Outlook.MAPIFolder
    Dim objLotusInboxItems As Outlook.Items
    Dim objNameSpace As Outlook.NameSpace
    Dim objProperty As Outlook.UserDefinedProperty


    Set olApp = CreateObject("Outlook.Application")
    Set objNameSpace = olApp.GetNamespace("MAPI")
    Set objLotusInbox = objNameSpace.GetDefaultFolder(olFolderInbox).Folders("Lotus Notes Inbox")

    Set objLotusInboxItems = objLotusInbox.Items
    objLotusInboxItems.Sort "[Notes2Outlook Created]", False

    Set objLotusInboxItems = Nothing
    Set objLotusInbox = Nothing
    Set objNameSpace = Nothing
    Set olApp = Nothing

End Sub

Ошибка при сортировке;почти наверняка это связано с тем, что указанное поле является пользовательским полем, так как оно работает с другими полями, такими как From.

ОБНОВЛЕНИЕ:

Сделанонекоторые основания, однако при возврате в Outlook он не заполняет поле, определенное во время выполнения.

    Dim olApp As Outlook.Application
    Dim objLotusInbox As Outlook.MAPIFolder
    Dim objLotusInboxItems As Outlook.Items
    Dim objNameSpace As Outlook.NameSpace
    Dim objMailProperty As Outlook.UserProperty
    Dim objMailItem As Outlook.MailItem
    Dim objParsedDate As Date
    Dim sample As Object

    Set olApp = CreateObject("Outlook.Application")
    Set objNameSpace = olApp.GetNamespace("MAPI")
    Set objLotusInbox = objNameSpace.GetDefaultFolder(olFolderInbox).Folders("Lotus Notes Inbox")

    Set objLotusInboxItems = objLotusInbox.Items

    For Each objMailItem In objLotusInboxItems
        Set objMailProperty = objMailItem.UserProperties.Add("MyUserProp", olDateTime)
        objParsedDate = CDate(Mid(objMailItem.Subject, (InStr(objMailItem.Subject, "[") + 1), (InStr(objMailItem.Subject, "]") - InStr(objMailItem.Subject, "[")) - 1))
        objMailProperty.Value = objParsedDate
    Next

    Set objLotusInboxItems = Nothing
    Set objLotusInbox = Nothing
    Set objNameSpace = Nothing
    Set olApp = Nothing

Ответы [ 3 ]

1 голос
/ 02 января 2012

Поскольку вы уже заполняете его в VBA, вы можете изменить свойство пользователя на текстовое поле, которое можно отсортировать.

Метод, который я использую, - это запуск сценария на основе правила, но в вашем случае вы можете вызвать его как подпрограмму в цикле for-each.

Sub SomeAction(Item As Outlook.MailItem)
    Dim myProperty As Outlook.UserProperty

    Set myProperty = Item.UserProperties.Add("MyUserProp", olText, True)
    myProperty.Value = Mid(objMailItem.Subject, (InStr(objMailItem.Subject, "[") + 1), (InStr(objMailItem.Subject, "]") - InStr(objMailItem.Subject, "[")) - 1))
    Item.Save

    Set myProperty = Nothing
End Sub

Осталось только сделатьэто добавить пользовательский столбец в вашем представлении, который является текстовым пользовательским полем.

примечание, так как вы используете элемент даты / времени, этот метод должен работать так же хорошо, когда вы определяете свойство пользователя как olDateTime

1 голос
/ 02 февраля 2012

Я объединил ответы сверху, чтобы добавить пользовательский столбец, который заполняется путем запуска правила выбора сценария.Затем я могу отсортировать входящие по домену отправителей.Мои благодарности предыдущим авторам.

    Public Sub SortByDomain(oMsg As Outlook.MailItem)
    On Error Resume Next

    Dim sDomain As String 'The Sender's domain
    Dim oNS As Outlook.NameSpace 'My namespace
    Dim oInbox As Outlook.MAPIFolder 'My Inbox
    Dim oTarget As Outlook.MAPIFolder 'The domain folder
    Dim myProperty As Outlook.UserProperty


    'If it's not your domain, decipher the domain.
    If InStr(oMsg.SenderEmailAddress, "mydomain.com") < 1 Then
    sDomain = Mid(oMsg.SenderEmailAddress, InStr(oMsg.SenderEmailAddress, "@") + 1)
    Else
    sDomain = "mydomain.com"
    End If


    Set myProperty = oMsg.UserProperties.Add("SenderDomain", olText, True)
        myProperty.Value = sDomain
        oMsg.Save

    'Cleanup.
    Set oTarget = Nothing
    Set oInbox = Nothing
    Set oNS = Nothing
    Set myProperty = Nothing
    End Sub
1 голос
/ 31 мая 2011

У меня возникла та же проблема с использованием C # и надстройки VSTO надстройки.

Я решил эту проблему, сохранив объект MailItem после изменения свойства.

Так что для вашего кода я бы сделал следующее: objMailItem.Save в соответствующей точке. А именно в конце каждой итерации цикла For.

Примечание: в моем коде на c # я использую Marshal.ReleaseComObject для назначенного объекта USerProperty.

...