有没有人举例说明我们如何/如果我们可以在应用脚本生成的 Google 文档中的 TableCell (?) 元素上设置行/列跨度?
这是否需要使用 .setAttributes() 方法来完成?
有没有人举例说明我们如何/如果我们可以在应用脚本生成的 Google 文档中的 TableCell (?) 元素上设置行/列跨度?
这是否需要使用 .setAttributes() 方法来完成?
不,目前没有办法做到这一点。我也没有在问题跟踪器上看到功能请求。
对象上有一个.merge()
方法TableCell
,听起来很有希望。然而,当它被使用时,它通过将“当前”TableCell 的内容附加到“前一个”对象,然后删除“当前”对象,将“当前”TableCell 对象与“前一个”同级 TableCell 对象组合在一起。
我修改了先前答案中的代码以进行实验.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;
}
}
}
我发现了这个问题,因为我想摆脱表格中的 RowSpan 并搜索“如何将 RowSpan 或 ColSpan 设置为 1.
正如你所做的那样,我不得不意识到没有办法对 TableCell 的这些隐藏属性进行可写访问。
但在我的研究中,我找到了这个问题的答案。这是一个不舒服的解决方法,但是一旦正确设置,它就会非常好用:
关键是您可以删除一个单元格并将其替换为您之前手动跨越的单元格的深层副本。
如果您有一个包含一些手动创建的跨越单元格的表,例如一个包含 3 行和 3 个单元格的表,您将它们全部跨越,那么您可以制作跨越单元格的深度分离副本并将其插入到另一个表中的任何位置。目标表中插入的单元格将像在源表中一样跨越周围的单元格。
你要知道周围单元格的内容还在,但是看不到。如果您再次删除跨越单元格或手动取消跨越,它们将再次显示。
插入已经跨越的 srcCell 的效果与您将 3x3 单元格重叠在目标表上的白纸具有相同的效果。所有的细胞都还在,但你看不到它们。guugel-doc 引擎仅显示跨单元格的内容。
而且这种行为是可以复制的。这不是很好吗?
我知道,这是一个 moloch,如果您必须跨越许多具有许多不同跨越宽度和方向的单元格,但如果您根据需要设计它,那么您可能值得花时间在跨越单元格模式上。
可以创建一个文档,其中仅包含您需要的所有跨单元格的表格。您可以将此文档用作您的“生成单元格源”。
您可以复制以下测试文档,其中包含 3 个表格,并清楚地显示了其背后的原理。第一个表在 tableindex 0,0 处包含一个 3x3 跨越单元格。第二个表将单元格本身中每个单元格的索引保存为行、列对和一个“TestCell”,它应该跨越 3x3 个其他单元格。第三张表仅供比较:
https://docs.google.com/document/d/1G8C2JP_4689RFmtxHZ2djslwoGWwHwieHfbIwr2XzeQ/edit
然后您可以访问绑定脚本,该脚本保留“TestCell”的内容,将其替换为 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 ) );
}
}
我希望,这会有所帮助。
非常感谢您的关注,
理查德
我发现了一个非常笨拙的解决方法,因为colspan
GAS 缺乏......
FlexTable
,Grid
等)colspan
,rowspan
创建一个新表格(具有不同的单元格宽度和高度VerticalPanel
并按顺序添加您在步骤 1-3 中创建的每个表您现在拥有一个带有和特征的表格的外观。colspan
rowspan
不是很优雅,但这是我能想出的唯一解决方案。