您可以通过Google文档中的应用脚本设置rowspan / colspan吗?

时间:2013-03-24 08:22:08

标签: google-apps-script

有没有人举例说明我们如何在Apps脚本生成的Google文档中的TableCell(?)元素上设置行/ colspan?

是否需要使用.setAttributes()方法完成?

3 个答案:

答案 0 :(得分:3)

不,目前无法做到这一点。我也没有在问题跟踪器上看到功能请求。

.merge()对象上有一个TableCell方法,听起来很有希望。然而,当它被使用时,它通过将“当前”TableCell的内容附加到“前一个”TableCell,然后删除“当前”一个,将“当前”TableCell对象与“先前”兄弟TableCell组合。

之前

Before

After

代码

我将代码从a previous answer修改为试验.merge(),现在是:

function mergeExperiment() {
  var folder = "StackOverflow";
  var docname = "Experiment.gdoc";
  var docId = getFileByName_(folder, docname).getId();

  var doc = DocumentApp.openById(docId);
  var docBody = doc.getActiveSection();

  var totalElements = doc.getNumChildren();
  var el=[]
  for( var j = 0; j < totalElements; ++j ) {
    var element = doc.getChild(j);
    var type = element.getType();

    switch (type) {
      case DocumentApp.ElementType.PARAGRAPH:
        break;

      case DocumentApp.ElementType.TABLE:
        var tablerows=element.getNumRows();
        for ( var row = 0; row < tablerows; ++row ) {
          var tablerow = element.getRow(row)
          for ( var cell=0; cell < tablerow.getNumCells(); ++cell) {
            // Experiment - merge two cells in the second row
            if (row==1 && cell==1) {
              tablerow.getChild(cell).merge();
            }
          }
        }
        break;
    }
  }
}

答案 1 :(得分:1)

我发现了一个非常复杂的解决方法,因为GAS中缺少colspan ...

  1. 使用您想要的列/行创建一个表(FlexTableGrid等)
  2. 当您到达您想要使用colspanrowspan的区域时,请创建一个新表格(具有不同的单元格宽度和高度)
  3. 每次要更改单元格宽度或高度时继续创建新表
  4. 创建VerticalPanel并按顺序添加您在步骤1-3中创建的每个表
  5. 您现在拥有包含colspanrowspan功能的单个表的外观

    不是很优雅,但它是我能够提出的唯一解决方案。

答案 2 :(得分:0)

我发现了这个问题,因为我想在表格中删除RowSpan并搜索问题的答案&#34;我如何将RowSpan或ColSpan设置为1。

正如您所做的那样,我必须意识到无法对TableCell的这些隐藏属性进行可写访问。

但在我的研究中,我找到了这个问题的答案。 这是一个令人不舒服的解决方法,但一旦设置正确,它就会非常好用:

关键是你可以删除一个单元格并用一个单元格的深层副本替换它,之后你手动跨越了这个单元格。

如果你有一个带有一些生成单元格的表,手动创建,例如一个包含3行和3个单元格的表格,你可以将它们全部跨越,那么你可以制作一个深度分离的生成单元格副本并将其插入任何位置另一张桌子。目标表中的插入单元格将像在源表中一样跨越周围的单元格。

你必须知道周围细胞的内容仍然存在,但是无法看到。如果再次删除生成单元格或手动执行取消操作,它们将再次显示。

已插入的srcCell的插入效果与在目标表上放置3x3单元重叠白纸的效果相同。 所有细胞仍在那里,但你无法看到它们。 guugel-doc引擎仅显示生成单元格的内容。

可以复制此行为。不是很好吗?

我知道,这是一个moloch,如果你必须跨越许多不同跨度和方向的细胞,但是如果你根据自己的需要设计它,那么你可能需要花费时间用于生成细胞模式

你可以创建一个文档,它只包含所有生成单元格的表格。您可以将此文档用作&#34;生成单元源&#34;。

您可以复制以下测试文档,其中包含3个表格,并清楚地显示其背后的原理。第一个表在tableindex 0,0处拥有一个3x3生成单元格。 第二个表将单元格中每个单元格的索引保存为行,列对和一个&#34; TestCell&#34;,它应该跨越3x3个其他单元格。 第3张表仅供比较:

https://docs.google.com/document/d/1G8C2JP_4689RFmtxHZ2djslwoGWwHwieHfbIwr2XzeQ/edit

然后您可以访问绑定脚本,该脚本保留&#34; TestCell&#34;的内容,将其替换为3倍3生成单元格并再次放回内容。 您将看到以下绑定脚本:

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

function myFunction() {
  var tables   = docBody.getTables();
  var srcTable = tables[ 0 ];
  var dstTable = tables[ 1 ];

  var foundText = docBody.findText( "TestCell" );
  if ( foundText ) {
    //  The cell that should span others
    var dstCell = foundText.getElement().getParent().getParent();

    //  If you want to preserve the contents of the cell
    var cellContents = [];
    var numChildren  = dstCell.getNumChildren();
    for ( var i = 0; i<numChildren; i++ ) {
      cellContents.push( dstCell.getChild( i ).copy() );
    }

    //  Row- and ColumnIndex of the future spanning cell
    var dstRowIndex = dstTable.getChildIndex( dstCell.getParent() );
    var dstColIndex = dstCell.getParent().getChildIndex( dstCell );

    //  Deep, detached copy of an already spanning cell
    var srcCell = srcTable.getCell( 0, 0 ).copy();

    // delete dstCell and insert the deep, detached copy of the spanning cell
    dstCell.removeFromParent();
    dstCell = dstTable.getChild( dstRowIndex ).insertTableCell( dstColIndex, srcCell );

    //  If you preserved the contents of the deleted, non-spanning cell,
    //     you can put them back again
    for ( var i = numChildren-1; i>=0; i-- ) {
      var childType = cellContents[ i ].getType();
      // Do not forget to extend this switch by your other ElementTypes !!!
      switch ( childType ) {
        case DocumentApp.ElementType.PARAGRAPH:
          dstCell.insertParagraph( 0, cellContents[ i ] );
          break;
      }
    }
    //  Get rid of the default single and empty PARAGRAPH of the srcCell,
    //      if you had to put back the contents of the delted non-spanning cell
    dstCell.removeChild( dstCell.getChild( dstCell.getNumChildren() - 1 ) );
  }
}

我希望,这可以提供帮助。

非常感谢你的关注,

理查德