如何在插入格式化文本后以编程方式重置格式

How to programatically reset formatting after inserting formatted text

我有一个脚本可以将格式化的文本插入到文档中。有没有办法以某种方式隔离插入文本的格式,以便当用户随后键入“普通”文本时,它会继承自定义格式?

这里是文档脚本的完整代码:

function onOpen (){
  DocumentApp.getUi()
    .createMenu("repro-formatting")
    .addItem("Insert at cursor", "insert")
    .addToUi();
}

function insert(){
  var doc = DocumentApp.getActiveDocument();
  var cursor = doc.getCursor();

  if (!cursor) {
    return;
  }
  
  var value = "###";
  var text = cursor.insertText(value);
  text.setBold(true);
  text.setBackgroundColor("#f9cb9c");
  
  var position = doc.newPosition(text, value.length);
  doc.setCursor(position);
}

我相信你的目标如下。

  • 您想在使用脚本插入格式化文本后重置文本格式。

问题和解决方法:

  • 插入带格式的文本时,好像光标有光标左边的文本格式。因此,例如,它假设以下情况。

    1. 插入 12345 的文本。
    2. 1234 的文本提供自定义格式。在这种情况下,5 是默认的文本格式。
    3. 当光标位于 5 右侧时,当您从此处插入新文本时,文本具有正常文本格式。
    4. 当光标放在 4 的右侧时,当您从此处插入新文本时,文本具有自定义格式的文本。
    5. 当光标放在5的右边并且按下backspace键时(5被backspace键删除。) , 当您从此处插入新文本时,文本具有正常文本格式。
  • 虽然我测试了几种方法,但不幸的是,我无法使用脚本复制按回space键的情况。在上面的示例情况下,当光标放在 5 的右侧并且当 5 被脚本删除时,文本格式无法从自定义格式更改。

  • 当我看到你的示例GIF动画时,在你运行添加脚本和格式化文本之后,你似乎放了一个space并插入了一个文本。如果可以使用这种情况,我认为可能会建议一种解决方法。

在此回答中,我想提出解决方法。在此解决方法中,当插入带格式的文本时,会添加一个 space,它具有插入自定义格式之前的文本格式。这样,在脚本为运行之后插入新文本时,可以插入脚本为运行之前的文本格式的文本。

当此解决方法反映到您的脚本中时,它将变成如下。

修改后的脚本:

function insert() {
  var doc = DocumentApp.getActiveDocument();
  var cursor = doc.getCursor();
  if (!cursor) {
    return;
  }
  var format = cursor.getElement().getAttributes();
  var value = "###";
  value += " ";
  var text = cursor.insertText(value);
  text.setBold(0, value.length - 1, true);
  text.setBackgroundColor(0, value.length - 1, "#f9cb9c");
  var position = doc.newPosition(text, value.length);
  var t = doc.setCursor(position).getCursor().getElement().asText();
  t.setAttributes(t.getText().length - 1, t.getText().length - 1, format);
}
  • 在此解决方法中,使用了以下流程。
    1. 复制光标的文本格式。
    2. 当插入###时,添加了" ",即space。
    3. ### 插入光标并改变光标位置。
    4. 将复制的文本格式粘贴到 ###
      • 至此,文本格式被重置。

结果:

参考: