La date actuelle en tant que variable dans Google Docs?

12

Est-il possible d'ajouter (insérer) une variable pour la date actuelle dans un document Google qui se mettrait automatiquement à jour à chaque ouverture du document?

Quelques critères:

  • La position de la date doit être variable, c'est-à-dire me permettre d'insérer la date à différentes positions d'une page / paragraphe

  • Le document doit toujours être partageable, c'est-à-dire que les personnes qui ouvrent mon document seront également affichées avec la date actuelle

orschiro
la source
Quel fuseau horaire doit être utilisé pour calculer la date actuelle?
Rubén
Pour l'avoir polyvalent, peut-être défini par l'utilisateur lui-même dans les paramètres? Ou peut-il être récupéré automatiquement dans les paramètres de Google Docs de l'utilisateur?
orschiro
1
Je viens d'ajouter ma tentative de codage. En ce qui concerne le fuseau horaire, j'ai utilisé GMT-5 mais il pourrait être facilement changé en celui dont vous avez besoin. Ce n'est pas une solution complète.
Rubén

Réponses:

9

Réponse courte

À l'heure actuelle, les variables ne sont pas une fonctionnalité intégrée de Google Docs et Google Apps Script, la plate-forme pour étendre Google Docs, n'inclut pas de classe ou de méthode pour les gérer.

Alternatives

Alternative 1

Une alternative consiste à utiliser un modèle de texte, mais vous devez être sûr qu'il ne correspondra qu'à la date que vous souhaitez mettre à jour.

Alternative 2

Une autre alternative consiste à utiliser la classe NamedRange mais gardez à l'esprit que

  1. déplacer la gamme lui fera perdre son nom 1 .
  2. le remplacement de texte dans une plage nommée par plusieurs éléments ne fonctionne que la première fois 2 .

Code:

Le code suivant, destiné à être utilisé dans un script lié à un document Google, a deux fonctions principales:

  1. Insérez la date du jour
  2. Mettre à jour la date d'aujourd'hui

À des fins de débogage sont utilisés

  1. date et heure, au lieu de la date uniquement.
  2. menus personnalisés pour déclencher les fonctions principales.

"Problèmes connus": la fonction de mise à jour remplace tout le paragraphe.

Pour tester le code, copiez-le, puis accédez à vos documents Google, créez un nouveau document, cliquez sur Outils> Éditeur de script, sélectionnez Projet vierge, collez le code, enregistrez le projet, attribuez un nom, exécutez à temps pour autoriser l'application , fermez votre doc et rouvrez-le. Un nouveau menu appelé "Utilitaires" s'affiche. De là, vous pouvez appeler les fonctions principales.

function onOpen() {
  // Add a menu with some items, some separators, and a sub-menu.
  DocumentApp.getUi().createMenu('Utilities')
      .addItem('Insert Today\'s Date', 'insertTodayAtCursor')
      .addItem('Update Today\'s Date', 'setTodayNamedRange')
      .addToUi();
}

function todayDate(){
  return Utilities.formatDate(new Date(), "GMT-5", "yyyy-MM-dd'T'HH:mm:ss'Z'"); // "yyyy-MM-dd"
}

/**
 * Inserts the today's date at the current cursor location and create a NamedRange.
 */
function insertTodayAtCursor() {
  var str = 'testToday';
  var doc = DocumentApp.getActiveDocument();
  var cursor = doc.getCursor();

  if (cursor) {
    // Attempt to insert today's date at the cursor position. If insertion returns null,
    // then the cursor's containing element doesn't allow text insertions.
    var date = todayDate();
    var element = cursor.insertText(date);
    if (element) {
      var rangeBuilder = doc.newRange();
      rangeBuilder.addElement(element);
      return doc.addNamedRange(str, rangeBuilder.build()); 
    } else {
      DocumentApp.getUi().alert('Cannot insert text at this cursor location.');
    }
  } else {
    DocumentApp.getUi().alert('Cannot find a cursor in the document.');
  }
}

function setTodayNamedRange(){
  var str = 'testToday';
  var doc = DocumentApp.getActiveDocument();
  // Retrieve the named range
  var namedRanges = doc.getNamedRanges();
  var newRange = doc.newRange();
  var date = todayDate();
  for(var i=0; i<namedRanges.length; i++){

    if(namedRanges[i].getName() == str){

      var rangeElement = namedRanges[i].getRange().getRangeElements();

      for (var j=0; j<rangeElement.length; j++){

        var element = rangeElement[j].getElement().asText().editAsText().setText(date);
        newRange.addElement(element);
      }
    }
  }
  doc.addNamedRange(str, newRange.build());
}


Ci-dessous, il y a quelques éléments de différents types (questions, spécifications, etc.) qui pourraient servir d'inspiration ou indiquer la "bonne direction" pour trouver une "solution"


Notes de bas de page

Rubén
la source
Est-ce à dire que ce n'est pas possible?
Jacob Jan Tuinstra le
@JacobJanTuinstra: À mon humble avis, ce n'est pas possible. Ce qui pourrait être possible est de trouver une solution de contournement, mais il faut plus de contexte. Je pense que demander cette information devrait se faire dans les commentaires, mais je ne peux pas encore commenter nulle part :)
Rubén
1
@orschiro Je suis content de savoir que cela a fonctionné pour vous. Plutôt que d'être refactorisé dans une extension Chrome, pourrait être dans un module complémentaire Google Docs, je pense.
Rubén
1
@ChristopherFrancisco: Le code est destiné à être utilisé sur un script borné, mais il pourrait être adapté pour être utilisé à partir de votre application, mais c'est une question différente qui est très probablement plus appropriée pour Stack Overflow .
Rubén
1
@ChristopherFrancisco Je viens d'ajouter un lien vers le guide officiel sur les limites des scripts aux fichiers de l'éditeur Google Docs.
Rubén