2

挿入します私はGoogleカレンダーのAPIを使用していると私はこのような別のカレンダーからイベントをコピーしてい

CalendarService service = new CalendarService(new BaseClientService.Initializer() 
      { 
       HttpClientInitializer = credential, 
       ApplicationName = this.ApplicationName 
      }); 
CalendarListResource.ListRequest calRequest = service.CalendarList.List(); 
calRequest.MinAccessRole = CalendarListResource.ListRequest.MinAccessRoleEnum.Owner; 
CalendarList calendars = calRequest.Execute(); 
CalendarListEntry selectedCalendar = calendar.Items[0]; 

EventsResource.ListRequest eventRequest = service.Events.List(selectedCalendar.Id); 
eventRequest.TimeMin = DateTime.Now; 
eventRequest.ShowDeleted = false; 
eventRequest.SingleEvents = true; 
eventRequest.MaxResults = 50; 
eventRequest.OrderBy = EventsResource.ListRequest.OrderByEnum.StartTime; 
Events events = eventRequest.Execute(); 

Event currentEvent = events.Items[0]; 
EventsResource.InsertRequest copyRequest = service.Events.Insert(currentEvent, calendarToCopyTo.Id); 
copyRequest.Execute(); 

それは素晴らしい作品....最初の時間。 2回目は、イベントIDがcalendarToCopyToで一意ではなくなりました(作成したばかりのイベントを削除してもう一度試しても)。私の質問は、「挿入している」イベントで新しいIdを生成させるにはどうしたらいいですか?私はこれらの行の前にcurrentEvent.Id = "";を試しましたが、うまくいかなかったようです。

Google.Apis.Requests.RequestError要求された識別子はすでに です。 [409]エラー[メッセージ[要求された識別子が既に 存在]場所[ - ]理由[]ドメインを複製し、[グローバル]]

このexample(.NET 1)によると、私はおそらくちょうど作成する必要があります新しいEventオブジェクト(currentEventに基づいています)を挿入リクエストにパラメータとして送信します。もう1つの質問は、1つのEvent変数(ここではcurrentEvent)のすべてのプロパティを別のものにコピーする最も簡単な方法は何ですか?

+0

currentEventオブジェクトからidを削除できますか?またはオブジェクトを新しいオブジェクトにクローンしてIDが削除されるようにすることはできますか?これは私にとって奇妙なバグのように聞こえる。挿入時にあなたが送信したIDを無視して、GoogleがIDを作成しているはずです。あなたが得ている正確なエラーは何ですか? – DaImTo

+0

ええ、私はGoogleが毎回新しいイベントのIDをcalendarToCopyToに作成することを望んでいました(あなたが送信したイベントのIDに関係なく)。例外の正確なメッセージは次のとおりです: 'Google.Apis.Requests.RequestError要求された識別子が既に存在します。 [409]エラー[メッセージ[要求された識別子はすでに存在します。]場所[ - ]理由[重複]ドメイン[グローバル]] '。 https://developers.google.com/google-apps/calendar/v3/errorsでは、新しいIDを生成する必要があることを示しています。新しいIDを作成する以外に、IDを生成する方法がわかりません – derekantrican

+0

あなたはあなたのコードの残りの部分を投稿できますか?currentEventはどうですか? – DaImTo

答えて

0

OK]をクリックして、ここで私が学んだことだ(と私が作ってみた溶液):あなたは、私は上記の持っていた私のコードを使用したい場合は

まずオフ、あなたはの両方を呼び出す必要があります

currentEvent.Id = ""; 
currentEvent.ICalUID = ""; 

IdためとICalUIDの両方IDとして使用されているので、両方がリセットされなければならない):copyRequest前に、これらの線が初期化されます。 ここで重要な注意: UpdateRequestのようなものをcurrentEventで呼び出す場合は、そのオブジェクトのIDをクリアしたために問題が発生します(UpdateRequestはeventIdをパラメータとして必要とするため、以前は、そのリクエストを初期化する前に、IdとICalUIDをもう一度 "再設定"する必要がありました)。 [ICalUIDはと本質的に同じであるId + "@google.com"]

私のソリューション:、当時の私UpdateRequest前にそれらを設定したIDとICalUID、明確なことは、イベントのコピーを保存するのではなく、私はcloneメソッドを作成し

イベントをクローニングする:

private Event clone(Event eventToClone) 
{ 
    Event result = new Event(); 

    foreach (PropertyInfo property in typeof(Event).GetProperties()) 
    { 
     if (property.CanRead) 
      property.SetValue(result, property.GetValue(eventToClone, null)); 
    } 

    return result; 
} 

は、だから今、別のカレンダーにイベントをコピーするための私のコードは、ちょうどこのようになります。

Event newEvent = clone(currentEvent); 
newEvent.Id = ""; 
newEvent.ICalUID = ""; 
EventsResource.InsertRequest copyRequest = service.Events.Insert(newEvent, calendarToCopyTo.Id); 
copyRequest.Execute(); 

これは将来誰かに役立つことを願っています!

0

あなたは存在しないので、もしそれが、それはこのように、更新される他、作成され、トライキャッチを使用することができます:それは完璧に動作します私の解決策では

try 
{ 
    service.Events.Insert(newEvent, calendarId).Execute(); 
} 
catch (Exception) 
{ 
    service.Events.Update(newEvent, calendarId, newEvent.Id).Execute(); 
} 

関連する問題