-1

私たちの搭乗スクールは、到着と出発時に生徒がGoogleフォームを使用してサインインとサインアウトします。 私は、毎晩、生徒がその夕方に搭乗しているレコードを作成する関数 - dailyRecord() - を持っています。 2つのカスタムメニューがあります.1つはフォーム応答を半分の期間、exeats(週末)でパージし、もう1つは搭乗日の記録を空けて各期末に使用します。フォーム送信の最初のインスタンスでのみトリガースクリプト

フォームレスポンスをパージすると、dailyRecord()関数も無効になります(とにかく、学校に生徒がいない場合はレコードを作成したくありません)。 次回フォーム応答が提出されたとき(つまり、週末/半期後に再度サインインを開始するとき)、dailyRecord()関数を再度有効にするスクリプトを作成しようとしました。問題はフォームが提出されるたびに実行されていることです。つまり、1つではなく複数のレコードが毎晩作成されています。私は、ブレーク後の最初のフォーム提出時に機能を再有効化する必要があります。 任意のアイデア誰

//ONOPEN - Menu allowing user to choose to delete previous form submissions// 
function onOpen() { 
    var ui = SpreadsheetApp.getUi(); 
    // Or DocumentApp or FormApp. 
    ui.createMenu('Clear Data') 
    .addItem('Exeat & HT - Purge Form reponses', 'responsesAlert') 
    .addItem('End of Term - Empty History Sheets', 'historyAlert') 
     .addToUi(); 
} 

//DELETETRIGGER - Stand alone function to delete 'dailyRecord' Trigger (stop recording nightly register)// 
function deleteTrigger() { 
    var triggers = ScriptApp.getProjectTriggers(); 
for (var i = 0; i < triggers.length; i++) { 
if (triggers[i].getHandlerFunction() === 'dailyRecord') { 
    ScriptApp.deleteTrigger(triggers[i]); 
} 
}} 

//RESPONSESALERT - Alert box deleting previous form submissions 'YES', doing nothing if not// 
function responsesAlert() { 
    var ui = SpreadsheetApp.getUi(); 
    var result = ui.alert(
    'This will remove previous form responses - The nightly record (History Sheet) will remain intact', 
    'Are you sure you want to continue?', 
     ui.ButtonSet.YES_NO); 
    // Process the user's response. 
    if (result == ui.Button.YES) { 
    //Empty 'Form Responses 1' Sheet of data 
    var ui = SpreadsheetApp.getUi(); 
    var source = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Form Responses 1"); 
    var lastRow = source.getLastRow() 
    source.deleteRows(2, lastRow)} 
    //Empty the Google Form of all Responses 
    var form, urlForm = SpreadsheetApp.getActiveSpreadsheet().getFormUrl(); 
    if (urlForm) {} 
    form = FormApp.openByUrl(urlForm); 
    if (form) form.deleteAllResponses(); 
    //Delete 'dailyRecord' Trigger (stop recording nightly register) 
    var triggers = ScriptApp.getProjectTriggers(); 
for (var i = 0; i < triggers.length; i++) { 
if (triggers[i].getHandlerFunction() === 'dailyRecord') { 
    ScriptApp.deleteTrigger(triggers[i]); 
} 
}} 

//HISTORYALERT - Alert box deleting previous form submissions 'YES', doing nothing if not// 
function historyAlert() { 
    var ui = SpreadsheetApp.getUi(); 
    var result = ui.alert(
    'This will clear all daily records from the History Sheet', 
    'Are you sure you want to continue?', 
     ui.ButtonSet.YES_NO); 
    // Process the user's response. 
    if (result == ui.Button.YES) { 
    //Empty 'History' Sheet of data 
    var ui = SpreadsheetApp.getUi(); 
    var source = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("History"); 
    var lastColumn = source.getLastColumn() 
    source.deleteColumns(4, lastColumn-3)} 
} 


//DAILYTRIGGER - Trigger running record-keeping function c.10pm each night// 
function dailyTrigger() { 
    ScriptApp.newTrigger('dailyRecord') 
    .timeBased() 
    .atHour(22) 
    .everyDays(1) 
    .create(); 
} 

