0

我正在从模板创建文档,但无法弄清楚如何在正确的位置插入表格。

我在内存中有一个二维数组的表,在模板中我有这样的占位符(包括方括号):

... [表 1] ... [表 2] ... [表 3] ...

这些占位符中的每一个都位于 1x1 表中。

我已经设法将我的第一个数组插入到正确的位置,但是当我搜索以下占位符时,我的数组总是被插入到表 1 之后。

我的代码如下(我在网上找到并稍作修改):

function insertTable(targetdoc, stringToReplace, tableValues) {
  var body = targetdoc.getBody();     
  var searchElement  = targetdoc.getActiveSection();
  var searchType = DocumentApp.ElementType.TABLE;
  var searchHeading = DocumentApp.ElementType.TABLE_CELL;
  var searchResult = null;

  // Search until the table is found.
  while (searchResult = searchElement.findElement(searchType, searchResult)) {
    var par = searchResult.getElement().asTable();
    var tabletext = par.getText();
    var substr=tabletext.search(stringToReplace);
    if (substr >0 ) {
      var childindex = body.getChildIndex(par);
      var oTable = body.insertTable(childindex+1, tableValues);
      return oTable;
    }
  }
}

调用代码是:

var oTable   = insertTable(oOutputFile,"["+cFieldID+"]",aTable);

其中 oOutputfile 是新文档,cFieldID 是占位符文本,aTable 是二维数组。

谁能帮我让它工作,以便将每个数组插入正确的位置?

谢谢

4

2 回答 2

0

我写了一些非常相似的东西,可能对你有用,请参阅GAS 模板引擎

它将接受任何 JSON 字符串并替换文档中与 JSON 结构匹配的占位符。当遇到数组时,脚本会在表格中查找占位符,并为数组的每个元素创建表格行。

因此,如果您的 JSON 字符串包含如下数组:

var json = { myarr : [ { col1: "a", col2 : "b" }, { col1 : "c", col2 : "d" }] }

然后脚本将在模板文档中查找如下所示的表:

------------------------------------------------------
| $myarr.col1         |  $myarr.col2                  |
-------------------------------------------------------

并将其转换为:

-----------------------------------
| a         |  b                  |
-----------------------------------
| c         |  d                  |
-----------------------------------

它也将保留行的格式。

这只是模板引擎的概念证明,但应该足以解决您的问题。

于 2013-08-10T22:36:53.107 回答
0

感谢 koma 提供的解决方案,我将来肯定会使用它,但是对于我正在寻找的东西来说这有点矫枉过正。

最后,我在一个庞大的调试会话之后找到了我需要的解决方案,我上面显示的功能现在变成了:

function insertTable(targetdoc, stringToReplace, tableValues) {
  var oDoc   = targetdoc.getBody();                    // Document
  var oSR    = oDoc.findText(stringToReplace);         // SearchResult
  var oPara  = oSR.getElement().asText().getParent();  // Paragraph
  var nIndex = oDoc.getChildIndex(oPara);              // Index
  var oTable = oDoc.insertTable(nIndex, tableValues);  // Table
  return oTable;
}

因此,例如,如果我有一个带有以下占位符的文档(oDoc)

[TABLE 1]

数组

aData: {{"","column 1","column 2"},{"row 1","data 11","data 12"},{"row 2","data 21","data 22"}}

和一个变量

cFieldID = "TABLE 1"; 

并调用我的函数

oTable = insertTable(oDoc, cFieldID, aData);
oOutputFile.replaceText("\\["+cFieldID+"\\]","");

我获得以下代替占位符文本

-----------------------------------
|       |  column 1  |  column 2  |
-----------------------------------
| row 1 |   data 11  |   data 12  |
-----------------------------------
| row 2 |   data 21  |   data 22  |
-----------------------------------

这不如 koma 的解决方案通用和强大,但足以满足我现在的需要。

克里斯

于 2013-08-28T10:49:41.230 回答