4

独自のタスク オブジェクトを Outlook のタスクに同期するプログラムを作成する必要があります。操作中に、Outlook のタスクが作成/更新/削除される場合があります。

最も簡単な方法は、Outlook のすべてのタスク アイテムを反復処理して、更新するアイテムを探すことです。非常に大まかに:

ApplicationClass _app;
NameSpace _nameSpace;
MAPIFolder _folder;

_app = new ApplicationClass();
_nameSpace = _app.GetNamespace("MAPI");
_folder = _nameSpace.GetDefaultFolder(OlDefaultFolders.olFolderTasks);

Dictionary<int,MyTask> data = GetData();

for (int i = 1; i <= _folder.Items.Count; i++)
{
    TaskItem taskItem = (TaskItem)_folder.Items.Item(i);
    int itemID;
    if(ItemNeedsProcessing(taskItem, out itemID))
        UpdateItem(taskItem, data[itemID]);
}

ただし、これは、1 つまたは 2 つの変更を行うためだけに、(クライアントの Outlook タスク履歴に応じて)何百ものアイテムを反復処理する可能性があります。

または、タスクを追跡することもできItemIDます...

string itemID = "00000000873..."; //taken from property on object.
object o = _nameSpace.GetItemFromID(itemID); //ignore possible exceptions for now
TaskItem taskItem = (TaskItem)o;

...そして直接更新します(これにより、アプリケーション側でのタスクの作成/削除が多少複雑になります)。

タスク項目を直接取得する ( GetItemFromID) のが最も効率的な方法ですか? それとも、私が見逃している落とし穴がありますか?

4

2 に答える 2

4

Outlook 2007+ が追加さFolder.GetTableれ、Folder.Items. Tables を使用すると、Itemsイテレータよりも最大 10 倍高速になります。

実際のアイテムの取得に関してSession.GetItemFromIDは、アイテムを取得する最速の方法です。特に、 をセカンダリ パラメーターとして渡すと、特定のアイテムがどのストアに属してStore.StoreIDいるかを Outlook が判断する必要がなくなります。EntryID

const string PR_STORE_ENTRYID = "http://schemas.microsoft.com/mapi/proptag/0x0FFB0102";
Outlook.Table tasks = Application.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderTasks).GetTable();
tasks.Columns.Add(PR_STORE_ENTRYID); // optimal for GetItemFromID
while (!tasks.EndOfTable)
{
    Outlook.Row task = tasks.GetNextRow();
    Outlook.TaskItem item = Application.Session.GetItemFromID(task["EntryID"], task.BinaryToString(PR_STORE_ENTRYID)) as Outlook.TaskItem;
} 

最善の方法としては、同期の実行時間を最小限に抑えたい場合は、アプリケーションでTask EntryIDTask StoreIDを追跡する必要があります。それ以外の場合は、すべてのタスクを取得するブルート フォース アプローチが機能しますが、 を使用するFolder.GetTable()代わりに を使用することをお勧めしFolder.Itemsます。

于 2012-06-13T13:41:38.477 に答える
1

SliverNinja の回答に基づいて、Outlook Redemption RDO Libraryを使用することをお勧めします。MAPITableこれはサードパーティの商用ツールですが、Outlook 2003 (およびそれ以降) で使用できます。

于 2012-06-13T18:33:54.233 に答える