DocumentApp для Google Apps Script не возвращает все атрибуты элемента? - PullRequest
0 голосов
/ 21 января 2019

Когда я пытаюсь получить атрибуты элемента, используя метод getAttributes () из библиотеки Google Apps Script DocumentApp для Google Doc, отображаются не все атрибуты; в частности, атрибут GLYPH_TYPE для элемента listItem.

Из-за отсутствия функциональности в Документах Google для контрольных списков я пишу кодовый скрипт для автоматического расчета процента заполнения списка на основе символа, присутствующего в каждом элементе списка, принадлежащем списку. Чтобы сделать это, я извлекаю все listItems, относящиеся к listID, а затем пытаюсь проверить их атрибут GLYPH_TYPE, чтобы определить, какие элементы были завершены (что пользователь указывает, щелкая символ слева от элемента списка и изменяя его к галочке). С последним у меня возникают проблемы; когда я вызываю getAttributes () для объекта Paragraph или listItem для элемента списка, GLYPH_TYPE вообще не присутствует.

Вот метод, в котором я просто пытаюсь извлечь атрибут GLYPH_TYPE для listItem;

function getGlyphTypeFromListItem(documentId){
  var doc = 
  DocumentApp.openById("1mzVQUccSH_suf8KoTkbVN4XjIOcfbYDuie3GV_M1Fg8");
  var body = doc.getBody();
  Logger.log(body.getParagraphs()[0].getAttributes());
  Logger.log(body.getParagraphs() 
  [0].findElement(DocumentApp.ElementType.LIST_ITEM).getElement()
  .getAttributes()); 
}

Когда я запускаю этот метод, я получаю ответы:

[19-01-20 18:22:02:242 MST] {FONT_SIZE=11, ITALIC=true, HORIZONTAL_ALIGNMENT=null, INDENT_END=null, INDENT_START=144.0,LINE_SPACING=null, LINK_URL=null, UNDERLINE=true, 
BACKGROUND_COLOR=null, INDENT_FIRST_LINE=126.0, LEFT_TO_RIGHT=true, 
SPACING_BEFORE=null, HEADING=Normal, SPACING_AFTER=null, 
STRIKETHROUGH=null, FOREGROUND_COLOR=null, BOLD=true, 
FONT_FAMILY=Roboto Condensed}
[19-01-20 18:30:21:253 MST] {FONT_SIZE=11, ITALIC=true, 
HORIZONTAL_ALIGNMENT=null, INDENT_END=null, INDENT_START=144.0, 
LINE_SPACING=null, LINK_URL=null, UNDERLINE=true, BACKGROUND_COLOR=null, 
INDENT_FIRST_LINE=126.0, LEFT_TO_RIGHT=true, SPACING_BEFORE=null, 
HEADING=Normal, SPACING_AFTER=null, STRIKETHROUGH=null, FOREGROUND_COLOR=null, 
BOLD=true, FONT_FAMILY=Roboto Condensed}

Как видите, GLYPH_TYPE полностью отсутствует в обоих журналах; я что-то пропустил? Кроме того, кто-нибудь из вас нашел более интуитивно понятный способ отслеживания заполнения "контрольных списков" в Документах Google?

Заранее спасибо!

Ответы [ 2 ]

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

Документация Google гласит, что метод "Абзац" getAtributes (doc)"извлекает атрибуты элемента. Результатом является объект, содержащий свойство для каждого действительного атрибута элемента, где каждое имя свойства соответствует элемент в перечислении DocumentApp.Attribute. " GLYPH_TYPE записывается как одно из свойств " Enum Attribute ".

Я согласен с ФП в том, что GLYPH TYPE не сообщается при анализе абзаца. Однако, если Тип абзаца = DocumentApp.ElementType.LIST_ITEM, , то getAttributes сообщает GLYPH_TYPE, а также некоторые дополнительные данные (см. Изображение ниже). Трудно сказать, есть ли ошибка в коде Google или (возможно) ошибка в документации.

Что касается кода OP, я получил те же результаты.

Но интересно отметить, что ListItem возвращается getParagraphs, но ListItem НЕ является «абзацем». («Абзац может содержать элементы Equation, Footnote, HorizontalRule, InlineDrawing, InlineImage, PageBreak и Text.» ( docs )). Метод getParagraphs "извлекает все абзацы, содержащиеся в разделе (, включая ListItems )" ( docs ). Это странный, почти противоречивый результат, но я думаю, что это может быть причиной того, что код ОП оказался неудачным.


Это был мой код (взято из ОП).

function so54282539() {

  var doc = DocumentApp.getActiveDocument();
  var body = doc.getBody();

  // variable to count the list#
  var listcounter = 0;

  // get the Paragraphs
  var paras = doc.getParagraphs();
  //Logger.log("DEBUG: paras = "+paras);//DEBUG
  Logger.log("DEBUG:Number of paragraphs: " + paras.length); //DEBUG

  // get the List Items
  var lists = doc.getListItems();
  //Logger.log("DEBUG: Lists: "+lists);//DEBUG
  Logger.log("DEBUG: Number of lists: " + lists.length); //DEBUG
  Logger.log("     "); //DEBUG

  //Loop through the Paragraphs (i)
  for (var i = 0; i < paras.length; i++) {

    var mytypeof = paras[i].getType();
    Logger.log("DEBUG: Paragraph#i=" + (i + 1) + ", Type: " + mytypeof); //DEBUG

    // if thgis parapgraph is a list item, then get more information
    if (mytypeof === DocumentApp.ElementType.LIST_ITEM) {

      var paraattributes = paras[i].getAttributes();

      // list the paragraph attributes
      for (var key in paraattributes) {
        if (paraattributes.hasOwnProperty(key)) {
          Logger.log("Paragraph Attribute: " + key + " -> " + paraattributes[key]);
        }
      }

      // List the GLPH TYPE
      Logger.log("Glyph: " + lists[listcounter].getGlyphType());
      var otherattributes = lists[listcounter].getAttributes();

      // List the List_Item Attributes
      for (var listkey in otherattributes) {
        if (otherattributes.hasOwnProperty(listkey)) {
          Logger.log("List_Item Attribute: " + listkey + " -> " + otherattributes[listkey]);
        }
      }
      listcounter = listcounter + 1;
    }
  }
}

Сравнение типичных атрибутов - Абзац против List_Item
Typical Attribute comparison - Paragraph vs List_Item


Атрибуты List_Item
List_Item Attributes


Макет документа
Document layout

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

Я пробовал это:

function getGlyphType(){
  var doc=DocumentApp.getActiveDocument();
  var body=doc.getBody();
  var children=body.getNumChildren();
  var gA=[];
  for(var i=0;i<children;i++){
    var child=body.getChild(i);
    if(child.getType()==DocumentApp.ElementType.LIST_ITEM){
      gA.push(child.asListItem().getAttributes()['GLYPH_TYPE']);
    }
    var ui=HtmlService.createHtmlOutput(gA.join(', '));
    DocumentApp.getUi().showModelessDialog(ui, 'Info')
  }
}

Я мог узнать, номер это или пуля, но я не мог определить тип пули.

...