-1

我在 google docs 中使用模板作为信件,我想通过 App Scripts 自动在信件的(动态)标题之后填写信件。是否有任何最佳做法可以将文本始终设置在同一位置?我尝试使用占位符并替换它。但有时我需要多次替换文本。

4

2 回答 2

2

我不知道最佳实践,但您可以使用书签。你不能命名它们,但如果你知道,比如说,第 5 个书签是用户名,然后循环浏览书签,当你到达第 5 个时编辑文本。

前:

在此处输入图像描述

function myFunction() {
  try {
    var doc = DocumentApp.getActiveDocument();
    var bmarks = doc.getBookmarks();
    var position = null;
    var i = 0;
    for( i=0; i<bmarks.length; i++ ) {
      console.log(bmarks[i].getId());
      position = bmarks[i].getPosition();
      position.insertText("i = "+i)
    }
  }
  catch(err) {
    console.log(err);
  }
}

后:

在此处输入图像描述

于 2022-02-07T20:07:06.643 回答
2

在您的情况下,使用 NamedRange 怎么样?参考

使用 NamedRange 时,脚本如下。

示例脚本:

// Create custom menu.
function onOpen() {
  DocumentApp.getUi().createMenu("sample")
    .addItem("1. Install named range", "setNamedRange")
    .addItem("2. Change text by named range", "changeTextByNamedRange")
    .addItem("Delete named range", "deleteNamedRange")
    .addToUi();
}

const nameOfNamedRange = "sample1"; // Please set the name of your named range.

// Set named range.
function setNamedRange() {
  const doc = DocumentApp.getActiveDocument();
  const ele = doc.getCursor().getElement();
  const range = doc.newRange().addElement(ele).build();
  doc.addNamedRange(nameOfNamedRange, range);
}

// Update named range.
function changeTextByNamedRange() {
  const updateText = "updated sample"; // Please set the updated text you want.

  const doc = DocumentApp.getActiveDocument();
  const range = doc.getNamedRanges().find(r => r.getName() == nameOfNamedRange);
  if (!range) {
    throw new Error("No named range. Please install a named range.");
  }
  range.getRange().getRangeElements().forEach(e => e.getElement().asText().setText(updateText));
}

// Delete named range.
function deleteNamedRange() {
  const doc = DocumentApp.getActiveDocument();
  const range = doc.getNamedRanges().find(r => r.getName() == nameOfNamedRange);
  if (!range) return;
  range.remove();
}

用法:

  1. 请将光标设置在要设置命名范围的文档上。
  2. 运行setNamedRange。这样,当前光标的点就被设置为命名范围。
  3. 当您想要更改命名范围的文本时。请运行changeTextByNamedRange。这样,更新的文本将作为替换放置到命名范围中。
    • 在这种情况下,即使更改了段落并且更改了命名范围之前和之后的文本,也可以使用命名范围。

当您要删除命名范围时,请运行deleteNamedRange.

测试:

运行上述脚本时,会得到以下结果。

在此处输入图像描述

参考:

于 2022-02-08T02:34:32.427 回答