2016-06-15 3 views
1

を実行します。最初のシート/フォームは、フォーム提出データ(オリジナルはAmit Agarwalによって作成された、an historic link)を含む電子メールを送信することになっています。 2番目のフォーム/シートは、フォームからデータを収集するだけで何も特別なことはしません。問題のスクリプトはフォーム提出のトリガーに設定されています。確認フォーム送信トリガーは、私が彼らに縛らフォームの送信を持っているどちらも特定のスプレッドシートの2枚を持っている唯一の1枚

私が午前問題は、スクリプトが時々フォーム/シート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]; 

私はかかわらず、これを実現することになっていたこの2行:

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

私は(スクリプトはシート2がアクティブであると考えたと私は、スプレッドシートを開いている場合はケースかもしれません)。確かにこれを回避/達成する方法がありますが、私は何が欠けていますか?

+0

を参照してください。Amitは元々そのコードを含むブログエントリを更新しました。代わりにGoogleフォームアドオンのインストールと使用について説明します。ウェイバックマシンのそのポストの最も古いバージョンにはコードがあります:[here](https://web.archive.org/web/20140126020722/http://www.labnol.org/internet/auto-confirmation-電子メール/ 28386)。 – Mogsdad

答えて

2

スプレッドシートに提出されたすべてのフォームは、のシート形式の送信トリガーが呼び出されます。以前は、1つのフォームだけがスプレッドシートに関連付けられていましたが、複数のフォームの関連付けが可能なので、その可能性を考慮する必要があります。トリガー機能がどの形式であるかを指定することはできませんが、イベントのソースを確認して適切に応答することができます。

ディレクター機能を使用すると、すべてのフォーム送信イベントが受信され、応答を受信したシートに応じて固有のトリガー機能が使用されます。

ここでは、「フォーム応答1」をSendConfirmationMail()に関連付け、「フォーム応答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?

関連する問題