Не удается вызвать свойство «Размер» для win32com.client.Dispatch AppointmentItem после получения назначений в Outlook

Я использую win32com.client для доступа к приложению Outlook. Мне удалось получить встречи из календаря, но я заинтересован в получении количества встреч, не попадая в цикл for.

Я делаю следующее:

import win32com.client
outlook = win32com.client.Dispatch("Outlook.Application")
namespace = outlook.GetNamespace('MAPI')

appointments = namespace.GetDefaultFolder(9).Items

appointments.Sort("[Start]")
appointments.IncludeRecurrences = "True"

restriction = "[Start] >= '" + start_date.strftime('%Y.%m.%d') + "' AND [Start] <= '" + \
              end_date.strftime('%Y.%m.%d') + "'"
restricted_items = appointments.Restrict(restriction)
print(restricted_items.Size)

Из этой ссылки с описанием API AppointmentItem, я обнаружил, что могу получить размер объекта Outlook. Но выдает исключение

AttributeError: '<win32com.gen_py.Microsoft Outlook 15.0 Object Library._Items instance at 0x73837256>' object has no attribute 'size'

Что я делаю не так?

Кстати, я хочу использовать это, чтобы проверить любые встречи, полученные в результате вышеуказанного запроса, чтобы я не использовал объект restriction на None.


person Saad    schedule 07.06.2018    source источник


Ответы (1)


Restrict вернуть элементы коллекция. Он не предоставляет свойство Size — вам нужно Count.

И если размер коллекции заранее неизвестен (Outlook вычисляет его по запросу), используйте Items.GetFirst/GetNext для циклического перебора элементов в коллекции.

person Dmitry Streblechenko    schedule 08.06.2018
comment
Извините за комментарий через некоторое время, но Count тоже не работает. Я ввел даты, на которые у меня нет товаров для Restrict. Для этого я бы ожидал, что Count будет 0. Но он возвращает что-то вроде 2147483647. - person Saad; 28.06.2018
comment
2147483647 равно -1. Это означает, что OOM еще не знает, вам нужно перебрать элементы, используя Items.GetFirst/GetNext. - person Dmitry Streblechenko; 28.06.2018
comment
Я решил свою проблему, используя if restricted_items.GetFirst(). Пожалуйста, измените свой ответ соответствующим образом, чтобы я принял его. - person Saad; 04.07.2018