2017-01-12 1 views
1

Je commencerai donc par dire que j'ai commencé à apprendre Javascript il y a 4 jours. Maintenant que c'est à l'écart, mon intention avec ce script. Je souhaite automatiser le processus de déplacement des réponses aux formulaires Google, qui sont collectées dans une feuille de calcul, vers une nouvelle feuille dans le même classeur en tant qu'archive. Je souhaite que cela se produise chaque semaine, et que chaque feuille d'archivage créée ne comporte que des réponses d'une semaine. Cela devrait être entre 12h01 et 1h00 le dimanche, cela n'a pas vraiment d'importance à cette heure-là. Je voudrais également supprimer toutes ces réponses de la feuille de collection primaire (Current_Responses), mais si je dois les supprimer manuellement, c'est bien (et probablement bon, parce que je peux vérifier que le script a bien fonctionné). Je pense que j'ai un bon début de départ, mais comme je suis nouveau dans tout ça, j'apprécierais vraiment qu'un scripteur plus expérimenté puisse regarder par-dessus mon code et me dire si ça marchera comme ça. l'intention de, et si non, où les erreurs sont et comment les corriger. Je suis heureux de faire des erreurs, et ensuite apprendre d'eux afin que tout conseil sera profondément honoré.Google Script pour copier et archiver les réponses de formulaire dans la nouvelle feuille sur une base hebdomadaire

J'ai effectué des recherches sur plusieurs sujets et scripts sur trois sites Web afin d'aider à mettre cela ensemble. Merci d'avance pour toute aide et conseil!

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

Allez-y doucement, car je suis nouveau à ce sujet, mais la critique constructive n'a jamais fait de mal à personne.

Répondre

0

Si vous l'exécutez une fois par semaine, nous pouvons faire l'hypothèse simplifiée que toutes les réponses doivent être sauvegardées une fois par semaine, puis effacer la feuille de réponses principale.

Passons en revue les fonctions pas à pas et optimisons-les.

Tout d'abord vous obtenez déjà toutes les lignes, si vous voulez toutes les données, vous pouvez simplement getDataRange() et ne pas avoir à vous soucier de l'extension. Aussi nous n'aurons pas besoin des données réelles.

function CreateCopySheetWeekly() { 

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

formatDate() est tout simplement créer une représentation ISO8601 de la date actuelle si je comprends bien que vous pouvez supprimer la fonction et utiliser à la place

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

feuille intercalaire avec un modèle déjà copie toutes les données afin que vous seulement besoin

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

Ensuite, nous voulons nettoyer notre feuille de réponse principale.
Si nous effaçons simplement la plage, le formulaire continuera à être ajouté après ce qui serait la dernière ligne si nous n'avions jamais effacé car il se souvient du nombre de réponses qu'il a reçues. Nous devons donc supprimer toutes les lignes sauf les en-têtes.

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

Faire le script final

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

Enfin, vous pouvez programmer en allant aux ressources> du projet actuel Déclencheurs et mettre en place un temps de déclenchement en fonction.