Automatisation d'un tableau avec plusieurs feuilles

Il ne faut pas lancer la macro à partir de l'éditeur (sauf une fois en ignorant l'erreur pour autoriser)

Elle se déclenche automatiquement à chaque changement de cellule : c'est une fonction spéciale onEdit

https://developers.google.com/apps-script/guides/triggers/events

OK, merci !

Alors, j'ai coché la case en Col A, mais rien ne se passe.

La Col M, une fois cochée, m'affiche bien une fenêtre en me disant "Ligne archivée !".

Aïe mais tu confirmes en effet ! au bout d'une heure je ne trouvais pas la cause et j'avais mis cela sur une limitation de google pour moi ! parce que j'avais copié un script déjà existant qui fonctionnait !

C'est incompréhensible ...

Je reprendrais ce point mais pas avant ce soir ou demain !

Aucun problème, merci

Voici la raison

https://developers.google.com/apps-script/guides/triggers

Restrictions

Because simple triggers fire automatically, without asking the user for authorization, they are subject to several restrictions:

They cannot access services that require authorization. For example, a simple trigger cannot send an email because the Gmail service requires authorization, but a simple trigger can translate a phrase with the Language service, which is anonymous.

je vais donc procéder autrement ...

Une fois la colonne A cochée, il faudra aller au menu et faire

capture d ecran 489

Charge le script, puis ferme le fichier et ouvre le à nouveau pour faire fonctionner onInstall et onOpen

Limite aussi le nombre de lignes dans les onglets

Mets dans archives les mêmes en-têtes sans les formules arrayformula car je copie en bloc toute la ligne.

function onInstall(e) {
  onOpen(e); 
}
function onOpen(e) {
  var ui = SpreadsheetApp.getUi();
  ui.createMenu('***E-mailing***')
  .addItem('Lancer les courriels !', 'envoi')
  .addToUi();
}
function onEdit(event){
  var feuille = event.source.getActiveSheet();
  var cel = event.source.getActiveRange();
  // archivage
  if ((columnToLetter(cel.getColumn()) == 'M') && (feuille.getName() == 'CORDAGE')){
    if (cel.getValue()){
      var archive = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("ARCHIVES");
      archive.insertRowBefore(2);
      var plage = feuille.getRange('A' + cel.getRow() + ':M' + cel.getRow());
      plage.copyTo(archive.getRange('A' + 2), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false); 
      Browser.msgBox('Ligne archivée !');
      feuille.deleteRow(cel.getRow());
    }
  }
}
function envoi(){
  var doc = SpreadsheetApp.getActiveSpreadsheet();
  var feuille = doc.getSheetByName('CORDAGE');
  for (var ligne=2; ligne<=feuille.getLastRow();ligne++){
    if (feuille.getRange('A'+ligne).getValue()){
      var destinataire = feuille.getRange('C'+ligne).getValue();
      var objet = 'Votre raquette ' + feuille.getRange('E'+ligne).getValue();
      var corps = 'Bonjour ' + feuille.getRange('B'+ligne).getValue() + '<br><br>Vous pouvez venir cherchercher votre raquette en objet. Nous avons terminé les travaux de cordage.<br><br>Cordialement';
      GmailApp.sendEmail(destinataire, objet, corps, {htmlBody: corps});
      Browser.msgBox('Message envoyé !');
      feuille.getRange('A'+ligne).setValue(false)
      var d = Utilities.formatDate(new Date(), "GMT+1", "dd/MM/yyyy à hh:mm")
      feuille.getRange('n'+ligne).setValue(d)
    }
  }
}
function columnToLetter(column) {
  var temp, letter = '';
  while (column > 0) {
    temp = (column - 1) % 26;
    letter = String.fromCharCode(temp + 65) + letter;
    column = (column - temp - 1) / 26;
  }
  return letter;
}

La totale

