¿Fecha actual como variable en Google Docs?

12

¿Es posible agregar (insertar) una variable para la fecha actual en Google Docs que se actualizará automáticamente cada vez que abra el documento?

Algunos criterios:

  • La posición de la fecha debe ser variable, es decir, me permite insertar la fecha en diferentes posiciones de una página / párrafo

  • El documento aún debe poder compartirse, es decir, las personas que abran mi documento también se mostrarán con la fecha actual

orschiro
fuente
¿Qué zona horaria se debe usar para calcular la fecha actual?
Rubén
Para que sea versátil, ¿tal vez definido por el propio usuario en la configuración? ¿O se puede obtener de alguna manera de la configuración de Google Docs del usuario automáticamente?
orschiro
1
Acabo de agregar mi intento de codificación. En cuanto a la zona horaria, utilicé GMT-5, pero podría cambiarse fácilmente a la que necesita. No es una solución completa.
Rubén

Respuestas:

9

Respuesta corta

En este momento, las variables no son una característica incorporada de Google Docs y Google Apps Script, la plataforma para extender Google Docs, no incluye una clase o método para manejarlos.

Alternativas

Alternativa 1

Una alternativa es usar un patrón de texto, pero debe estar seguro de que solo coincidirá con la fecha que desea actualizar.

Alternativa 2

Otra alternativa es usar la clase NamedRange pero tenga en cuenta que

  1. mover el rango hará que pierda su nombre 1 .
  2. reemplazar texto en un rango con nombre con múltiples elementos solo funciona la primera vez 2 .

Código:

El siguiente código, destinado a ser utilizado en un script vinculado a un documento de Google, tiene dos funciones principales:

  1. Insertar la fecha de hoy
  2. Actualiza la fecha de hoy

Para fines de depuración se están utilizando

  1. fecha y hora, en lugar de solo la fecha.
  2. menús personalizados para activar las funciones principales.

"Problemas conocidos": la función de actualización reemplaza todo el párrafo.

Para probar el código, cópielo, luego vaya a Google Docs, cree un nuevo documento, haga clic en Herramientas> Editor de secuencias de comandos, seleccione Proyecto en blanco, pegue el código, guarde el proyecto, asigne un nombre, ejecute a tiempo para autorizar la aplicación , cierre su documento y ábralo nuevamente. Aparecerá un nuevo menú llamado "Utilidades". Desde allí puede llamar a las funciones 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());
}


A continuación hay algunos elementos de diferentes tipos (preguntas, especificaciones, etc.) que podrían servir para inspirarse o señalar la "dirección correcta" para encontrar una "solución".


Notas al pie

Rubén
fuente
¿Eso significa que no es posible?
Jacob Jan Tuinstra
@JacobJanTuinstra: En mi humilde opinión, sí, no es posible. Lo que podría ser posible es encontrar una solución, pero es necesario más contexto. Creo que pedir esa información debería hacerse en los comentarios, pero aún no puedo comentar en ningún lado :)
Rubén
1
@orschiro Me alegra saber que funcionó para ti. Creo que, en lugar de refactorizarse en una extensión de Chrome, podría estar en un complemento de Google Docs.
Rubén
1
@ChristopherFrancisco: el código está destinado a ser utilizado en un script acotado, pero podría adaptarse para ser utilizado desde su aplicación, pero esa es una pregunta diferente que es muy probable que sea más apropiado para Stack Overflow .
Rubén
1
@ChristopherFrancisco Acabo de agregar un enlace a la guía oficial sobre los límites de los scripts a los archivos del editor de Google Docs.
Rubén