Как определить индекс элемента Google Docs? - PullRequest
1 голос
/ 19 апреля 2019

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

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

* редактировать: данные формы попадают в листы Google. В начале документа находится таблица с информацией о назначении.

  1. Я хочу взять слово в определенной ячейке таблицы сведений о встречах в документе и использовать его в качестве имени файла. Однако я не могу понять, как определить индекс текста этой ячейки.

  2. Изменить форматирование заголовка по определенному индексу. Я знаю, как вставить форматированный текст, удалить текст и т. Д. Но не могу понять, как изменить форматирование существующего текста.

Я пробовал все варианты .getParent (), .getChildIndex (), getNextSibling () и т. Д.

Вот ссылка на пример document

Вот некоторые из вещей, которые я попытался найти, указатель в ячейке рядом с надписью «Психометрист»:

function findElement() {
  var foundTag = body.findText('Psychometrist');
  if (foundTag != null) {
    var tagElement = foundTag.getElement();
    var parent = tagElement.getParent();
    var parentLoc = parent.getParent().getChildIndex(parent);
    var parentTwo = parent.getParent();
    var parentTwoLoc = tagElement.getPreviousSibling();
    var parentTwoLocA = parentTwoLoc.
  } 

    Logger.log(tagElement);
    Logger.log(parent);
    Logger.log(parentLoc);
    Logger.log(parentTwo);
    Logger.log(parentTwoLoc);
}

Я полностью потерян здесь. Я просто хочу выяснить, как указать код имени файла, чтобы получить текст в этом месте, так как текст будет отличаться.

А также изменить форматирование текста в определенном месте.

1 Ответ

0 голосов
/ 19 апреля 2019

Проект, который поможет вам идентифицировать и редактировать таблицы и ячейки в Документах Google из скрипта Google Apps.

Этот проект загружается в боковую панель и читает ваш документ для поиска таблиц.Когда он находит таблицы в отображении, все строки, ячейки, индексы строк, индексы ячеек и текст ячейки.Каждая ячейка имеет текстовое поле и кнопку Сохранить, которая позволяет редактировать текст ячейки.Но вы также можете использовать только индексы в своей собственной программе.

Вам нужно будет создать html-файл с именем 'script' и загрузить в него код script.html, а остальная часть кода сможет работатьв файл Code.gs.Если вы создаете отдельный проект от того, над которым работаете, вы можете запустить onOpen, и он создаст меню, которое не будет мешать никаким возможным меню в вашем проекте.

Code.gs:

Функция "findTableCells ()" генерирует боковую панель, которая использует шаблонный подход, так что функции Javascript можно разрабатывать менее громоздким методом, а не пытаться включать в строку, как если бы они были минимизированы.В него также включены подсказки, помогающие идентифицировать различные индексы и элементы таблицы.

function onOpen() {
  DocumentApp.getUi().createMenu('Table Menu')
  .addItem('Find Table Cells', 'findingTableCells')
  .addToUi();
}



function findingTableCells() {
  var d=DocumentApp.getActiveDocument();
  var body=d.getBody();
  var numChildren=body.getNumChildren();
  var html='<html><head>';
  html+='<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>';
  html+='<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">';
  html+='<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>';
  html+='<style>';
  html+='body{font-size:14px;font-family:calibri;}';
  html+='td,th{border:1px solid black;}';
  html+='.tblcell input[type="text"]{background-color:#ffff00;margin:2px 1px;}';
  html+='.tblcell input{margin:1px;}';
  html+='.tblcell a{text-decoration:none;}';
  html+='.childhdr{background-color:#00ffff;}';
  html+='.childhdr a{text-decoration:none;}';
  html+='</style></head><body><table>';
  for(var i=0;i<numChildren;i++) { 
    var child=body.getChild(i);
    if(child.getType()==DocumentApp.ElementType.TABLE) {
      html+=Utilities.formatString('<span class="childhdr">Child[<a href="#" title="Child Index">%s</a>]:</span><br />',i);
      var numRows=child.asTable().getNumRows();
      for(var ri=0;ri<numRows;ri++) {
        var numCells=child.asTable().getRow(ri).getNumCells();
        for(var ci=0;ci<numCells;ci++) {
          var cellText=child.asTable().getRow(ri).getCell(ci).editAsText().getText();
          html+=Utilities.formatString('<span class="tblcell">R:[<a href="#" title="Row Index">%s</a>]&nbsp;C:[<a href="#" title="Cell Index">%s</a>]:<input type="text" value="%s" id="%s-%s-%s" size="10" title="Editable Cell Text"/>',ri,ci,cellText,i,ri,ci);
          html+=Utilities.formatString('<input type="button" value="Save" onClick="saveCellText({child:%s,row:%s,cell:%s})" title="Saves Text using slightly different text style."/>', i,ri,ci);
          html+=Utilities.formatString('<input type="button" value="Bold" onClick="setCellTextStyleBold({child:%s,row:%s,cell:%s})" title="Bolds & Enlarges Text"/></span><br />', i,ri,ci);
        }
      }
    }
  }
  html+='<?!= include("script") ?>'
  html+='</table></body></html>';
  var ui=HtmlService.createTemplate(html).evaluate().setTitle('Finding Table Cells');
  DocumentApp.getUi().showSidebar(ui);
}

function include(filename) {
  return HtmlService.createHtmlOutputFromFile(filename).getContent();
}

function saveCellText(cObj) {
  var doc=DocumentApp.getActiveDocument();
  var body=doc.getBody();
  body.getChild(cObj.child).asTable().getRow(cObj.row).getCell(cObj.cell).editAsText().setText(cObj.text).setAttributes(Normal1);
  return cObj;
}

function setCellTextStyleBold(cObj) {
  var doc=DocumentApp.getActiveDocument();
  var body=doc.getBody();
  body.getChild(cObj.child).asTable().getRow(cObj.row).getCell(cObj.cell).editAsText().setAttributes(Bold1);
  return cObj;
}

style.gs:

В файле style.gs есть только пара упрощенных объектов стиля длядемонстрируя, как можно изменить стиль программно.

var Bold1={};
Bold1[DocumentApp.Attribute.BOLD]=true;
Bold1[DocumentApp.Attribute.FONT_SIZE]=14;
var Normal1={};
Normal1[DocumentApp.Attribute.BOLD]=false;
Normal1[DocumentApp.Attribute.FONT_SIZE]=10;

script.html

Здесь всего две функции, одна из которых сохраняет все изменения, внесенные в ячейки, в одном стиле.Другой просто жирный шрифт и увеличивает текст.Они оба осуществляют связь клиент-сервер с google.script.run .

<script>
  function saveCellText(cObj) {
    var id='#' + cObj.child + '-' + cObj.row + '-' + cObj.cell;
    $(id).css('background-color','#ffffff');
    var txt=$(id).val();
    cObj['text']=txt;
    google.script.run
    .withSuccessHandler(function(cObj) {
      var id1='#' + cObj.child + '-' + cObj.row + '-' + cObj.cell;
      $(id1).css('background-color','#ffff00');
    })
    .saveCellText(cObj);
  }
  function setCellTextStyleBold(cObj) {
    var id='#' + cObj.child + '-' + cObj.row + '-' + cObj.cell;
    $(id).css('background-color','#ffffff');
    var txt=$(id).val();
    cObj['text']=txt;
    google.script.run
    .withSuccessHandler(function(cObj) {
      var id1='#' + cObj.child + '-' + cObj.row + '-' + cObj.cell;
      $(id1).css('background-color','#ffff00');
    })
    .setCellTextStyleBold(cObj);
  }
</script>

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

...