vba - 转发 Outlook 会议
问题描述
当我向他们发送会议邀请时,我试图通过他们的名字来解决客户列表。客户不得看到其他受邀者。我尝试了几种方法:将客户一个接一个添加为Resource
,每次更改会议记录文本,将会议作为 iCalendar 项目转发,没有运气。
客观的:
我做了很多研究,找不到一种方法来转发模拟用户界面版本的会议。
背景资料:
- 我创建了一个我知道位置 URL 的 Zoom 会议约会
- 我可以成功访问此约会作为
Outlook.AppointmentItem
使用Restrict
- 我无法直接添加客户列表,
Resource
因为我无法自定义每个邀请 - 我不能
AppointmentItem.ForwardAsVcal
将会议作为附件转发并且不占用客户的日历空间(我也认为它看起来不专业) - 我没有使用
MeetingItem.Forward
,因为我的对象是Outlook.AppointmentItem
- 我已经使用
Recipients.Add
和成功添加了新客户.Type = olResource
- 我已经成功修改了会议笔记,
AppointmentItem.GetInspector().WordEditor.Range.FormattedText
但这会导致以前的邀请被取消并更新邀请中的文本,以便每个人都能看到最后一个邀请
代码:
成功访问项目
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
解决方案
经过几个小时的尝试,我解决了它。
我最初的直觉是循环浏览 UI 中的项目,olFolderCalendar
因为在 UI 中我们通过日历向前访问会议,但日历中的对象是Outlook.AppointmentItem
而不是Outlook.MeetingItem
可以转发的。
解决方案是将会议发送给您自己(或您组织中的任何人),以便会议邀请的副本位于您的olFolderSentMail
. olFolderSentMail
are中的项目Outlook.MeetingItem
,可以转发。除非您将其发送给某人,否则会议将不会进入您的olFolderSentMail
.
我们可以olFolderSentMail
通过使用Restrict
会议的位置 (URL) 来过滤我们的。一旦我们有了,我们可以通过调用我们现有的会议Outlook.MeetingItem
来创建一个新的。一旦我们有了新的,我们可以将客户端添加到它。这将在不通知其他客户的情况下向客户发送定制的、否则不可见的邀请。Outlook.MeetingItem
MeetingItem.Forward
olFolderSentMail
Outlook.MeetingItem
olResource
在我结束这个答案之前有一点警告:我的第一种方法是反向循环,olFolderSentMail
以免循环到许多项目并节省时间,但请记住,每次转发会议时,新的邀请都会结束在顶部olFolderSentMail
,所以如果反过来,您将转发转发的邀请。使用该Restrict
方法时,您可以简单地使用第一项,这应该是您对自己的原始邀请。
推荐阅读
- c++ - 使用 CLion 在 Mac M1 上的 Cmake 项目中添加 assimp
- spring-data-mongodb - Spring MongoDb:没有注解的pojo持久化配置
- javascript - 如何将我的绘图饼图对齐到可用区域的顶部
- kubernetes - 未为所有路由找到 Kubernetes Ingress Nginx 控制器
- c++ - 为什么本地类不允许有模板成员?
- powershell - 我想要a列的第一个字母,并附加到b列
- php - laravel guzzle 不适用于 amadeus api
- python - 使用梯度下降的线性回归在 python 中使用面积(一个变量)预测房价
- search - 狮身人面像搜索未找到数字
- api - Krakend 正在屏蔽客户端 IP 地址