function onInstall(e) {
  onOpen(e); 
}
function onOpen(e) {
  var ui = SpreadsheetApp.getUi();
  ui.createMenu('***E-mailing***')
  .addItem('Avertir de la fin des travaux !', 'envoi')
  .addItem('Relancer sur disponibilité J+3 !', 'relance')
  .addToUi();
}
function onEdit(event){
  var feuille = event.source.getActiveSheet();
  var cel = event.source.getActiveRange();
  // archivage
  if ((columnToLetter(cel.getColumn()) == 'M') && (feuille.getName() == 'CORDAGE')){
    if (cel.getValue()){
      var archive = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("ARCHIVES");
      archive.insertRowBefore(2);
      var plage = feuille.getRange('A' + cel.getRow() + ':N' + cel.getRow());
      plage.copyTo(archive.getRange('A' + 2), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false); 
      Browser.msgBox('Ligne archivée !');
      feuille.deleteRow(cel.getRow());
    }
  }
}
function envoi(){
  var doc = SpreadsheetApp.getActiveSpreadsheet();
  var feuille = doc.getSheetByName('CORDAGE');
  for (var ligne=2; ligne<=feuille.getLastRow();ligne++){
    if (feuille.getRange('A'+ligne).getValue()){
      var destinataire = feuille.getRange('C'+ligne).getValue();
      var objet = 'Votre raquette ' + feuille.getRange('E'+ligne).getValue();
      var corps = 'Bonjour ' + feuille.getRange('B'+ligne).getValue() + '<br><br>Vous pouvez venir cherchercher votre raquette en objet. Nous avons terminé les travaux de cordage.<br><br>Cordialement';
      GmailApp.sendEmail(destinataire, objet, corps, {htmlBody: corps});
      Browser.msgBox('Message envoyé !');
      feuille.getRange('A'+ligne).setValue(false)
      var d = Utilities.formatDate(new Date(), "GMT+1", "dd/MM/yyyy à hh:mm a")
      feuille.getRange('n'+ligne).setValue('email ! '+d)
    }
  }
}
function relance(){
  var doc = SpreadsheetApp.getActiveSpreadsheet();
  var feuille = doc.getSheetByName('CORDAGE');
  var maintenant = new Date().getTime();
  var delai = new Date(maintenant - 3 * 86400000); 
  for (var ligne=2; ligne<=feuille.getLastRow();ligne++){
    if (feuille.getRange('J'+ligne).getValue() <= delai && feuille.getRange('C'+ligne).getValue()!=''){
      var destinataire = feuille.getRange('C'+ligne).getValue();
      var objet = 'Votre raquette ' + feuille.getRange('E'+ligne).getValue() + ' (rappel)';
      var corps = 'Bonjour ' + feuille.getRange('B'+ligne).getValue() + '<br><br>Rappel<br>Vous pouvez venir cherchercher votre raquette en objet. Nous avons terminé les travaux de cordage.<br><br>Cordialement';
      GmailApp.sendEmail(destinataire, objet, corps, {htmlBody: corps});
      feuille.getRange('A'+ligne).setValue(false)
      var d = Utilities.formatDate(new Date(), "GMT+1", "dd/MM/yyyy à hh:mm a")
      feuille.getRange('n'+ligne).setValue('relance : '+d)
    }
  }
}
function columnToLetter(column) {
  var temp, letter = '';
  while (column > 0) {
    temp = (column - 1) % 26;
    letter = String.fromCharCode(temp + 65) + letter;
    column = (column - temp - 1) / 26;
  }
  return letter;
}

tu peux éventuellement ajouter un déclencheur journalier sur relance

Merci beaucoup Steelson !

Y a-t-il un moyen une fois que l'on coche la Col A et qu'on envoie le mail, de laisser cette case en Col A cochée pour que la ligne soit préservée en vert. Tu vois ce que je veux dire ?

De manière à pouvoir ensuite l'archiver en cochant la Col M. L'idée serait qu'une fois que le client vient chercher sa raquette, la Col M soit cochée.

Merci d'avance !

C'est possible et un peu plus compliqué que cela.

Pourquoi ? parce que je n'ai pas pu utiliser onEdit pour envoyer un mail et donc je balaye toutes les cases cochées en colonne A pour le faire.

Donc j'ai du mettre en effet

      feuille.getRange('A'+ligne).setValue(false)

Note que j'ai ajouté la date d'envoi ou de relance en N et que la sauvegarde tient compte aussi de N, est-ce que cela ne peut-il pas suffire ?

Oui, j'ai vu cela ! Je devrais pouvoir m'en sortir en procédant autrement ! Dernière petite chose, le format de la date et l'heure ne peuvent être modifié ? J'ai vu que tu étais parti sur très simple à savoir dd/MM/yyyy, y a-t-il un moyen d'avoir un rendu avec cela par exemple : ddd" "d" "mmm" "yyyy (j'ai essayé de le remplacer par ce que tu avais fait mais cela ne fonctionne pas...). De même pour l'heure, obligé de passer avec le format anglophone ? AM/PM ?

je pense que tu peux mettre

var d = Utilities.formatDate(new Date(), "GMT+1", "dd/MM/yyyy HH:mm")

pour avoir l'heure 24

pour le jour de la semaine, je ne sais pas ! ddd ne fonctionne pas comme je le voudrais en script, d'autant que u donne un jour de semaine qui commence un dimanche, ah ces ricains !

en anglais pour la jour

var d = Utilities.formatDate(new Date(), "GMT+1", "EEE dd/MM/yyyy HH:mm")

Ah top, merci beaucoup ! Et bien, je pense que je suis au TOP maintenant

en anglais pour la jour

var d = Utilities.formatDate(new Date(), "GMT+1", "EEE dd/MM/yyyy HH:mm")

Cela n'existe pas en français ?

ce que l'on peut faire c'est mettre 3 fois la date dans les colonnes N, O, P et en Q l'action (info ou relance), et mettre alors les formats via la feuille elle-même

      
var d = Utilities.formatDate(new Date(), "GMT+1", "dd/MM/yyyy HH:mm")
feuille.getRange('N'+ligne).setValue(d)
feuille.getRange('O'+ligne).setValue(d)
feuille.getRange('P'+ligne).setValue(d)
feuille.getRange('Q'+ligne).setValue('info')

tu maîtrises alors le format via la feuille

OK top, merci Steelson !

Rechercher des sujets similaires à "automatisation tableau feuilles"