Bonjour Stackoverflowers,
Je souhaite dupliquer une feuille appelée "Dashboard" le 1er de chaque mois avec le nom de la feuille du mois et de l'année précédents (MMMM AAAA) et le contenu sous forme de valeurs statiques. >
Pour ce faire, j'ai essayé d'adapter les deux scripts suivants mais cela ne fait pas ce que je veux.
les problèmes sont:
Les valeurs ne sont pas collées en tant que valeurs absoules.
Le nom de la feuille est le nom du mois en cours et non le le mois précédent.
Je crois que pour le problème num. 1, la déclaration suivante a une erreur dans la syntaxe, mais je ne peux pas la trouver:
function moveValuesDown() { var ss = SpreadsheetApp.getActiveSpreadsheet (); var source = ss.getRange ("Dashboard!A4:I"); source.copyTo (ss.getRange ("MySheet1!A5"), {contentsOnly: true}); }
Pour le problème num. 2 Je ne sais pas vraiment par où commencer.
=> Des idées? Toute aide sera vivement appréciée
function duplicatesheet() { var as = SpreadsheetApp.getActiveSpreadsheet(); // active spreadsheet var s = as.getSheetByName('Dashboard'); // first sheet object // var s = as.getActiveSheet(); // first sheet object var dateCell = "H5"; // cell containing first date var N = 1; // number of copies to make var startDate = new Date(s.getRange(dateCell).getValue()); // get the date stored in dateCell var day = startDate.getDate(); // extract the day var month = startDate.getMonth(); // extract the month var year = startDate.getFullYear(); // extract the year // loop over N times for (var i = 0; i < N; i++) { var asn = s.copyTo(as); // make a duplicate of the first sheet var thisSheetDate = new Date(year, month, day+(i+1)); // store the new date as a variable temporarily asn.getRange(dateCell).setValue(thisSheetDate); // writes the date in cell "B3" asn.setName(Utilities.formatDate(thisSheetDate, undefined, "MMMMM yyyy")); // sets the name of the new sheet asn.copyTo(getRange("MMMMM yyyy"),{contentsOnly: true}); } }
asn.copyTo(getRange("MMMMM yyyy"),{contentsOnly: true});
3 Réponses :
Créer une copie du tableau de bord chaque mois le premier du mois
function createNewSheetFromTemplate(templatename="Dashboard") { const dt=new Date(); //This runs the insert only on the first day of the month if(dt.getDate()==1) { const ss=SpreadsheetApp.getActive(); const template=ss.getSheetByName(templatename);//default parameter const name=Utilities.formatDate(new Date(dt.getFullYear(),dt.getMonth(),0), Session.getScriptTimeZone(), "MMMM/yyyy"); ss.insertSheet(name, {template:template}); } } function createTimeBasedTrigger() { if(!isATrigger('createNewSheetFromTemplate')) { ScriptApp.newTrigger('createNewSheetFromTemplate').timeBased().everyDays(n).atHour(6).create();//The trigger happens daily at 6 am } } //You just need to run this once. It's setup to only allow one trigger to be created even if you run it again. function isATrigger(funcName){ var r=false; if(funcName){ var allTriggers=ScriptApp.getProjectTriggers(); for(let i=0;i<allTriggers.length;i++){ if(funcName==allTriggers[i].getHandlerFunction()){ r=true; break; } } } return r; }
Remarque: ce script nécessite la version 8.
function onMonthStart() { const monthNames = ['Jan','Feb','Mar','Apr','Jun','Jul','Aug','Sep','Oct','Nov','Dec']; // Whats last month's name? var thisMonth = Utilities.formatDate(new Date(),"GMT","MMM"); var pastMonth = monthNames[monthNames.indexOf(thisMonth) - 1]; if (monthNames.indexOf(thisMonth) == 0){ pastMonth = 'Dec'; } // Create new destination sheet for past month values var ss = SpreadsheetApp.getActiveSpreadsheet(); var pastMonthSheet = ss.insertSheet(pastMonth); // Copy data from dashboard var pastMonthDataRange = ss.getSheetByName('Dashboard').getDataRange(); // Paste in past month's sheet pastMonthSheet.activate().getRange(pastMonthDataRange.getA1Notation()).setValues(pastMonthDataRange.getValues()) }
onMonthStart
tous les 1er du mois?: Installer un déclencheur temporel a > le premier jour du mois.
Sheet.copyTo
prend un objet Spreadsheet
comme param. Vous passez une gamme avec des options. Pas la même chose! @Cooper et @Aerials Merci beaucoup pour votre contribution! Les deux sont des solutions très élégantes.
Finalement, j'ai fini par combiner les deux scrips, pour pouvoir dupliquer l'onglet en gardant le format et les valeurs comme valeurs absolues.
Voici à quoi cela ressemble:
/// Duplicate Dashboard values in previous month tab function createNewSheetFromTemplate(templatename="Dashboard") { const dt=new Date(); //This runs the insert only on the first day of the month if(dt.getDate()==1) { const ss=SpreadsheetApp.getActive(); const template=ss.getSheetByName(templatename);//default parameter const name="Pacing " + Utilities.formatDate(new Date(dt.getFullYear(),dt.getMonth(),0), Session.getScriptTimeZone(), "MMMM"); ss.insertSheet(name, {template:template}); // Select the new created sheet already renamed var pastMonthSheet = ss.getSheetByName(name); // Copy values from dashboard var pastMonthDataRange = ss.getSheetByName(name).getDataRange(); // Paste in the values form the dashboard as absolute values in the past month sheet pastMonthSheet.activate().getRange(pastMonthDataRange.getA1Notation()).setValues(pastMonthDataRange.getValues()) } }
Spreadsheet.insertSheet (nom de la feuille, {template}) et Spreadsheet.getUi (). Prompt (). GetResponseText () pour obtenir le nom de la feuille.
Bonjour Cooper, le doublon devrait se produire sans interaction humaine dans la nuit. Si une personne doit le faire, ce ne sera pas d'une grande aide. Quoi qu'il en soit, merci beaucoup pour votre réponse.