如何使用 Google Apps 脚本复制和编辑 Google 文档中 table 单元格内的文本数据

How to copy and edit text data inside a table cell in Google Documents using Google Apps Script

我是 Google Apps 脚本的新手,几天来一直被这个问题困扰。在此先感谢那些正在查看此内容并试图帮助我的人。

我正在尝试从某个 table 单元格复制文本数据,用换行符将它们分开并放入变量中,然后在另一个 table 中使用它们。 使用 tablecell.getText() 你会丢失所有格式,所以我想改用段落,但是使用 table 单元格你不能使用 getParagraphs()...

tableCellOut.appendParagraph(tableIn.getRow(1).getChild(1).asParagraph());

我不知道我离目标有多近。 有没有一种方法可以在不丢失格式的情况下编辑文本数据?

我相信你的目标如下。

  • 您想使用 Google Apps 脚本将 table 单元格转换为问题中显示的图像。 (下图来自你的问题。)

为此,这个答案怎么样?我想提出以下示例脚本来解决您的问题。该脚本的流程如下

  1. 检索table。
  2. 检索 table 的单元格“B2”。
    • 这是您的示例图片。
  3. 创建一个包含文本和文本样式的对象。
    • 这用于将值拆分到单元格。
  4. 文本和文本样式设置到单元格。
  5. 当行数小于拆分值的行数时,追加新行,并为单元格设置文本和文本样式。

示例脚本:

请将以下脚本复制并粘贴到Google文档的容器绑定脚本中,并在脚本编辑器中运行实现myFunction的功能。在此脚本中,rowcolumn 分别是行号和列号。所以在你的图像中,请设置 row = 2column = 2。例如,要拆分“C3”单元格时,请设置row = 3column = 3

function myFunction() {
  // 1. Retrieve table.
  const body = DocumentApp.getActiveDocument().getBody();
  const table = body.getTables()[0];
  
  // 2. Retrieve the cell "B2" of the table.
  const row = 2;  // Please set the row number.
  const column = 2;  // Please set the column number.
  const cell = table.getCell(row - 1, column - 1);
  
  // 3. Create an object including the text and text styles. This is used for splitting values to the cells.
  const text = cell.editAsText();
  let temp = [];
  const textRuns = [].reduce.call(text.getText(), (ar, c, i, a) => {
    if (c != "\n") temp.push({text: c, foregroundColor: text.getForegroundColor(i), backgroundColor: text.getBackgroundColor(i), textAlignment: text.getTextAlignment(i), italic: text.isItalic(i)});
    if (c == "\n" || i == a.length - 1) {
      ar.push({text: temp.reduce((s, {text}) => s += text, ""), styles: temp});
      temp = [];
    }
    return ar;
  }, []);
  
  // 4. The text and text styles are set to the cells.
  for (let i = row - 1; i < table.getNumRows(); i++) {
    const t = table.getCell(i, column - 1).editAsText();
    const run = textRuns.shift();
    t.setText(run.text);
    run.styles.forEach((r, j) => {
      t.setBackgroundColor(j, j, r.backgroundColor);
      t.setForegroundColor(j, j, r.foregroundColor);
      t.setItalic(j, j, r.italic);
      if (r.textAlignment) t.setTextAlignment(j, j, r.textAlignment);
    });
  }
  
  // 5. When the number of rows are smaller than the number of rows of splitted values, the new rows are appended and the text and text styles are set to the cells.
  while (textRuns.length > 0) {
    const appendedRow = table.appendTableRow();
    for (let i = 0; i < table.getRow(row - 1).getNumCells(); i++) {
      appendedRow.appendTableCell("");
    }
    const t = appendedRow.getCell(column - 1).editAsText();
    const run = textRuns.shift();
    t.setText(run.text);
    run.styles.forEach((r, j) => {
      t.setBackgroundColor(j, j, r.backgroundColor);
      t.setForegroundColor(j, j, r.foregroundColor);
      t.setItalic(j, j, r.italic);
      if (r.textAlignment) t.setTextAlignment(j, j, r.textAlignment);
    });
  }
}

结果:

当上面的脚本是运行你的初始table时,可以得到如下结果。在此演示中,首先扩展单元格“B2”的值,然后扩展单元格“C3”的值。

注:

  • 此示例脚本是为上述情况准备的。如果您更改了上图的规格,则可能无法使用该脚本。所以请注意这一点。
  • 在此示例脚本中,BackgroundColorForegroundColor 用作文本样式。当你想使用其他文字样式时,请修改上面的脚本。

参考文献: