2017-11-15 8 views
0

免責事項:私は比較的新しいPythonです。私は、特定の列がOutlookの予定表アイテム(件名、主催者、日付の一致など)と一致するかどうかを確認してから、スクリプトに新しい列に一致するものがあることを確認するスクリプトを作成しようとしています私は大きく盗んだthis questionから)。以下は私の全体のスクリプトです。Outlookの予定表日付をCSV日付に合わせてリストに追加する

import win32com.client, datetime, re, os, csv, shutil 

# set cwd, create copy of original CSV, and access outlook API 
os.chdir('C:\\') 
shutil.copy('masterCheck.csv', 'inspectCheck.csv') 
outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI") 

inspectors = {'ASMITH': 'Smith, Aaron', 'JDOE': 'Doe, Jane', 'KZEEBOP': 'Zeebop, Kim'} 

#access csv and put it into a list 
with open('inspectCheck.csv', 'r', newline = '', encoding='utf-8') as csvAppointments: 
    reader = csv.reader(csvAppointments) 
    masterList = list(reader) 
    del masterList[-1] # delete blank nested list 
    del masterList[1] #delete header 
    for i in masterList: # switch out names so they can match Outlook descriptors later 
     for key, value in inspectors.items(): 
      if i[3] in key: 
       i[3] = value 

# create another list for appending later in the script 
finalList = [] 
finalList += masterList 

# access the inspectors' calendars 
x = 0 
try: 
    for inspector in inspectors.values(): 
     recipient = outlook.createRecipient(inspector) 
     resolved = recipient.Resolve() 
     sharedCalendar = outlook.GetSharedDefaultFolder(recipient, 9) 
     codeAppointments = sharedCalendar.Items 

     #restrict to items in the next year 
     begin = datetime.date.today() 
     end = begin + datetime.timedelta(days = 365); 
     restriction = "[Start] >= '" + begin.strftime("%m/%d/%Y") + "' AND [End] <= '" +end.strftime("%m/%d/%Y") + "'" 
     restrictedItems = codeAppointments.Restrict(restriction) 

     # loop through inspectors' appointments and match 
     for appointmentItem in restrictedItems: 
      for i in masterList: 
       addressSearch = i[1] 
       if re.search(r'%s' % addressSearch, appointmentItem.Subject, re.IGNORECASE)\ 
        and i[3] in appointmentItem.Organizer\ 
        and i[4] in appointmentItem.Start: 
        finalList[x].append(appointmentItem.Subject) 
        x += 1 
except IndexError: 
    pass 

# update spreadsheet 
with open('inspectCheckFinal.csv', 'w', newline = '') as csvAppointments: 
    appointmentsWriter = csv.writer(csvAppointments) 
    appointmentsWriter.writerows(finalList) 

私のCSVからOutlookアイテムへの一致が成功しました。たとえば、私はこれを一致させることができます。

if re.search(r'%s' % addressSearch, appointmentItem.Subject, re.IGNORECASE) 

はしかし、すぐに私は私の日付列にそれを一致させようとして、(I [4])は、エラーがスローされます。はTypeError:型の引数 'pywintypes.datetimeは' 反復可能ではありません。私のCSVの日付は2/11/2018のようですが、Outlookの日付(印刷時)は2017-11-16 11:00:00 + 00:00のようになります。私はこれらの2つをどのようにマッチさせるかについて迷っています。

また、CSVに成功したことを示すのに問題があります。スクリプトは各ネストされたリストの末尾に値を追加します(そしてそれをCSVに書き込む)が、CSVの一致した行に値を追加しません。例えば、私の出力は次のようになります。

Inspector  |Address  |Date  |Success?(print Address) 
ASMITH  |212 Clark St|11/21/18 |Yes. 33 Blart Ave 
ASMITH  |33 Blart Ave|11/20/18 |Yes. 212 Clark St 

私の推測では、私のスクリプトは、Outlookで一致を検出して、ネストされたリストの最後にその値を追加することです。私がしたいのは、実際にマッチした行/ネストされたリストにマッチさせることです。長い投稿のお詫びとそれを読んだ人に感謝します。

答えて

0

ネヴァーマインドは、私はそれが今Outlookのフォーマットに一致するように、また、私は事前に私のCSVを再フォーマット

and i[4] in appointmentItem.Start: 
# to 
and i[4] in str(appointmentItem.Start): 

を変換することによって、例外TypeErrorを解決しました。私の試合が間違った行に追加された場合、別のCSV /データフレームにマッチを追加し、そのデータフレームを元のCSV /データフレームに追加することで解決すると思います。

関連する問題