Текущая дата как переменная в Google Docs?

12

Можно ли добавить (вставить) переменную для текущей даты в Документы Google, которая будет автоматически обновляться при каждом открытии документа?

Некоторые критерии:

  • Позиция даты должна быть переменной, т. Е. Позволяет мне вставлять дату в разные позиции страницы / абзаца

  • Документ по-прежнему должен быть общедоступным, т.е. люди, открывающие мой документ, также будут отображаться с текущей датой

orschiro
источник
Какой часовой пояс следует использовать для расчета текущей даты?
Рубен
Чтобы он был универсальным, может быть, определяется самим пользователем в настройках? Или это может быть каким-то образом извлечено из настроек Google Docs пользователя автоматически?
Орширо
1
Просто добавил мою попытку кодирования. Что касается часового пояса, я использовал GMT-5, но его можно легко заменить на тот, который вам нужен. Это не полное решение.
Рубен

Ответы:

9

Короткий ответ

В настоящее время переменные не являются встроенной функцией Google Docs, а Google Apps Script, платформа для расширения Google Docs, не включает в себя класс или метод для их обработки.

альтернативы

Альтернатива 1

Один из вариантов - использовать текстовый шаблон, но вы должны быть уверены, что он будет соответствовать только дате, которую вы хотите обновить.

Альтернатива 2

Другой альтернативой является использование класса NamedRange, но имейте в виду, что

  1. перемещение диапазона приведет к тому, что он потеряет свое имя 1 .
  2. замена текста в именованном диапазоне несколькими элементами работает только в первый раз 2 .

Код:

Следующий код, предназначенный для использования в скрипте, привязанном к Документу Google, имеет две основные функции:

  1. Вставьте сегодняшнюю дату
  2. Обновите сегодняшнюю дату

В целях отладки используются

  1. дата и время, а не только дата.
  2. пользовательские меню для запуска основных функций.

«Известные проблемы»: функция обновления заменяет весь абзац.

Чтобы проверить код, скопируйте его, затем перейдите в Google Docs, создайте новый документ, нажмите Инструменты> Редактор сценариев, выберите Пустой проект, вставьте код, сохраните проект, назначьте имя, запустите вовремя, чтобы авторизовать приложение закройте документ и откройте снова. Появится новое меню «Утилиты». Оттуда вы можете вызвать основные функции.

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


Ниже приведены некоторые предметы различного рода (вопросы, спецификации и т. Д.), Которые могут послужить источником вдохновения или указать «правильное направление» для поиска «решения».


Сноски

Рубена
источник
Значит ли это, что это невозможно?
Джейкоб Ян Туинстра
@JacobJanTuinstra: ИМХО, да, это невозможно. Что может быть возможно, так это найти обходной путь, но это необходимо больше контекста. Я думаю, что запрос этой информации должен быть сделан в комментариях, но я пока не могу комментировать :)
Rubén
1
@orschiro Я рад узнать, что это сработало для тебя. Я думаю, что вместо рефакторинга в расширение Chrome можно добавить в дополнение к Google Docs.
Рубен
1
@ChristopherFrancisco: код предназначен для использования в ограниченном сценарии, но его можно адаптировать для использования в вашем приложении, но это другой вопрос, который, скорее всего, больше подходит для переполнения стека .
Рубен
1
@ChristopherFrancisco Я только что добавил ссылку на официальное руководство по привязке скриптов к файлам редактора Документов Google.
Рубен