Кэширование выбранного текстового элемента с помощью скрипта Google Doc Apps - PullRequest
0 голосов
/ 23 января 2019

Обновление: Это лучший способ задать следующий вопрос.

Есть ли Id подобный атрибут для Element в Document, который я могу использовать для достижения этого элемента в более позднее время. Допустим, я вставил абзац в документ следующим образом:

var myParagraph = 'This should be highlighted when user clicks a button';
body.insertParagraph(0, myParagraph);

Затем пользователь вставляет еще один в начале вручную (т. Е. Печатая или вставляя). Теперь childIndex моего абзаца изменится на 1 с 0. Я хочу дойти до этого абзаца позже и выделить его. Но из-за вставки childIndex больше не действителен. Не существует Id подобного атрибута для интерфейса Element или любого другого типа, реализующего это. CahceService и PropertiesService принимают только данные String, поэтому я не могу сохранить myParagraph как Object.

Ребята, у вас есть идея достичь того, чего я хочу?

Спасибо

Старая версия того же вопроса (необязательно для чтения):

Представьте, что пользователь выбирает слово и нажимает кнопку выделения моего дополнения. Затем она делает то же самое для нескольких слов. Затем она редактирует документ таким образом, что изменяются начальные и конечные индексы этих выделенных слов.

В этот момент она нажимает кнопку удаления выделения . Мое дополнение должно отключить подсветку всех ранее выбранных слов. Проблема в том, что я не хочу сканировать весь документ и найти какой-либо выделенный текст. Я просто хочу прямой доступ к тем, которые ранее выбрали.

Есть ли способ сделать это? Я пытался кэшировать выбранные элементы. Но когда я возвращаю их из кеша, я получаю ошибку TypeError: Cannot find function insertText in object Text.. Кажется, что тип объекта или что-то меняется между cache.put() и cache.get().

var elements = selection.getSelectedElements();
    for (var i = 0; i < elements.length; ++i) {
      if (elements[i].isPartial()) {
        Logger.log('partial');
        var element = elements[i].getElement().asText();

        var cache = CacheService.getDocumentCache();
        cache.put('element', element);  


        var startIndex = elements[i].getStartOffset();
        var endIndex = elements[i].getEndOffsetInclusive();
     }
    // ...
   }

Когда я возвращаю элемент, я получаю TypeError: Cannot find function insertText in object Text. ошибку.

 var cache = CacheService.getDocumentCache();
 cache.get('text').insertText(0, ':)');  

Я надеюсь, что смогу четко объяснить, чего я хочу достичь.

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Одним из прямых способов является добавление закладки , которая не зависит от последующих изменений документа. У него есть недостаток: закладка видна всем ...

Более интересный способ - добавить именованный диапазон с уникальным именем. Пример кода ниже:

function setNamedParagraph() {
  var doc = DocumentApp.getActiveDocument();
  // Suppose you want to remember namely the third paragraph (currently)
  var par = doc.getBody().getParagraphs()[2];
  Logger.log(par.getText());
  var rng = doc.newRange().addElement(par);
  doc.addNamedRange("My Unique Paragraph", rng);
}


function getParagraphByName() {
  var doc = DocumentApp.getActiveDocument();
  var rng = doc.getNamedRanges("My Unique Paragraph")[0];
  if (rng) {
    var par = rng.getRange().getRangeElements()[0].getElement().asParagraph();
    Logger.log(par.getText());
  } else {
    Logger.log("Deleted!");
  }
}

Первая функция «помечает» третий абзац как именованный диапазон. Второй принимает этот абзац под именем диапазона, несмотря на последующие изменения документа. На самом деле здесь нам нужно рассмотреть исключение, когда наш «уникальный абзац» был удален.

0 голосов
/ 23 января 2019

Не уверен, что кеш - лучший подход. Кэш изменчив, поэтому может случиться, что кэшированное значение больше не существует. Возможно PropertiesService - лучший выбор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...