-1

Наша школа-интернат использует форму Google для учеников для входа и выхода по прибытии и отъезде. У меня есть функция - dailyRecord() - это делает запись каждую ночь, когда ученики посещают этот вечер. Существует два пользовательских меню, один из которых позволяет очистить ответы формы на половину срока и exeats (выходные дни), а другой, который также опорожняет запись интернатов для использования в конце каждого срока.Триггерный скрипт только на первом экземпляре формы Представление

В настоящее время очистка ответов на формы также отключает функцию dailyRecord() (мы не хотим делать запись, если в школе нет учеников). Я попытался создать сценарий, который снова активирует функцию dailyRecord(), когда следующий раз отправляется ответ формы (т. Е. Ученики начинают подписываться снова после выходных/половины). Проблема в том, что он запускает КАЖДОЕ время отправки формы, что означает, что каждую запись записывают несколько записей вместо одной. Мне нужна только функция, которая будет включена снова в первой форме после разрыва. Любых идей кто-либо

//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

Спасибо, Рубен, довольно новичок в этом и довольно туманный по проблеме XY, просто пытаясь поделиться тем, чего я пытаюсь достичь, и тем, как я пытался его достичь. Вы правы, что не удаление ответов на формы поможет, однако, всем ученикам, которые подписываются и выходят в течение всего дня, что меня беспокоит, что таблица начнет становиться слишком громоздкой. Спасибо за ответ! – user3194744

ответ

0

Код ниже расстановки в onFormSubmit триггера для функции firstSubmission, которая вызывается, когда форма была отправлена, функция удаляет свой собственный триггер по существу становится один раз вызвать или первый триггер представления.

Вызывайте эту функцию в конце вашей функции 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

Да, я положил (...), чтобы ссылаться на оригинальные элементы, остающиеся неизменными. Так что я мог бы hilight, где я более легко модифицировал код –

+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); 
}} 

Кажется, что нужно работать при проверке - очень благодарен за поддержку.