Data atual como uma variável no Google Docs?

12

É possível adicionar (inserir) uma variável para a data atual em um Google Docs que seja atualizado automaticamente sempre que eu abrir o documento?

Alguns critérios:

  • A posição da data deve ser variável, ou seja, permitindo-me inserir a data em diferentes posições de uma página / parágrafo

  • O documento ainda deve ser compartilhável, ou seja, as pessoas que abrem meu documento também serão exibidas com a data atual

orschiro
fonte
Qual fuso horário deve ser usado para calcular a data atual?
Rubén
Para que seja versátil, talvez definido pelo próprio usuário nas configurações? Ou ele pode ser obtido de alguma forma nas configurações do Google Docs do usuário automaticamente?
Orschiro 6/08
1
Acabei de adicionar minha tentativa de codificação. Em relação ao fuso horário, usei o GMT-5, mas ele pode ser facilmente alterado para o que você precisa. Não é uma solução completa.
Rubén

Respostas:

9

Resposta curta

No momento, as variáveis ​​não são um recurso interno do Google Docs e do Google Apps Script, a plataforma para estender o Google Docs, não inclui uma classe ou método para lidar com elas.

Alternativas

Alternativa 1

Uma alternativa é usar um padrão de texto, mas você deve ter certeza de que corresponderá apenas à data que deseja atualizar.

Alternativa 2

Outra alternativa é usar a classe NamedRange, mas lembre-se de que

  1. mover o intervalo fará com que ele perca seu nome 1 .
  2. substituir o texto em um intervalo nomeado por vários elementos só funciona na primeira vez 2 .

Código:

O código a seguir, destinado a ser usado em um script vinculado a um Documento do Google, tem duas funções principais:

  1. Inserir data de hoje
  2. Atualizar data de hoje

Para fins de depuração estão sendo usados

  1. data e hora, em vez de apenas data.
  2. menus personalizados para acionar as principais funções.

"Problemas conhecidos": a função de atualização substitui o parágrafo inteiro.

Para testar o código, copie-o, vá para o Google Docs, crie um novo documento, clique em Ferramentas> Editor de scripts, selecione Projeto em branco, cole o código, salve o projeto, atribua um nome, execute o prazo para autorizar o aplicativo , feche seu documento e abra novamente. Um novo menu chamado "Utilitários" será exibido. A partir daí, você pode chamar as principais funções.

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


Abaixo, existem alguns itens de tipos diferentes (perguntas, especificações etc.) que podem servir de inspiração ou apontar para a "direção certa" para encontrar uma "solução"


Notas de rodapé

Rubén
fonte
Isso significa que não é possível?
Jacob Jan Tuinstra
@JacobJanTuinstra: IMHO, sim, não é possível. O que poderia ser possível é encontrar uma solução alternativa, mas é necessário mais contexto. Eu acho que pedir que a informação deve ser feito em comentários, mas eu em qualquer lugar ainda não posso comentar :)
Rubén
1
@orschiro Fico feliz em saber que funcionou para você. Em vez de refatorar uma extensão do Chrome, poderia ser um complemento do Google Docs, eu acho.
Rubén
1
@ChristopherFrancisco: o código deve ser usado em scripts limitados, mas pode ser adaptado para ser usado em seu aplicativo, mas essa é uma pergunta diferente e provavelmente muito mais apropriada para o estouro de pilha .
Rubén
1
@ChristopherFrancisco Acabei de adicionar um link ao guia oficial sobre os limites dos scripts nos arquivos do editor do Google Docs.
Rubén