Google Apps Script的DocumentApp是否不返回元素的所有属性?

时间:2019-01-21 01:34:00

标签: javascript google-apps-script google-docs google-docs-api

当我尝试使用Google Docs的Google Apps Script DocumentApp库中的getAttributes()方法从元素中获取属性时,并非所有属性都显示出来;尤其是listItem元素的GLYPH_TYPE属性。

由于Google Docs中缺少清单功能,因此我正在编写代码脚本,以根据属于列表的每个列表项的符号自动计算列表的完成百分比。为此,我要检索与listID相关的所有listItem,然后尝试检查其GLYPH_TYPE属性,以区分已完成的项目(用户可以通过单击列表项目左侧的符号并进行更改来指示哪些内容)到选中标记)。我遇到的是后者;当我为段落项或列表项的listItem对象调用getAttributes()时,根本没有GLYPH_TYPE。

这是一种我只是尝试为listItem提取GLYPH_TYPE属性的方法;

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 :(得分:1)

Google文档说,“段落” getAtributes方法(doc)“检索元素的属性。结果是一个对象,其中包含每个有效元素属性的属性,其中每个属性名称都对应于DocumentApp.Attribute枚举。” GLYPH_TYPE被记录为“ Enum Attribute”的属性之一。

我同意OP的意见,即在分析段落时不报告GLYPH TYPE。 但是,如果段落类型= DocumentApp.ElementType.LIST_ITEM然后 getAttributes 报告GLYPH_TYPE以及一些其他数据(请参阅图片下面)。很难说Google代码中是否有错误,或者文档中(也许)有错误。

就OP代码而言,我得到了相同的结果。

但是有趣的是,getParagraphs返回了ListItem,但是ListItem不是'paragraph'。 (“段落可能包含方程式,脚注,Horizo​​ntalRule,InlineDrawing,InlineImage,PageBreak和Text元素。”(docs)。 getParagraphs方法“检索节(包括ListItems )中包含的所有段落”(docs)。这是一个奇怪的,几乎矛盾的结果,但是我认为这可能是OP的代码未成功的原因。


这是我的代码(改编自OP)。

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

典型属性比较-段落vs List_Item
Typical Attribute comparison - Paragraph vs List_Item


List_Item属性
List_Item Attributes


文档布局
Document layout

答案 1 :(得分:0)

我尝试过:

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')
  }
}

我可以知道它是数字还是子弹,但我无法确定它是什么类型的子弹。