3

現在、EWS を使用して、会社のアプリケーションを Exchange 2010 と統合する作業を行っています。EWS を使用して Exchange 2010 への予定を作成していますが、正常に動作します。しかし、最近、予定を作成するときにカスタム/拡張プロパティを追加しようとしました。以下は、拡張プロパティを追加するコードです。

Dim customField As New ExtendedPropertyDefinition(DefaultExtendedPropertySet.PublicStrings, "MyCustomField", MapiPropertyType.String)

appointment.SetExtendedProperty(customField, "CustomFieldValue")

上記のコードは、カスタム フィールドを予定に作成することができます。

ここに私の問題があります。Outlook で作成した予定を開き、[開発者] > [このフォームをデザイン] の [すべてのフィールド] タブに移動すると、[フォルダー内のユーザー定義フィールド] に作成したカスタム フィールドしか表示されませんが、[フォルダー内のユーザー定義フィールド] には表示されません。 「このアイテムのユーザー定義フィールド」。

また、ユーザーが Outlook で予定を開いたときに EWS を使用して作成したカスタム フィールドに反応する Outlook アドインを作成しました。カスタム フィールドを検索しようとしたときに、カスタム フィールドが見つかりませんでした。フィールドは「フォルダ内のユーザー定義フィールド」に作成されますが、「このアイテム内のユーザー定義フィールド」には作成されません。

これは Outlook アドインのコードであり、ユーザーが Outlook で予定を開いたときに実行されます。しかし、カスタム フィールドが「この項目内」にないため、.Find() は Nothing を返します。

Dim appt As Outlook.AppointmentItem
appt = TryCast(inspector.CurrentItem, Outlook.AppointmentItem)
If appt.UserProperties.Find("MyCustomField") Is Nothing Then
    'Some action
Else
    'Some action
End If

私が達成したいのは、EWS を使用してカスタム フィールド (拡張プロパティ) で予定を作成し、ユーザーが Outlook で予定を開いたときに Outlook アドインでカスタム フィールド (拡張プロパティ) を読み取ることです。

編集:

EWS を使用してカスタム フィールドに割り当てた値は、「フォルダー内のユーザー定義フィールド」に表示されます。Outlook アドインから値を取得するにはどうすればよいですか? 値を取得してカスタム フィールドをアイテムに追加し、その値を使用することはできますか?

ありがとう。

4

2 に答える 2

8

答えはここにあります: http://social.technet.microsoft.com/Forums/en-US/exchangesvrdevelopment/thread/2a98b4ab-0fbc-4863-8303-48711a18a050

UserProperties を使用して EWS によって作成された拡張プロパティにアクセスできません。ただし、PropertyAccessor を使用してアクセスできます。

outlookItem.PropertyAccessor.GetProperty("http://schemas.microsoft.com/mapi/string/{00020329-0000-0000-C000-000000000046}/yourProp")
于 2011-05-18T02:38:04.230 に答える
1

最初の回答に欠落していたため、実際の(Delphi)コードを示す別の回答としてこれを投稿しています。
AAppointmentItem は OLEVariant です

const
   GUID_PS_PUBLIC_STRINGS = '{00020329-0000-0000-C000-000000000046}';
   cPublicStringNameSpace = 'http://schemas.microsoft.com/mapi/string/' + GUID_PS_PUBLIC_STRINGS + '/';

var
   lPropertyAccessor: OleVariant;
   lSchemaName, lValue: String;

begin   
   // Use the PropertyAccessor because Outlook UserProperties() can't access the extended properties created by EWS 
   // Use the 'string subnamespace of the MAPI namespace' (http://msdn.microsoft.com/en-us/library/office/ff868915.aspx)
   // with the PS_PUBLIC_STRINGS GUID from http://msdn.microsoft.com/en-us/library/bb905283%28v=office.12%29.aspx
   lPropertyAccessor := AAppointmentItem.PropertyAccessor;
   lSchemaName := cPublicStringNameSpace + PROPERTY_TIMETELLID;  // Name constants defined elsewhere
   try
      lSchemaName := cPublicStringNameSpace + PROPERTY_TIMETELLID;
      lValue := lPropertyAccessor.GetProperty(lSchemaName);
      lEvent.CustSyncTTID := StrToInt(lValue);
   except
   end;
   try
      lSchemaName := cPublicStringNameSpace + PROPERTY_TIMETELLSYNCTIME;
      lValue := lPropertyAccessor.GetProperty(lSchemaName);
      lEvent.CustSyncDate := UTCString2LocalDateTime(lValue);
   except
   end;
   try
      lSchemaName := cPublicStringNameSpace + PROPERTY_TIMETELLSYNCID;
      lValue := lPropertyAccessor.GetProperty(lSchemaName);
      lEvent.CustSyncEntryID := lValue;
   except
   end;

遅延バインディングを行っているため、多くの try exceptions に注意してください。「早い」方がよかったでしょう ( http://blog.depauptits.nl/2012/04/safely-accessing-named-properties-in.html )

また、複数のユーザー プロパティを取得しているので、実際には GetProperties() の方が優れています。

FWIW、これは UserProperties を使用する古いコードでした (lProperty は OLEVariant です)

lProperty := AAppointmentItem.UserProperties.Find(PROPERTY_TIMETELLID);
if IDispatch(lProperty) <> nil then
  lEvent.CustSyncTTID :=  lProperty.Value;
lProperty := AAppointmentItem.UserProperties.Find(PROPERTY_TIMETELLSYNCTIME);
if IDispatch(lProperty) <> nil then
  lEvent.CustSyncDate :=  lProperty.Value;
lProperty := AAppointmentItem.UserProperties.Find(PROPERTY_TIMETELLSYNCID);
if IDispatch(lProperty) <> nil then
  lEvent.CustSyncEntryID := lProperty.Value;            

[2013-6-10 追加編集]

GetProperties を使用して 3 つのプロパティすべてを一度に処理するように変更されたコードを次に示します ( MS が推奨するように)。

lPropertyAccessor := AAppointmentItem.PropertyAccessor;
lSchemas := VarArrayOf([cPublicStringNameSpace + PROPERTY_TIMETELLID,
                        cPublicStringNameSpace + PROPERTY_TIMETELLSYNCTIME,
                        cPublicStringNameSpace + PROPERTY_TIMETELLSYNCID]);
try
  lValues := lPropertyAccessor.GetProperties(lSchemas);
  if VarType(lValues[0]) <> varError then
     lEvent.CustSyncTTID := lValues[0];
  if VarType(lValues[1]) <> varError then
  begin
     lDT := lValues[1];
     lDT := TTimeZone.Local.ToLocalTime(lDT);
     lEvent.CustSyncDate := lDT;
  end;
  if VarType(lValues[2]) <> varError then
    lEvent.CustSyncEntryID := lValues[2];
except
end;
于 2013-06-19T13:16:21.213 に答える