Получить текущую встречу с Outlook - PullRequest
3 голосов
/ 06 февраля 2011

Мне нужно текущее назначение. Если нет текущей встречи, то следующая или даже предыдущая встреча.

Я предполагаю использовать Restrict для ограничения набора встреч, а затем выбрать либо первое, либо последнее собрание в зависимости от аргумента ограничения (например, Ограничить встречи, заканчивающиеся после текущего времени, или встречи, начинающиеся до текущего времени).

У меня проблемы с строковым фильтром, необходимым в качестве аргумента.

Простой пример VB (пень кода):

myStart = Format(Date, "mm/dd/yyyy hh:mm AMPM")    
strRestriction = "[Start] <= '" & myStart & "'"

'Restrict the Items collection
Set oResItems = oItems.Restrict(strRestriction)
'Sort
oResItems.Sort "[Start]"

Я пытаюсь сделать то же самое в C #.

// Create the Outlook application.
Outlook.Application oApp = new Outlook.Application();

// Get the NameSpace and Logon information.
// Outlook.NameSpace oNS = (Outlook.NameSpace)oApp.GetNamespace("mapi");
Outlook.NameSpace oNS = oApp.GetNamespace("mapi");

//Log on by using a dialog box to choose the profile.
oNS.Logon(Missing.Value, Missing.Value, true, true);

// Get the Calendar folder.
Outlook.MAPIFolder oCalendar = oNS.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderCalendar);

// Get the Items (Appointments) collection from the Calendar folder.
oItems = oCalendar.Items;
oItems.IncludeRecurrences = true;

// THIS IS THE PROBLEM AREA
String filter = "[Start] <= '" + DateTime.Now.ToString("MM/dd/yyyy hh:mm AMPM") + "'";
Outlook.Items restrictedItems = oItems.Restrict(filter);
// Take the last item on the list - should be current or next appointment
restrictedItems.Sort("[Start]");
Outlook.AppointmentItem oAppt = restrictedItems.GetLast();


// Done. Log off.
oNS.Logoff();

Я полагаю, поскольку фильтр является строкой, формат даты должен быть гггг / мм / дд ЧЧ: мм: сс? Я не могу найти никакой документации о том, как манипулировать [Start], например, разбирать его на дату или что-то в этом роде.

В зависимости от формата даты я либо получу неправильную встречу, либо не смогу использовать GetLast из-за фильтра, исключающего все встречи.

Я видел примеры, но они либо перебирают встречи (слишком неэффективно), либо форматы даты выглядят так, что им нельзя доверять, чтобы вернуть правильную встречу (например, https://social.msdn.microsoft.com/Forums/vstudio/en-US/c6a8bd21-6534-43be-b23e-1068651da92e/retrieve-appointment-items-from-outlook-2007-calendar-restrict?forum=vsto,, который, кажется, вместо этого используйте жестко закодированную дату, если используете DateTime.Now.)

ОБНОВЛЕНИЕ: я в настоящее время перебираю, как показано ниже. Любые предложения для более эффективного кода?

DateTime currentTime = DateTime.Now;
foreach (Outlook.AppointmentItem item in oItems)
{
    if (item.Start <= currentTime && item.End.Subtract(new TimeSpan(0, 10, 0)) > currentTime)
    {
        appointmentArrayList.Add(item);
    }
}

Ответы [ 3 ]

3 голосов
/ 16 августа 2011

Это ваша проблема:

DateTime.Now.ToString("MM/dd/yyyy hh:mm AMPM")

Я думаю, что вы собираетесь:

DateTime.Now.ToString("MM/dd/yyyy hh:mm tt", CultureInfo.InvariantCulture)
2 голосов
/ 15 февраля 2011

Следуя информации, найденной здесь , я смог заставить ее работать, используя "yyyy-MM-dd HH: mm" в качестве строки формата для вызова toString.

Надеюсь это поможет.

0 голосов
/ 01 декабря 2017

Этот код работает для отображения встреч Outlook с сегодняшнего дня:

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        DemoAppointmentsInRange();
    }

    private void DemoAppointmentsInRange()
    {
        Application a = new Application();
        Microsoft.Office.Interop.Outlook.Folder calFolder = a.Session.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderCalendar) as Microsoft.Office.Interop.Outlook.Folder;
        DateTime start = DateTime.Now;
        DateTime end = start.AddDays(5);
        Microsoft.Office.Interop.Outlook.Items rangeAppts = GetAppointmentsInRange(calFolder, start, end);
        if (rangeAppts != null)
        {
            foreach (Microsoft.Office.Interop.Outlook.AppointmentItem appt in rangeAppts)
            {
               Response.Write("Subject: " + appt.Subject + " "+" Start: "+appt.Start.ToString()+" "+"End:"+appt.End.ToString()+"<br/>");
            }
        }
    }
    private Microsoft.Office.Interop.Outlook.Items GetAppointmentsInRange(
    Microsoft.Office.Interop.Outlook.Folder folder, DateTime startTime, DateTime endTime)
    {
        string filter = "[Start] >= '"+ startTime.ToString("g")+ "' AND [End] <= '"  + endTime.ToString("g") + "'";
        //Response.Write(filter);
        try
        {
            Microsoft.Office.Interop.Outlook.Items calItems = folder.Items;
            calItems.IncludeRecurrences = true;
            calItems.Sort("[Start]", Type.Missing);
            Microsoft.Office.Interop.Outlook.Items restrictItems = calItems.Restrict(filter);
            if (restrictItems.Count > 0)
            {
                return restrictItems;
            }
            else
            {
                return null;
            }
        }
        catch
        {
            return null;
        }
    }
}
...