2017-02-01 15 views
0

私は現在、同じGoogleシートに5つの異なるフォームを接続しています。私の最終目標は、誰かがフォームのいずれかに回答を提出すると、その回答を含むメールを受け取ることです。異なるフォーム送信後に異なるGoogle Script関数をトリガーする

私は、Googleフォームに応答確認機能があることは知っていますが、これはオプションではありません。この機能を有効にしている場合、領収書を希望しない場合でも、電子メールを記入せずにフォームを送信することはできません。

現時点で私が持っているコードは次のとおりです。

function ActivityFunction() { 
    var spreadsheet = SpreadsheetApp.openById("FORM ID"); 
    SpreadsheetApp.setActiveSheet(spreadsheet.getSheets()[4]); 
    var sheet = spreadsheet.getActiveSheet(); 

    var lastRow = sheet.getLastRow(); 

    //Email Info 

    //Name 
    var range = sheet.getRange(lastRow,2,1,1); 
    var Name = range.getValues(); 

    //Email Address 
    var range = sheet.getRange(lastRow,7,1,1); 
    var Email = range.getValues(); 

    //Date 
    var range = sheet.getRange(lastRow,3,1,1); 
    var Day = range.getValues(); 

    //Time 
    var range = sheet.getRange(lastRow,4,1,1); 
    var ExerciseTime = range.getValues(); 

    //Activity 
    var range = sheet.getRange(lastRow,5,1,1); 
    var Activity = range.getValues(); 

    //Intensity 
    var range = sheet.getRange(lastRow,6,1,1); 
    var Intensity = range.getValues(); 

    var msg = "Hello "+Name+"! 
    Thank you for filling out today's activity form. Here are your responses. 
    Name: "+Name+"\n\Date: "+Day+"\n\Time: "+ExerciseTime+"\n\Activity: "+Activity+"\n\Intensity: "+Intensity+"\n\n\Have a great day!" 

    MailApp.sendEmail(Email, 
        "Activity Form: "+Day, msg); 
} 

私は、誰かが同じGoogleで別のワークシートに別のフォーム(ルートで提出した場合、フォームは、しかし、上のトリガを提出していたときにこのコードが動作しますスプレッドシート)、それは彼らに彼らの新しい投稿を送信しません。

私はどこかにこのようなコードとコメントが見つかりました:

function FormSubmitFunction() { 
    var form = FormApp.openById('FORM ID'); 
ScriptApp.newTrigger('ActivityFunction') 
    .forForm(form) 
    .onFormSubmit() 
    .create(); 
} 

をしかし、私はエラーにそれを実行するたびに取得します。

TL; DRアクティブスプレッドシートを、ユーザーのフォームがルーティングされたワークシートに設定し、それぞれの機能を起動するにはどうすればよいですか。

ありがとうございます!

答えて

0

「フォーム提出中」トリガー機能はan eventに渡され、このイベントには応答シートのフォーム提出の範囲が含まれます。 range.getSheet().getName()を使用して、送信された応答シートの名前、したがって送信がどのフォームから来たのかを知ることができます。

+0

は、あなたが拡大していいです:

以下のコードのセットアップは、指定されたフォーム(.forForm)これだけので、あなたのコードは、他の形態は、提出されたときにトリガーされませんでした、その具体的なフォームが送信されたときにトリガーのための特定のトリガそれで少し?私はあなたの提案をどのように実装することができるのか少し失われています。 – jschwartz9502

0

私の前の答えによれば、私はevent objectsを読むことをお勧めします。それは、彼らはあなたに50ドルを貸すことができるように誰か50ドルを与えるようなものだ

SpreadsheetApp.setActiveSheet(spreadsheet.getSheets()[4]); 
var sheet = spreadsheet.getActiveSheet(); 

:私は嫌いとあなたのコードで指摘したいことの一つは関係なく、あなたがacomplishしたかったものの、次の行がナンセンスであるということです。これらの行の両方が正確

方法のうちそれと
var sheet = spreadsheet.getSheets()[4] 

と同じ、それが使用されているどのような形は重要ではありません、あなたが期待することを意味し、この

//Email Address 
var range = sheet.getRange(lastRow,7,1,1); 
var Email = range.getValues(); 

で行っています電子メールアドレスはに常にとなります。代わりに、イベントオブジェクトを使用すると、function ActivityFunction(event)を持つことで新しい送信の範囲を取得でき、フォーム送信時にこの機能を開始してからevent.rangeにアクセスするだけです。

さらに、私は多くのvar range = sheet.getRange(lastRow,2,1,1)を参照しています。最初は1varを宣言してから新しい値を割り当てることをお勧めします。これにより、変数名などを変更すると問題が見つけやすくなります。.getRange(lastRow,2,1,1).getRange(lastRow,2)と同じですので、不潔なコードも記述しています。自分自身の問題ではありませんが、間違いを簡単にします。

0

これは理解しやすくなるでしょう。 Google機能がイベント(onFormSubmit、onOpen ..)によってトリガーされるたびにイベントオブジェクトを引数として渡します(以下の例では引数 "e")。このイベントオブジェクトには、ここで説明したようにアクセスできる属性があります。https://developers.google.com/apps-script/guides/triggers/events

以下の機能は、フォームが送信されるとトリガーされます(以下のトリガー設定の詳細)。フォームで送信された値にアクセスします

function ActivityFunction(e) { 

    //Name 
    var Name = e.values[2]; 
    //value 2 represent the second field entered in your form. 

    //Email Address 
    var Email = e.values[7]; 
    //similarly, value 7 represent the seventh field entered in your form. 

    //Date 
    var Day = e.values[3]; 

    //Time 
    var ExerciseTime = e.values[4]; 

    //Activity 
    var Activity = e.values[5]; 

    //Intensity 
    var Intensity = e.values[6]; 

    var msg = "Hello "+Name+"! 
    Thank you for filling out today's activity form. Here are your responses. 
    Name: "+Name+"\n\Date: "+Day+"\n\Time: "+ExerciseTime+"\n\Activity: "+Activity+"\n\Intensity: "+Intensity+"\n\n\Have a great day!" 

    MailApp.sendEmail(Email, 
        "Activity Form: "+Day, msg); 
} 

トリガーを設定するには、上記のコードがフォームを受け入れるスプレッドシートのスクリプトエディタに書き込まれていることを確認してください。リソースから現在のプロジェクトトリガ>追加>スプレッドシートからフォーム提出時にアクティビティ機能のトリガを設定する

どのような形式で送信されても​​重要ではないイベントオブジェクト "e"が作成され、あなたは望むので、シートにアクセスして回答を得ることを心配する必要はありません。

function FormSubmitFunction() { 
    var form = FormApp.openById('FORM ID'); 
ScriptApp.newTrigger('ActivityFunction') 
    .forForm(form) //This sets the trigger for a specific form. 
    .onFormSubmit() 
    .create(); 
} 
関連する問題