首页 > 解决方案 > 转发 Outlook 会议

问题描述

当我向他们发送会议邀请时,我试图通过他们的名字来解决客户列表。客户不得看到其他受邀者。我尝试了几种方法:将客户一个接一个添加为Resource,每次更改会议记录文本,将会议作为 iCalendar 项目转发,没有运气。

客观的:

我做了很多研究,找不到一种方法来转发模拟用户界面版本的会议。

背景资料:

代码:

成功访问项目

Private Function getMeeting() As Outlook.AppointmentItem
    Dim settingsWS As Worksheet
    Set settingsWS = ThisWorkbook.Sheets("Settings")
    
    Dim meetingStart As Date, meetingEnd As Date
    meetingStart = settingsWS.Cells(2, 1).Value 'start time
    
    Dim locationString As String
    locationString = settingsWS.Cells(2, 2).Value 'location url
    
    Dim oCalendar As Outlook.Folder
    Dim oItems As Outlook.Items
    
    Dim strRestriction As String
    daStart = Format(meetingStart, "mm/dd/yyyy hh:mm AMPM")
    daEnd = DateAdd("h", 2, daStart)
    daEnd = Format(daEnd, "mm/dd/yyyy hh:mm AMPM")
    strRestriction = "[Start] >= '" & daStart & "' AND [End] <= '" & daEnd & "'"
    strRestriction = strRestriction & " AND [Location] = '" & locationString & "'"
    
    Set oCalendar = GetNamespace("MAPI").GetDefaultFolder(olFolderCalendar)
    Set oItems = oCalendar.Items.Restrict(strRestriction)
    
    Set getMeeting = oItems(1)
    
End Function

我失败的转发试验:

Private Sub sendInvites(oAppt As Outlook.AppointmentItem)
    Dim oMail As Outlook.MailItem, oAtt As Outlook.Recipient, embeddedInvitation As OLEObject
    
    Dim industryWS As Worksheet
    Set industryWS = ThisWorkbook.ActiveSheet
    
    Dim attendeeRange As Range
    Set attendeeRange = industryWS.Cells(3, 1).CurrentRegion 'list of clients
    
    Dim attendeeCompany As String, attendeeEmail As String
    Dim attendeeName As String, attendeePrefix As String
    
    Dim attendeeCount As Long, attendeeIndex As Long
    attendeeCount = attendeeRange.Rows.Count - 1
    For attendeeIndex = 1 To attendeeCount
        attendeeCompany = attendeeRange.Cells(attendeeIndex + 1, 1).Value
        attendeeEmail = attendeeRange.Cells(attendeeIndex + 1, 2).Value
        attendeeName = attendeeRange.Cells(attendeeIndex + 1, 4).Value
        attendeePrefix = attendeeRange.Cells(attendeeIndex + 1, 5).Value
        Application.StatusBar = "Sending invites (" & CStr(attendeeIndex) & "/" & CStr(attendeeCount) & ") " & attendeeEmail
        
        Set oMail = Outlook.Application.CreateItem(olMailItem)
        'Set oMail = oAppt.ForwardAsVcal
        oMail.To = attendeeEmail
        
        oMail.BodyFormat = olFormatHTML
        oMail.HTMLBody = getInvitationBody(attendeeName, attendeePrefix) & oMail.HTMLBody 'return invitation mailbody as HTML
        'Dim fsd As MeetingItem
        'fsd.Forward
        'Set oAtt = oAppt.Recipients.Add(attendeeEmail)
        'oAtt.Type = olResource

        'oAppt.GetInspector().WordEditor.Range.FormattedText.Delete
        'oMail.GetInspector().WordEditor.Range.FormattedText.Copy
        'oAppt.GetInspector().WordEditor.Range.FormattedText.Paste
        'oMail.Close False
        'oAppt.ForwardAsVcal
        'oAppt.Display
        'oAppt.Send
        oMail.Send
        
        Application.StatusBar = "Saving invites (" & CStr(attendeeIndex) & "/" & CStr(attendeeCount) & ") " & attendeeEmail
        'saveInvite oAppt, industryWS, attendeeRange
        DoEvents
    Next attendeeIndex
End Sub

标签: vbaoutlook

解决方案


经过几个小时的尝试,我解决了它。

我最初的直觉是循环浏览 UI 中的项目,olFolderCalendar因为在 UI 中我们通过日历向前访问会议,但日历中的对象是Outlook.AppointmentItem而不是Outlook.MeetingItem可以转发的。

解决方案是将会议发送给您自己(或您组织中的任何人),以便会议邀请的副本位于您的olFolderSentMail. olFolderSentMailare中的项目Outlook.MeetingItem,可以转发。除非您将其发送给某人,否则会议将不会进入您的olFolderSentMail.

我们可以olFolderSentMail通过使用Restrict会议的位置 (URL) 来过滤我们的。一旦我们有了,我们可以通过调用我们现有的会议Outlook.MeetingItem来创建一个新的。一旦我们有了新的,我们可以将客户端添加到它。这将在不通知其他客户的情况下向客户发送定制的、否则不可见的邀请。Outlook.MeetingItemMeetingItem.ForwardolFolderSentMailOutlook.MeetingItemolResource

在我结束这个答案之前有一点警告:我的第一种方法是反向循环,olFolderSentMail以免循环到许多项目并节省时间,但请记住,每次转发会议时,新的邀请都会结束在顶部olFolderSentMail,所以如果反过来,您将转发转发的邀请。使用该Restrict方法时,您可以简单地使用第一项,这应该是您对自己的原始邀请。


推荐阅读