0
votes

Comment dupliquer une feuille de calcul Google, la renommer et coller le contenu en tant que valeurs absolues à l'aide des scripts d'application Google

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:

  1. Les valeurs ne sont pas collées en tant que valeurs absoules.

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


2 commentaires

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.


3 Réponses :


1
votes

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.


0 commentaires

1
votes

Vos objectifs:
  1. Enregistrez les valeurs du mois dernier dans une feuille avec le nom du mois dernier.
  2. Faites-le le 1er du mois
  3. Continuer à utiliser le tableau de bord existant pour le mois en cours
  4. Recommencez le mois prochain

Un exemple pour les réaliser:

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

Comment déclencher onMonthStart tous les 1er du mois?:

Installer un déclencheur temporel a > le premier jour du mois. écran de démarrage des déclencheurs pilotés par le temps


  1. Utilisation de la méthode Sheet.copyTo prend un objet Spreadsheet comme param. Vous passez une gamme avec des options. Pas la même chose!
  2. Essayez d'être cohérent dans votre style de dénomination des variables et utilisez des noms qui ont un sens pour la lisibilité.

0 commentaires

0
votes

@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())

  }
}


0 commentaires