11

そのため、スケジューリングマネージャーがスケジュールを投稿/更新するときに、作業カレンダーを各従業員の Google カレンダーと自動的に同期させたいと考えています。ユーザーは最初に AuthSub トークンを使用してオプトインしますが、その後は自動的に行われます。彼らが予定している他のイベントとの競合を避けるために、「Work App」という名前の新しいカレンダーか、かなりユニークなものを作成したいと考えています。次に、更新の場合、新しいイベントを作成する前に、その範囲からイベントを削除するだけです。そこで、いくつか質問があります...

  1. API を使用して必要な特定のカレンダーを選択するにはどうすればよいですか? (ちなみに、これはすべてPHPで、Zend Frameworkを使用しています)。カレンダーのリストを照会できる場所はわかりますが、ドキュメントにはその特定のカレンダーに追加する方法が示されていません。

  2. カレンダーを作成できますか? オプトインしたユーザーにそのようなカレンダーを作成してもらうだけでよいですか? もしそうなら、イベントを追加するためのような URL を作成するために生成できる URL はありますか? (物事をシンプルで一貫性のあるものにするためのものですよね?)

  3. もちろん、ユーザーに資格情報を保存してほしくありませんが、更新ごとにアクセスを要求したくもありません。永続的なアクセスには OAuth トークンが必要ですか? URL トークンは 1 回限りの使用であることはわかっていますが、セッション トークンを保存して 1 週間後に再利用できますか?

  4. 重複を避けるために各イベントをクエリする以外の方法はありますか? 昨夜これをテストしていたところ、同じ 50 のイベントのインスタンスが 7 つになりました。追加するたびにチェックしてサーバー時間を追加したくありません。

  5. 最後に、複数のイベントを追加する方法や、単に ics ファイルをカレンダーにプッシュする方法はありますか。現在、スクリプトで SQL クエリを実行し、結果をループしながら各イベントを追加しています。予想以上に時間がかかるようですので、ics ファイルをビルドするか、すべてのイベントを 1 つのオブジェクトに追加して一度に追加する方がよいでしょう。ありがとう!

4

2 に答える 2

26

誰も答えなかったので、Google Calendar API の PHP 以外のドキュメント、特に .NET に関するドキュメントと生のプロトコルを少しだけ調べてみることにしました。そして、あなたはそれを知らないでしょうか...

.NET のドキュメントにアクセスすると、優れた新機能、特に、認証されたユーザー用に新しい非プライマリ カレンダーを作成する方法と、非プライマリ カレンダーにイベントを追加する方法について言及されています。

もちろん、このドキュメントは PHP 領域のどこにも表示されず、1 対 1 の相関関係はないようです。新しいカレンダーを作成するために、最初にいくつかの明白なことを試してから、壊れたものを探して、それほど明白ではないことを試しました。ラジオの沈黙の理由が、誰も答えを知らなかったが、確かに知りたいということだった場合に備えて、共有したいと思いました.

新しいカレンダーを作成するには:

これには 2 つの鍵があります。

  1. カレンダー イベントを追加するには、同じ方法を使用する必要があります。insertEvent()

  2. メソッドで投稿 URL を設定する必要があります。それ以外の場合は、デフォルトのフィード URL に移動します。

この例では、App Calendar が既に存在するかどうかを確認し、存在しない場合は作成します。

 //Standard creation of the HTTP client
 $gdataCal = new Zend_Gdata_Calendar($client);

 //Get list of existing calendars
 $calFeed = $gdataCal->getCalendarListFeed();

 //Set this to true by default, only gets set to false if calendar is found
 $noAppCal = true;

 //Loop through calendars and check name which is ->title->text
 foreach ($calFeed as $calendar) {
  if($calendar -> title -> text == "App Calendar") {
   $noAppCal = false;
  }
 }

 //If name not found, create the calendar
 if($noAppCal) {

  // I actually had to guess this method based on Google API's "magic" factory
  $appCal = $gdataCal -> newListEntry();
  // I only set the title, other options like color are available.
  $appCal -> title = $gdataCal-> newTitle("App Calendar"); 

  //This is the right URL to post to for new calendars...
  //Notice that the user's info is nowhere in there
  $own_cal = "http://www.google.com/calendar/feeds/default/owncalendars/full";

  //And here's the payoff. 
  //Use the insertEvent method, set the second optional var to the right URL
  $gdataCal->insertEvent($appCal, $own_cal);
 }

そして、あなたはそれを持っています。次の目標は、既定のカレンダーではなく、そのカレンダーにイベントを挿入することです。

非プライマリ カレンダーへのイベントの追加

おそらく推測できる簡単な部分は、そのオプションの URL を :insertEvent($newEvent, $calURL)のように再度設定する必要があることです。トリッキーな部分は、カレンダーの URL を取得することです。「所有されたカレンダー」パスとは異なり、特定のカレンダーにはユーザー固有の情報が含まれているだけでなく、ある種のハッシュルックイン ID も含まれています。

コードは次のとおりです。

 //Set up  that loop again to find the new calendar:
 $calFeed = $gdataCal->getCalendarListFeed();
 foreach ($calFeed as $calendar) {
  if($calendar->title->text == "App Calendar")
   //This is the money, you need to use '->content-src'
   //Anything else and you have to manipulate it to get it right. 
   $appCalUrl = $calendar->content->src;
 }

 //.......... Some Assumed MySQL query and results .............

      while ($event = $result->fetch_assoc()) {
   $title = $event['description'];

   //Quick heads up
   //This is a handy way of getting the date/time in one expression.
   $eventStart = date('Y-m-d\TH:i:sP', strtotime($event['start']));
   $eventEnd = date('Y-m-d\TH:i:sP', strtotime($event['end']));

   $newEvent = $gdataCal->newEventEntry();
   $newEvent->title = $gdataCal->newTitle($title);
   $when = $gdataCal->newWhen();
   $when->startTime = $eventStart;
   $when->endTime = $eventEnd;

   $newEvent->when = array($when);

   //And at last, the insert is set to the calendar URL found above
   $createdEvent = $gdataCal->insertEvent($newEvent, $appCalUrl);
  }
  echo "<p>".$result->num_rows." added to your Google calendar.</p>";

私の質問を読んで、それについて考えてくれた人に感謝します。誰かが上記のコードを引き締める方法を知っている場合 (おそらく 2 つのループは必要ありませんか?)、フィードバックをお待ちしております。

于 2009-10-10T17:32:28.033 に答える
1

Anthonyは、GoogleCalendarAPIサイトのv1ドキュメントまたはv2ドキュメントのいずれかを参照していると思います。私は、 v2プロトコルガイドに従うことにより、Perlでこれを非常に簡単に管理しました。

重要なのは、投稿先のURLを変更することです。デフォルトの「/calendar/ feeds / default / private / full」の代わりに、最初に利用可能なカレンダーのリストを取得し、次に必要なカレンダーからcontent / @ src値を取得して、それに投稿します(例:/ calendar / feeds /)。 1234567890abcdefeg%40group.calendar.google.com / private / full

于 2010-06-28T10:17:24.097 に答える