2014-01-15 31 views
4

我想知道這是否與特別繁忙的時間谷歌應用程序腳本,因爲它似乎必須做一個(偶爾)延遲更新長度formResponse []數組。我使用下面的代碼來獲得一個形式引發的最新迴應提交:獲取最新的表單響應有時獲取之前,它反而

var form = FormApp.getActiveForm(); 
var formResponses = form.getResponses(); 
var formResponse = formResponses[formResponses.length-1]; //latest response only 
Logger.log('begin length: ' + formResponses.length); 

然後我的腳本的其餘部分與formResponse []數組中的答案進行交互。偶爾,我會注意到它在之前得到了最新迴應的迴應。我可以驗證這一點,因爲帶有表單響應的電子表格顯示實際的最新響應。我的腳本需要5-15秒來執行,所以II必須在我的代碼,以雙倍的尾部增加以下行再次檢查數組的長度:

var form2 = FormApp.getActiveForm(); 
var formResponses2 = form2.getResponses(); 
Logger.log('end length: ' + formResponses2.length); 

,並在日誌中我會發現第二一個比第一個大(而第二個是正確的值)。我並沒有真正發現它發生的時間,但它似乎更常發生在太平洋標準時間上午7點到9點之間。現在我已經添加了一個Utilities.sleep(5000)作爲函數中的第一行,以便在獲取響應之前有時間更新表單,到目前爲止我還沒有任何n-2響應,這讓我覺得有一些在「表單提交」觸發器觸發後,導致表單記錄最新的響應。

有沒有其他人遇到類似的東西?

+0

您只需要得到您提交的回覆或需要所有答案? – wchiquito

+0

我只需要最新的回覆 –

回答

6

當服務器很忙時,這些race conditions會變得更加明顯,但它們只是cloud computing的一切照常工作。簡而言之,文檔的每個用戶都擁有該文檔的視圖(副本),該文檔無法保證始終與「主版本」相同。當您查看電子表格時,您正在查看自己的電子表格副本。你的合作者可能正在查看他們自己的副本。實際上,訪問「電子表格」的觸發器功能也將被賦予其自己的副本。所做的更改任何地方需要同步無處不在,這需要時間。

在這種情況下,您的代碼表明您在Google表單中包含的腳本中具有函數。該腳本觸發後將獲得一份表格副本,包括過去的回覆。但是,觸發腳本的表單提交可能不會與表單提交同步。您還正在處理包含回覆的電子表格...當表單提交到表單服務時,它們存儲在表單服務中,並且它們也存儲在電子表格的副本中。這個動作可能會觸發一個電子表格提交事件,並且(是你的頭痛嗎?)函數將被給予一個電子表格的副本,可能還沒有包含新的表單提交數據!

那麼,該怎麼辦?

讓我們假設你正在使用觸發器函數來處理表單響應。

function handleForm(event) { 
    ... 
} 

如果你只需要處理「目前的形式響應」,應使用被交給觸發,而不是讀的電子表格或查詢的形式迴應事件信息。閱讀Understanding Events以查看提供給您正在處理的特定類型觸發器的事件信息。(額外的好處:使用事件參數從調用服務API,這讓你的函數更快地爲您節省。)

function handleForm(event) { 
    var formResponse = event.response; // The response that triggered this 
             // function is in the event 
    ... 
} 

我建議你也來看看「How can I test a trigger function in GAS?」。

+0

你是對的,我的頭很疼(甚至在你問之前)!謝謝你指出我在這些方向,我會閱讀你提到的主題。我最初嘗試與傳遞給觸發器的事件進行交互,但它一直以「未定義」的形式回來,所以我訴諸於我目前的方法。我會花更多的時間來完成這項工作,因爲它看起來像是一種更優雅的方式來獲得最新的迴應。當我得到它的工作時,我會更新這篇文章。 –

+1

謝謝你指點我正確的方向。讀完之後,我需要做的就是用'var formResponse = event.response;'替換'var formResponse = formResponses [formResponses.length-1];'並解決它!我將我的調試代碼放在了一些試用版本中,它證明即使我的舊方法仍然失敗,事件處理程序就像一個魅力一樣工作!謝謝! –

+0

@Mogsdad我認爲像「handleForm(event)」這樣的函數的使用確實是最好的方式,但這迫使我以舊的方式工作(使用關聯的電子表格)。從Google Form GAS直接觸發的onFormSubmit調用時,它無法正常工作。我無法獲得「事件」(它返回我{「response」:{}})。您是否知道是否有其他方式可以「有效」地直接從Google Form GAS獲取值?感謝Davance,Harold – Harold