如何在文档服务中将填充属性值应用于整个表?

时间:2017-05-13 07:34:14

标签: google-apps-script

所需行为

我希望能够将填充属性值应用于整个表,而不仅仅是单个单元格。

实际行为

我可以将padding属性值应用于单个单元格,但不能将整个表格应用。

我尝试过的事情

我用:

创建一个表
var header_table = body.insertTable(0, cells);

这是使用insertTable(childIndex, cells)类的Body方法并返回Table

Table类有一个名为setAttributes(attributes)的方法"sets the element's attributes"

然后我尝试使用以下内容设置表的属性:

// BEGIN define style
var header_table_style = {};
header_table_style[DocumentApp.Attribute.FONT_FAMILY] = 'Arial';
header_table_style[DocumentApp.Attribute.PADDING_BOTTOM] = 0;
header_table_style[DocumentApp.Attribute.PADDING_LEFT] = 0;
header_table_style[DocumentApp.Attribute.PADDING_RIGHT] = 0;
header_table_style[DocumentApp.Attribute.PADDING_TOP] = 0;
// END define style

// apply the style to the table
header_table.setAttributes(header_table_style);

结果是font-family已应用但padding未被应用,甚至认为padding位于Enum Attributes列表中。

但是,如果我尝试将属性应用于单个单元格,则应用填充:

header_table.getCell(0, 0).setAttributes(header_table_style);
header_table.getCell(0, 1).setAttributes(header_table_style);

问题

01)如何将属性应用于整个表格?

02) 奖金问题:为什么Table方法的所有官方代码示例都与使用Table类的方案没有具体关系? (example

03) 奖金问题:为什么有getRow(rowIndex)表方法而不是getColumn(columnIndex)方法?如何将列的所有内容集中在一起?

修改:

顺便说一下,我申请样式的其他类似尝试都不起作用 - 我将它们包含在下面,因为它们都可能指向对某些方法如何工作的单一误解。

a)尝试通过MARGIN_TOP在段落前添加5个点空格 - (结果:应用了所有其他样式,MARGIN_TOP除外):

var title_text = body.insertParagraph(2,"Hello");
title_style = {};
title_style[DocumentApp.Attribute.FONT_FAMILY] = 'Roboto Condensed';
title_style[DocumentApp.Attribute.FOREGROUND_COLOR] = '#999999';
title_style[DocumentApp.Attribute.FONT_SIZE] = 18;
title_style[DocumentApp.Attribute.MARGIN_TOP] = 5;  // DOESN'T WORK  
title_text.setAttributes(title_style);

然而,这有效:

title_text.setSpacingBefore(5);

b)尝试更改表格的背景颜色(结果:段落的背景颜色发生变化,而不是表格):

another_table_style = {};
another_table_style[DocumentApp.Attribute.BACKGROUND_COLOR] = "#cfe2f3";
var another_table = body.appendTable(some_cells);
another_table.setAttributes(another_table_style);

1 个答案:

答案 0 :(得分:2)

您需要注意文档 - 某些属性仅适用于某些元素。例如,填充枚举仅适用于表单元,而不是整个表。

要对整个表应用更改,可以遍历表格单元格并应用计算的填充(或静态)。

奖金1 - 不确定。工作表中的属性在Range元素上单独设置。

Bonus 2 - 列是行的子项。因此,要迭代,您需要使用两个循环。您可以使用枚举设置TABLE_CELL元素的背景。

function table() {
  var doc = DocumentApp.getActiveDocument();
  var body = doc.getBody();

  var cells = [['Row 1.1', 'Row 1.2'], ['Row 2.1','Row 2.2']];

  var header_table = body.insertTable(0, cells);

  var styles = {};
  styles[DocumentApp.Attribute.PADDING_BOTTOM] = 20; // only applies to table cells
  styles[DocumentApp.Attribute.BACKGROUND_COLOR] = "#00ffff"


  Logger.log(header_table.getType());
  var rows = header_table.getNumRows();

  Logger.log(rows); // check the number of rows in your table

  // for each row...
  for(var i=0; i<rows; i++) {

    // for each column...
    var cols = header_table.getRow(i).getNumChildren();

    for(var j=0; j<cols; j++) {
      var cell = header_table.getRow(i).getCell(j);

      // Set the TableCell attributes to each
      cell.setAttributes(styles)
    }
  }
}

我测试了MARGIN枚举,我认为它们仅适用于文档Body,这与文档略有不同。

function setMargins() {
  var body = DocumentApp.getActiveDocument().getBody();

  var margins = {};

  margins[DocumentApp.Attribute.MARGIN_TOP] = 150;
  margins[DocumentApp.Attribute.MARGIN_LEFT] = 150;

  // uncomment the next line to set margins on the document body.
//  body.setAttributes(margins);

  // this returns all text elements in the doc, even those in tables
  var pars = body.getParagraphs(); 

  // According to the docs, this should work, but it doesn't.
  for(var i=0; i<pars.length; i++) {
    pars[i].setAttributes(margins);
  }
}