web-dev-qa-db-fra.com

Existe-t-il un moyen de verrouiller ou de protéger la mise en forme conditionnelle dans Google Sheets?

J'ai plusieurs colonnes qui indiquent l'état actuel d'une tâche de projet. Lorsque je termine une tâche (par exemple), je copie le texte "complet" d'une autre cellule et le colle dans la nouvelle cellule pour éviter de le saisir (les états des tâches changent souvent et il serait très pénible de devoir taper tous les états manuellement).

Comment empêcher la modification ou le déplacement de la mise en forme conditionnelle lorsque je copie/colle/déplace des cellules dans Google Sheets?

Est-il possible de "verrouiller" ou de protéger la mise en forme conditionnelle? Ou peut-être y a-t-il un moyen de dire à la mise en forme conditionnelle d'utiliser des références de cellules absolues au lieu de relatives?

C'est incroyablement ennuyant que je ne semble pas être capable de l'appliquer à une colonne entière, peu importe la façon dont je déplace les données. Je sais que je peux éditer la cellule et copier/couper/coller le texte sans affecter la mise en forme, mais cela n’aide en rien que je doive modifier plusieurs cellules à la fois.


Voici un exemple de feuille de calcul . Coupez les cellules E14: G14 et collez-les en bas d'une ligne pour laisser la place à une autre sous-tâche de "Faire quelque chose d'art", puis essayez de taper "à la suite", "en cours" ou "complet". Il n'y aura pas d'arrière-plan coloré car les références de cellules de mise en forme conditionnelle ont été altérées.

2
Clonkex

Je crains qu'actuellement, il ne soit pas possible d'utiliser couper/coller/glisser-déposer. Envisagez d'envoyer une demande de fonctionnalité directement à Google via Google Feedback: cliquez sur le menu Aide> Signaler un problème.

Une alternative à l’utilisation de couper et coller consiste à utiliser Insérer cellules> Décalage vers le bas

  1. Sélectionnez E14: G14
  2. Clic droit sur la plage sélectionnée
  3. Cliquez sur Insérer des cellules> Déplacer vers le bas

REMARQUE: raccourci clavier pour la disposition hispano-latino-américaine Ctrl++ avec le remplacement Chrome raccourcis activés.

2
Rubén

Bien que la réponse de @ Rubén soit correcte (et restera acceptée), j'ai en réalité proposé un script qui résout complètement mon problème, même s'il est un peu bizarre.

function onEdit(e) {
  var sleepTime = 5000;
  var lastEditedTime = new Date().getTime();
  PropertiesService.getScriptProperties().setProperty('lastEditedTime', lastEditedTime);
  Utilities.sleep(sleepTime);
  var newTime = new Date().getTime();
  if(newTime - PropertiesService.getScriptProperties().getProperty('lastEditedTime') < sleepTime - 50) {
    return;
  }

  var range = e.range; //range just edited
  var sheet = range.getSheet();
  if(sheet.getName() !== 'Tasks') {
    return;
  }

  var rules = sheet.getConditionalFormatRules();
  var newRules = [];
  for(var r = 0; r < rules.length; r++) {
    var booleanCondition = rules[r].getBooleanCondition();
    if(booleanCondition != null) {
      var rule = SpreadsheetApp.newConditionalFormatRule()
        .withCriteria(booleanCondition.getCriteriaType(), booleanCondition.getCriteriaValues())
        .setBackground(booleanCondition.getBackground())
        .setRanges([sheet.getRange("E:E"),sheet.getRange("G:G")])
        .build();
      newRules.Push(rule);
      sheet.setConditionalFormatRules(newRules);
    }
  }
};

Étant donné que onEdit est appelé pour chaque modification effectuée et que la mise en forme conditionnelle prend environ 0,5 à 1 seconde pour se mettre à jour, si vous effectuez plusieurs modifications très rapidement, le script s'exécutera plusieurs fois très étroitement ensemble, puis après le premier on peut essayer de lire les règles de mise en forme conditionnelles pendant la mise à jour et finir par supprimer efficacement certaines ou toutes les règles.

Ce serait facile à résoudre si nous pouvions utiliser setTimeout, mais les scripts Google Apps sont synchrones et ne prennent pas en charge cette fonction. À la place, chaque fois que le script est exécuté, il enregistre l’horodatage actuel dans une propriété (qui est globale pour toutes les exécutions de script), puis se met en veille pendant 5 secondes. Si, après le réveil, l'heure actuelle est inférieure à environ 4,95 secondes après la valeur enregistrée dans la propriété lastEditedTime, cela signifie que le script a été exécuté au moins une fois depuis cette exécution (car la valeur lastEditedTime a été mis à jour à une date ultérieure). Par conséquent, n'est pas l'exécution la plus récente du script, nous ne faisons donc que revenir et ne rien faire.

Ensuite, il suffit de lire les règles de formatage conditionnelles actuelles et de les réécrire, mais avec les plages correctes définies.

Le script fonctionne plutôt bien et jusqu'à présent, rien n'a échoué, mais parfois Je remarque qu'il est exécuté deux fois. Je ne sais pas si je suis en train de faire deux modifications à moins de 50 ms l'une de l'autre ou si cela a quelque chose à voir avec la façon dont les scripts sont exécutés sur les serveurs de Google, mais cela n'a pas posé de problèmes jusqu'à présent.

0
Clonkex