2014-07-04 25 views
-1

所以我有一個電子表格腳本表單提交觸發設置了:源對象在谷歌Apps腳本提交事件

ScriptApp.newTrigger('onConfirmationFormSubmit').forForm(confirmationForm).onFormSubmit().create(); 

與處理函數:

function onConfirmationFormSubmit(event) 
{ 
    Logger.log('Source object ID:'); 
    Logger.log(event.source.getId()); 
    Logger.log('Spreadsheet ID'); 
    Logger.log(SpreadsheetApp.getActiveSpreadsheet().getId()); 
} 

現在,根據this頁,對於表單提交事件,在事件參數的源對象應該是已提交的表格 - 但是當一個表單提交,上面的代碼提供了以下日誌輸出:

[14-07-04 17:03:59:417 EST] Source object ID: 
[14-07-04 17:03:59:417 EST] 1I7ap9XJuFJtTgcM4xIFpE-IGqXQE8ohDJEpN7oN9IUk 
[14-07-04 17:03:59:417 EST] Spreadsheet ID 
[14-07-04 17:03:59:418 EST] 1I7ap9XJuFJtTgcM4xIFpE-IGqXQE8ohDJEpN7oN9IUk 

上面鏈接的文檔頁面指出,source屬性應該始終是一個Form對象,但它似乎是一個Spreadsheet對象 - 這是打算使用嗎?

爲了說明起見,您不能通過在腳本編輯器中單擊「當前項目的觸發器」按鈕來爲電子表格設置此類型的觸發器,它只能使用我發佈的第一個代碼段創建。請參閱:

http://imgur.com/FoVTaPB.jpg

(此圖像中,爲onFormResponse功能觸發以編程方式創建,而someOtherFunction觸發與「添加新的觸發」按鈕創建)。

回答

0

未能提供該事件的屬性.source被記錄在Google Code Issue 4810

幸運的是,至少一種變通方法,在關於這一問題,這是使用響應的getEditResponseUrl方法的評論提供去形式。下面是我的實施,修復了事件對象添加缺少的源函數的形式修復:

function fixBrokenEvent (event) { 
    if (! event.source) { 
    var responseEditUrl = event.response.getEditResponseUrl(); //gets  edit response url which includes the form url 
    var responseUrl = responseEditUrl.toString().replace(/viewform.*/,''); //returns only the form url 
    event.source = FormApp.openByUrl(responseUrl); //gets the submitted form id 
    } 
    return event 
} 

此變通方法的伎倆我。另一種解決方案是使用觸發UID並通過觸發器從ScriptApp.getProjectTriggers()爲正確的觸發UID搜索列表。

...

function fixEventWithTriggers (event) { 
    ScriptApp.getProjectTriggers().forEach(function (trigger) { 
     if (trigger.getUniqueId()==event.triggerUid) { 
     event.source = FormApp.openFormById(trigger.getSourceId()) 
     return event 
     } 
    } 
} 

這最後的解決辦法來自評論#5 Issue 3786

0

有因觸發的情況下,一個電子表格(你調用的那種),並從德表單文件的文件類型的兩種形式提交。在文檔中,電子表格沒有解釋源參數,但看起來已經實現了。

源指示觸發事件是你的文件的文件,並沒有相關的表單的來源。

如果您需要在電子表格腳本中打開表格文件,則必須通過[FormApp.openById][1][FormApp.openByUrl][2]傳遞硬編碼的ID/URL來打開文件。這將使腳本要求您提供表單授權。

+0

我敢肯定,觸發源是一個表單提交事件。調用'Logger.log(JSON.stringify(e));'給出'{「response」:{},「source」:{},「authMode」:{}}' - 沒有其他類型的事件通過只有這些屬性的對象。電子表格事件(我假設你指的是Spreadsheet Form Submit事件)傳遞一個具有'values','range'和'namedValues'屬性的對象。 – Mridsole

0

我固定的代碼

function fixEventWithTriggers (event){ 
    ScriptApp.getProjectTriggers().forEach(function (trigger) { 
     if (trigger.getUniqueId()==event.triggerUid) { 
     Logger.log("trigger source id: " + trigger.getTriggerSourceId()) 
     event.source = FormApp.openById(trigger.getTriggerSourceId()) 
     Logger.log("e.source: "+event.soure) 
     return event 
     } 
    }) 
    return event 
}