2014-07-23 22 views
1

摘要:谷歌日曆API始終進行分頁事件列表

Google_Service_Calendar似乎是 「強制分頁」 的$service->events->listEvents();

背景效果:使用PHP

谷歌日曆API V3, 客戶端庫

我們正在開發一種機制來同步我們的內部日曆與用戶的谷歌日曆。 請注意我將在下面引用$ x,它代表google對事件數量的默認限制,類似於$ options ['maxResults'];默認值爲250,但不應該緊急:我們已經測試了下面是否有明確定義的請求參數,如'maxResults','timeMin'和'timeMax' - 在所有情況下都會出現問題。

我們做的另一個相關測試:將這個日曆導出到foobar.ics,創建一個新的gmail用戶表單,將foobar.ics導入到[email protected]。不代表這個問題。我們已審覈/重置主題日曆中的各種選項(共享等),但找不到任何有效的設置。

問題:

通常情況下,當我們把這個:

$calendar='primary'; 
$optParams=array(); 
$events = $this->service->events->listEvents($calendar, $optParams); 

$事件回來的Google_Service_Calendar_Events對象,包含$ N 「項」。如果有超過$ x項目,結果可能會分頁,但香草響應(對於'正常'結果集(count($ items)< $ x))是單個對象,並且$ events-> nextPageToken應該是空的。

我們正在使用的一個帳戶(當然,老闆的個人帳戶)並不這樣做。結果:

$events = $this->service->events->listEvents('primary', []); 

Google_Service_Calendar_Events對象是這樣的:

Google_Service_Calendar_Events Object 
(
    [accessRole] => owner 
    [defaultRemindersType:protected] => Google_Service_Calendar_EventReminder 
    [defaultRemindersDataType:protected] => array 
    [description] => 
    [etag] => "-kakMffdIzB99fTAlD9HooLp8eo/WiDS9OZS7i25CVZYoK2ZLLwG7bM" 
    [itemsType:protected] => Google_Service_Calendar_Event 
    [itemsDataType:protected] => array 
    [kind] => calendar#events 
    [nextPageToken] => CigKGmw5dGh1Mms4aWliMDNhanRvcWFzY3Y1ZGkwGAEggICA6-L3lrgUGg0IABIAGLig_Zfi278C 
    [nextSyncToken] => 
    [summary] => [email protected] 
    [timeZone] => America/New_York 
    [updated] => 2014-07-23T15:38:50.195Z 
    [collection_key:protected] => items 
    [modelData:protected] => Array 
     (
      [defaultReminders] => Array 
       (
        [0] => Array 
         (
          [method] => popup 
          [minutes] => 30 
         ) 

       ) 

      [items] => Array 
       (
       ) 

     ) 

    [processed:protected] => Array 
     (
     ) 

) 

注意$event['items']是空的,而nextPageToken不爲空。如果我們這樣做一個分頁請求:

 while (true) { 
      $pageToken = $events->getNextPageToken(); 
      if ($pageToken) { 
       $optParams = array('pageToken' => $pageToken); 
       $events = $this->service->events->listEvents($calendar, $optParams); 
       if(count($events) > 0){ 
        h2("Google Service returned total of ".count($events)." events."); 
       } 

      } else { 
       break; 
      } 
     } 

下一個結果集爲我們提供了事件。換句話說,儘管我們確信結果小於$ x,但Google服務似乎正在對初始結果進行分頁。

要清楚,如果我們在日曆上有5個事件,我們預計1個結果包含5個項目。相反,我們得到1個結果爲0項,但'nextPageToken'邏輯的第一個結果給了我們所需的5個項目。

的解決思路?:

A.處理分頁結果,和/或「增量同步化」。這些都是我們的功能來實現清單上,但我們認爲這是更'不是‘必要性’優化換句話說,我明白處理/發送nextSyncToken和nextPageToken是可選的 - 因此我們所面臨的問題不應該依賴於我們的客戶端代碼這樣做。B.爲該用戶使用不同的非主要日曆。我們認爲這個特定的主日曆可能會損壞或以某種方式緩存在谷歌方面:公平地說,我們曾經在一個點上意外插入了一堆垃圾事件到這個日曆上,以至於Google將我們置於只讀模式,如下所述: https://support.google.com/a/answer/2905486?hl=en但是我們知道這是一個笨重的測試的暫時結果....換句話說,我們知道我們已經搞糟了這個日曆,但今天早上我們刪除了所有事件,添加了單個測試事件,並得到了與以上爲這個日曆。無法複製任何其他用戶....包括全新的Gmail用戶。 C.刪除'主'日曆,創建一個新的日曆。不幸的是,我們知道刪除主CALENDAR是不可能的,只能刪除CALENDAR EVENTS。

D.讓老闆打開一個全新的谷歌帳戶

任何其他建議?我們正在與A進行協商,但即使這也是解決問題的創可貼,並沒有回答爲什麼會發生這種情況?我們今後如何避免它? (請不要說「D」)

在此先感謝您的任何建議或意見!

回答

1

有一個最大頁面大小,如果你自己沒有指定一個,那麼就有一個隱含的頁面大小(https://developers.google.com/google-apps/calendar/v3/pagination)。鑑於此,有必要爲您的應用實施分頁以正確工作。

正如您注意到的,頁面並不總是包含最大數量的結果,因此即使事件數量未超過頁面大小,分頁也很重要。只要保持以下的頁面標記,它會最終給你所有的結果(會有沒有nextPageToken這個頁面)

TL; DR A :)

+0

https://developers.google.com/google- apps/calendar/v3/reference/events/list解釋了關於maxResults的信息:「默認值爲250個事件,頁面大小不能超過2500個事件。在這種情況下,我們要求一個小集合(在某些測試中確切爲1),所以隱式最大頁面大小限制不應該是一個因素。你說,「一個頁面並不總是包含最大數量的結果」即使查詢不超過最大值? (隱式或顯式)我想知道爲什麼ELSE響應不包含結果,如果小於極限?我還有其他問題嗎? thx luc – Ryan

+0

你說日曆中有很多意外事件,並且你刪除了這些事件。如果你指定showDeleted = true,我敢打賭你會得到很多完整的頁面。無論如何,如果你實現了下面的頁面標記,你應該沒問題。它不超過20行代碼.. – luc

+0

經過多次實驗,刪除的事件似乎是罪魁禍首。結果有時甚至會在想要的結果之前發送幾個空白頁面(如果showDeleted = true,將會是滿的)...我認爲這種行爲並不直觀,我寧願文檔不建議分頁是可選的。但是,嘿,它的作品!再次感謝,luc – Ryan