0

现在,我正在用 Python 编写一个程序,该程序可以从我的 Google 帐户中的所有日历中提取事件;但是,我正在尝试使该程序尽可能商业化。话虽如此,当我知道附加到我的日历的所有美国假期事件都是全天事件时,为自己自定义代码非常简单,因此我可以设置一个简单的 if 语句来检查它是否是假期日历并指定事件请求如下:

def get_main_events(pageToken=None):
  events = gc_source.service.events().list(
    calendarId=calendarId,
    singleEvents=True,
    maxResults=1000,
    orderBy='startTime',
    pageToken=pageToken,
    ).execute()
  return events

因此,这适用于全天活动。之后,我会将结果附加到列表中并对其进行过滤以仅获取我想要的事件。现在从我的主日历中获取事件更容易指定我想要的事件,因为它们通常不是全天事件,只是我的工作时间表,所以我可以使用:

now = datetime.now()
now_plus_thirtydays = now + timedelta(days=30)
def get_main_events(pageToken=None):
  events = gc_source.service.events().list(
    calendarId=calendarId,
    singleEvents=True,
    maxResults=1000,
    orderBy='startTime',
    timeMin=now.strftime('%Y-%m-%dT%H:%M:%S-00:00'),
    timeMax=now_plus_thirtydays.strftime('%Y-%m-%dT%H:%M:%S-00:00'),
    pageToken=pageToken,
    ).execute()
  return events

现在,我在使该程序可用于商业用途以及我自己时遇到的问题是,上述内容只会从我的主日历返回非全天事件。我想知道是否有一种方法——如果有,如何——运行获取事件请求并返回所有结果,无论它们是全天的还是只是发生在部分时间的定时事件天。此外,这个问题的一部分是在我打印需要使用的结果的代码的另一部分中:

print event['start']['date']

对于全天活动,并且:

print event['start']['dateTime']

对于非全天活动。

因此,由于“日期时间”不适用于全天活动,我想找到一种设置方法,以便我可以评估活动是否全天。即“如果所述事件是全天事件,则使用事件['start']['date'],否则使用事件['start']['dateTime']

4

1 回答 1

1

因此,通过大量测试,并找到一种方法来使用日志功能来查看发生了什么错误:

print event['start']['date']

与:

print event['start']['dateTime']

我发现我可以使用“try”和“except”来利用错误结果。

这是结果修复:

首先是前面的初始部分,对日历进行实际查询:

now = datetime.now()
now_plus_thirtydays = now + timedelta(days=30)
def get_calendar_events(pageToken=None):
    events = gc_source.service.events().list(
        calendarId=cal_id[cal_count],
        singleEvents=True,
        orderBy='startTime',
        timeMin=now.strftime('%Y-%m-%dT%H:%M:%S-00:00'),
        timeMax=now_plus_thirtydays.strftime('%Y-%m-%dT%H:%M:%S-00:00'),
        pageToken=pageToken,
        ).execute()
    return events

然后是事件处理部分:

# Events Portion
    print "Calendar:  ", cal_summary[cal_count]
    events = get_calendar_events()
    while True:
        for event in events['items']:
            try:
                if event['start']['dateTime']:
                    dstime = dateutil.parser.parse(event['start']['dateTime'])
                    detime = dateutil.parser.parse(event['end']['dateTime'])
                    if dstime.strftime('%d/%m/%Y') == detime.strftime('%d/%m/%Y'):
                        print event['summary'] + ": " + dstime.strftime('%d/%m/%Y') + " " + dstime.strftime('%H%M') + "-" + detime.strftime('%H%M')
                        # Making a list for the respective items so they can be iterated through easier for time comparison and TTS messages
                        if cal_count == 0:
                            us_holiday_list.append((dstime, event['summary']))
                        elif cal_count == 1:
                            birthday_list.append((dstime, event['summary']))
                        else:
                            life_list.append((dstime, event['summary']))
                    else:
                        print event['summary'] + ": " + dstime.strftime('%d/%m/%Y') + " @ " + dstime.strftime('%H%M') + " to " + detime.strftime('%H%M') + " on " + detime.strftime('%d/%m/%Y')
                        # Making a list for the respective items so they can be iterated through easier for time comparison and TTS messages
                        if cal_count == 0:
                            us_holiday_list.append((dstime, event['summary']))
                        elif cal_count == 1:
                            birthday_list.append((dstime, event['summary']))
                        else:
                            life_list.append((dstime, event['summary']))
                else:
                    return
            except KeyError:
                dstime = dateutil.parser.parse(event['start']['date'])
                detime = dateutil.parser.parse(event['end']['date'])
                print event['summary'] + ": " + dstime.strftime('%d/%m/%Y')
                # Making a list for the respective items so they can be iterated through easier for time comparison and TTS messages
                if cal_count == 0:
                    us_holiday_list.append((dstime, event['summary']))
                elif cal_count == 1:
                    birthday_list.append((dstime, event['summary']))
                else:
                    life_list.append((dstime, event['summary']))

        page_token = events.get('nextPageToken')
        if page_token:
            events = get_calendar_events(page_token)
        else:
            if cal_count == (len(cal_id) - 1):  # If there are no more calendars to process
                break
            else:  #Continue to next calendar
                print "-----"
                cal_count += 1
                print "Retrieving From Calendar:  ", cal_summary[cal_count]
                events = get_calendar_events()
于 2013-08-25T19:50:12.010 回答