//DAILYRECORD - Record-keeping function, copy/value-pasting record into next clear column// 
function dailyRecord() { 
    var ss = SpreadsheetApp.getActive() 
     .getSheetByName('History'), 
     lastColumn = ss.getLastColumn(), 
     colC = ss.getRange("C:C") 
      .getValues(); 
    ss.getRange(1, lastColumn + 1, colC.length, 1) 
     .setValues(colC); 
} 
+1

HTML/JavaScript/CSSスニペットは、このサイトで直接実行できるコードでのみ使用する必要があるため、削除しました。一方、これは私に[XY問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)のように見えます。フォームからすべての応答を削除しないようにすると、dailyRecord関数は必要ありません。 –

+0

Rubénさん、これはかなり新しく、XY問題でかなり曇っています。私が達成しようとしていることと、達成しようとしていることを単に共有しようとしました。あなたは正解ですが、フォームの返信を削除しないと、すべての生徒がサインイン/サインアウトしても、スプレッドシートが扱いにくくなることが懸念される日までに役立ちます。レスポンスありがとう! – user3194744

答えて

0

次のコードは、フォームが送信されたときに呼び出されfirstSubmission機能についてonFormSubmitトリガをセットアップ、機能は基本的に1時間トリガまたは最初の提出トリガーとなって、独自のトリガーを削除します。

このようなあなたのreponseAlert機能 の最後にこの関数を呼び出し:この上のすべてのコメントと助けを

function responsesAlert() { 
    var ui = SpreadsheetApp.getUi(); 
    .... 
    var form, urlForm = SpreadsheetApp.getActiveSpreadsheet().getFormUrl(); 
    if (urlForm) {} 
    form = FormApp.openByUrl(urlForm); 
    .... 
    var triggers = ScriptApp.getProjectTriggers(); 
for (var i = 0; i < triggers.length; i++) { 
if (triggers[i].getHandlerFunction() === 'dailyRecord') { 
    ScriptApp.deleteTrigger(triggers[i]); 
} 
} 
firstSubmissionTrigger(form) 
} 

function firstSubmissionTrigger(form){ 
    ScriptApp.newTrigger('firstSubmission').forForm(form).onFormSubmit().create() 
// Sets trigger to call firstSubmission to be called when the submission is made 
} 

function firstSubmission(){ 
dailyTrigger() 
// Starts the dailyTrigger 
// Below code deletes the triggers that calls firstSubmission function 
// Essentially making it a one time trigger or First submission trigger  
var triggers = ScriptApp.getProjectTriggers(); 
for (var i = 0; i < triggers.length; i++) { 
if (triggers[i].getHandlerFunction() === 'firstSubmission') { 
    ScriptApp.deleteTrigger(triggers[i]); 
} 

} 
} 
+0

本当に感謝しています - 私はそれを実装してテストします。これに少し慣れていないので、4つの点(....)は元の要素をそのまま残していますか? – user3194744

+0

はい私は(...)置き換えられていない元の要素を参照します。私がコードをより簡単に変更できる場所を私はどこでもできます。 –

+0

ありがとうございます。変更を加えてから最初の週末を始めました。週末後にお知らせします。 – user3194744

0

感謝。私は結局、できるだけシンプルに行きました...スクリプトのセットアップでは、スクリプトエディタで毎日トリガを起動し、複数のフォームエントリがある場合はスクリプトを実行するようプログラムされていました。毎週末、フォームは半期の間に&から空になります。

//RECORDTRIGGER 
function recordTrigger() { 
    var responses = FormApp.openByUrl('formurl.com').getResponses().length 
    if (responses > 1) { 
     var ss = SpreadsheetApp.getActive().getSheetByName('History'), 
     lastColumn = ss.getLastColumn(), 
     colC = ss.getRange("C:C").getValues(); 
    ss.getRange(1, lastColumn + 1, colC.length, 1).setValues(colC); 
}} 

テスト時に動作するようです。サポートに本当に感謝しています。

関連する問題