2016-06-15 22 views
1

我在一張特定的電子表格中有兩張表格,這兩張表格都與表格提交相關聯。第一張表單應該發送一封包含表單提交數據的電子郵件(原件由Amit Agarwal創建,這裏是an historic link)。第二張表格沒有做任何特殊的事情,因爲它只是從表格中收集數據。有問題的腳本設置爲On Form Submit觸發器。確保表單提交觸發器只運行一張工作表

我遇到的問題是腳本有時從表單/表單2運行。我想指定腳本需要觸發哪個表單/表單來運行。我創建的修改後的代碼基於大量環顧四周。下面是摘錄:

function Initialize() { 

var triggers = ScriptApp.getProjectTriggers(); 

for (var i in triggers) { 
ScriptApp.deleteTrigger(triggers[i]); 
} 

ScriptApp.newTrigger("SendConfirmationMail") 
.forSpreadsheet(SpreadsheetApp.getActiveSpreadsheet()) 
.onFormSubmit() 
.create(); 

} 

function SendConfirmationMail(e) { 

try { 

var ss, bcc, sendername, subject, columns; 
var message, value, textbody, sender; 

var ss = SpreadsheetApp.getActiveSpreadsheet(); 
var s = ss.getSheetByName('Help Request Tickets'); 
var rowNumber = s.getActiveRange().getRowIndex(); 
var row = e.range.getRow(); 
// This is your email address and you will be in the BCC 
bcc = "email", "email"; 

// This will show up as the sender's name 
sendername = "sendername"; 

// Optional but change the following variable 
// to have a custom subject for Google Docs emails 
subject = "subject" 

// This is the body of the auto-reply 
message = "message" 


ss = SpreadsheetApp.getActiveSheet(); 
columns = ss.getRange(1, 1, 1, ss.getLastColumn()).getValues()[0]; 

這兩行我雖然被認爲做到這一點:

var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var s = ss.getSheetByName('Sheet1'); 

我想劇本認爲Sheet2中是有效的(這要是我有電子表格開放可能的情況下)。當然有辦法解決/完成這個,我錯過了什麼?

+0

Amit更新了最初包含該代碼的博客條目,現在描述安裝和使用他的Google表單插件。但是,在該backback機器中該帖子的最早版本具有代碼,但是:[here](https://web.archive.org/web/20140126020722/http://www.labnol.org/internet/auto-confirmation-電子郵件/ 28386)。 – Mogsdad

回答

2

表單提交觸發器將被調用提交到電子表格的所有表單。曾幾何時,只有一種形式可以與電子表格相關聯,但現在,如果可能有多種形式關聯,則需要考慮到這種可能性。您無法指定觸發功能適用於哪種形式,但您可以檢查事件的來源並作出適當的響應。

執行此操作的一種有效方法是使用導演函數,該函數將接收所有表單提交事件,並根據接收到響應的表單將其引導至唯一觸發器函數。

在這裏,我們將「Form Responses 1」與SendConfirmationMail()關聯,並假設「Form Responses 2」具有自己的表單提交處理程序handleForm2()。 (如果該窗體不處理,那麼具體的情況下,可以刪除,並提交將在default情況下結束了。)

/** 
* This director function should be used as the "top level" form submission trigger 
* function for spreadsheets accepting responses from multiple forms. Events are 
* directed to the appropriate trigger sub-functions according to the name of the 
* sheet which received the current response. 
* 
* From: https://stackoverflow.com/a/37839189/1677912 
*/ 
function formSubmitted(e) { 
    var sheetName = e.range.getSheet().getName(); 
    switch (sheetName) { 
    case "Form Responses 1": 
     SendConfirmationMail(e); 
     break; 
    case "Form Responses 2": 
     handleForm2(e); 
     break; 
    default: 
     // do nothing 
     break; 
    } 
} 

如果使用表單表單提交觸發相反,你可以完全避免這種情況,因爲目標電子表格不是一個直接的考慮因素。

我想劇本認爲Sheet2中是有效的(這如果我有電子表格開放可能是這種情況)

不太。觸發器函數在任何電子表格UI的上下文之外調用,因此任何用戶在電子表格中執行的操作都不會對其產生影響。相反,「活動」表單與正在處理的提交事件有關。無論如何,引用事件對象本身是一個更好的主意,而不是依賴「正常」操作。測試和調試確實變得更加棘手,但並非如此。有關測試觸發器功能的更多信息,請參閱How can I test a trigger function in GAS?