2017-01-12 2 views
1

Итак, я начну с заявления, что только начал изучать Javascript 4 дня назад. Теперь, когда это не в порядке, мое намерение с этим скриптом.Google Script для копирования и архивирования ответов форм в новом листе на недельной основе

Я хотел бы автоматизировать процесс переноса ответов Google Form, которые собираются в электронной таблице, на новый лист в той же книге, что и архив.

Я бы хотел, чтобы это происходило еженедельно, и для каждого архивного листа, который создан, чтобы иметь только ответы за 1 неделю. Это должно быть между 12:01 AM-1:00AM по воскресеньям, это действительно не имеет значения в тот час, когда это произойдет.

Я также хотел бы удалить все эти ответы из основного листа коллекции (Current_Responses), но если мне придется вручную удалить их позже, это нормально (и, вероятно, хорошо, потому что тогда я могу проверить, что скрипт работал правильно).

Я чувствую, что у меня есть довольно солидное начало для этого, но поскольку я новичок во всем этом, я был бы очень признателен, если бы более опытный сценарист мог посмотреть мой код и сказать мне, будет ли это работать, как я намеревается это, а если нет, то где ошибки и как их исправить. Я счастлив ошибаться, а потом учись у них, поэтому любой совет будет глубоко почитаем.

Я исследовал несколько тем и сценариев на трех веб-сайтах, чтобы помочь собрать это вместе. Заранее благодарим за помощь и совет!

// function to copy from Current_Responses to new sheet 'Archived_Responses 
//(UTC Date)' placed after Current_Responses 
function CreateCopySheetWeekly() { 

    //source info 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var templateSheet = ss.getSheetByName('Current_Responses'); 
    var range = ss.getRange ('A:I'); //replace column length as needed 
    var data = range.getValues(); 

    //creates target sheet to copy responses to 
    var ts = 'Archived_Responses '+formatDate(); 
    ss.insertSheet(sheetName, ss.getSheets().length, {template: templateSheet}); 
    ts.getRange(ts.getLastRow()+1, 1, data.length, data[0].length).setValues(data); 
} 
//end of primary function 

//function to determine and format UTC Date for CreateCopySheetWeekly function 
function formatDate() { 
    var month, day, d = new Date(); 
    month = ('0'+(d.getUTCMonth()+1)).slice(-2); 
    day = ('0'+(d.getUTCDate()).slice(-2); 
    return d.getUTCFullYear()+'-'+month+'-'+day; 
} 
//end of date function 

//check every hour to determine when to perform newSheetLast function. Intended for Sunday 
//between 0001-0100 
window.setInterval (onSunday(){ 
    var today = new Date(); 
    if (today.getDay() == 0 && today.getHours() === 12) { 
    CreateCopySheetWeekly(); 
}, 600000); 

Прогуляйтесь со мной, так как я новичок в этом, но конструктивная критика никого не повредит.

ответ

0

Если вы запускаете это раз в неделю, мы можем сделать упрощающее предположение, что вы хотите, чтобы все ответы поддерживались один раз в неделю, а затем очищали основной лист ответов.

Давайте пошаговым образом перейдем к функциям и оптимизируем их.

Прежде всего, вы уже получаете все строки, если хотите, чтобы все данные можно было только getDataRange(), и вам не нужно беспокоиться о расширении. Также нам не нужны фактические данные.

function CreateCopySheetWeekly() { 

    //source info 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var templateSheet = ss.getSheetByName('Current_Responses'); // Current Responses 
    var range = ss.getDataRange(); 

formatDate() просто создает ISO8601 представление текущей даты, если я правильно понимаю, так что вы можете удалить функцию и вместо того, чтобы использовать

var ts = 'Archived_Responses '+ new Date().toISOString().slice(0,10); 

Вставка листа с помощью шаблона уже копирует все данные, поэтому вам требуется только

ss.insertSheet(ts, ss.getSheets().length, {template: templateSheet}); 

Затем мы хотим очистить наш основной лист ответов.
Если мы просто очистим диапазон, форма будет продолжать добавляться после того, что будет последней строкой, если мы никогда не очищались, потому что помним, сколько ответов получено, поэтому нам нужно удалить все строки, кроме заголовков.

templateSheet.deleteRows(2, range.getNumRows() - 1); 

сделать окончательный сценарий

function CreateCopySheetWeekly() { 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var templateSheet = ss.getSheetByName('Current_Responses'); 
    var range = ss.getDataRange(); 
    var ts = 'Archived_Responses '+ new Date().toISOString().slice(0,10); 

    ss.insertSheet(ts, ss.getSheets().length, {template: templateSheet}); 
    templateSheet.deleteRows(2, range.getNumRows() - 1); 
} 

Наконец вы можете запланировать его, перейдя в Ресурсы> Триггеры текущего проекта и настроить время триггере.

Смежные вопросы