当我尝试使用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文档中“清单”的完成情况?
提前谢谢!
答案 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'。 (“段落可能包含方程式,脚注,HorizontalRule,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;
}
}
}
答案 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')
}
}
我可以知道它是数字还是子弹,但我无法确定它是什么类型的子弹。