【问题标题】:google doc script, search and replace text string and change font (e.g., boldface)google doc 脚本,搜索和替换文本字符串并更改字体(例如,粗体字)
【发布时间】:2015-10-19 01:31:07
【问题描述】:

我是谷歌文档脚本的新手。

在谷歌文档中,我需要搜索几个文本字符串(例如,lightface 字体的“student 1”)以将这些文本字符串替换为另一个文本字符串(例如,“Student A” ),但使用 粗体 字体。

要搜索和替换,我使用以下代码:

function docReplace() {

  var body = DocumentApp.getActiveDocument().getBody();
  // change "student 1" to "Student A" in boldface
  body.replaceText("student 1", "Student A");

}

上面的代码仅使用 google doc 的当前字体将“student 1”替换为“Student A”,但我不知道如何将字体从 lightface 更改为粗体。

我试过了

body.replaceText("student 1", "<b>Student A</b>");

当然,上面的代码不起作用。

任何帮助将不胜感激。谢谢。

【问题讨论】:

    标签: google-apps-script google-docs


    【解决方案1】:

    用粗体字的新文本字符串(例如“Student A”)替换在 google 文档中出现多次的文本字符串(例如“student 1”)的简单方法,是两个步骤:

    1- 编写一个函数(称为 docReplace)以常规/普通字体(无粗体)进行搜索和替换:

    function docReplace() {
    
      var body = DocumentApp.getActiveDocument().getBody();
      // change "student 1" to "Student A"
      body.replaceText("student 1", "Student A");
    
    }
    

    2- 编写一个函数(例如,boldfaceText)来搜索所需的文本(例如,“学生 A”)和该文本的两个偏移值(即 startOffset 和 endOffsetInclusive)在每次出现时将这些偏移值内的字符的字体设置为粗体:

    function boldfaceText(findMe) {
    
      // put to boldface the argument
      var body = DocumentApp.getActiveDocument().getBody();
      var foundElement = body.findText(findMe);
    
      while (foundElement != null) {
        // Get the text object from the element
        var foundText = foundElement.getElement().asText();
    
        // Where in the Element is the found text?
        var start = foundElement.getStartOffset();
        var end = foundElement.getEndOffsetInclusive();
    
        // Change the background color to yellow
        foundText.setBold(start, end, true);
    
        // Find the next match
        foundElement = body.findText(findMe, foundElement);
      }
    
    }
    

    上面的boldfaceText 代码的灵感来自Finding text (multiple times) and highlighting 中的代码。

    一个字符的偏移值只是描述该字符在文档中的位置的整数,第一个字符的偏移值为 1(它类似于字符的坐标)。

    使用“Student A”作为调用函数boldfaceText的参数,即,

    boldfaceText("Student A");
    

    可以嵌入到函数docReplace中,即

    function docReplace() {
    
      var body = DocumentApp.getActiveDocument().getBody();
      // change "student 1" to "Student A"
      body.replaceText("student 1", "Student A");
    
      // set all occurrences of "Student A" to boldface
      boldfaceText("Student A");
    
    }
    

    在 google 文档中,只需运行脚本 docReplace 即可将所有出现的“student 1”更改为粗体显示的“Student A”。

    上述两个函数(docReplace 和boldfaceText)可能是向新手(如我)介绍谷歌文档脚本的好方法。在使用 google doc 脚本熟悉了一段时间后,学习 Robin 更优雅、更高级的代码,它可以同时完成上述两个步骤。

    【讨论】:

    • 干得好,卢克,这个解决方案一点也不落后,如果你不考虑 cmets,它可能会花费你相同数量的行。做好工作,为自己找到这个问题,我相信你从我的解决方案中学到了比你更多的东西(我自己学到了很多,因为我还没有为谷歌文档编写任何宏,所以我的解决方案可以可能也被优化了)。我只是想请您接受我们的一个回答(无论您认为哪个更好)作为答案,以便将来的人们能够轻松地走上正轨。
    • 感谢罗宾,感谢您的 cmets。我会偏向于选择“更好”的答案,因为我需要一段时间才能理解您的代码。如果您可以指向一些网页来解释您的编码中某些元素的语法,例如“new RegExp(output,"g")”、“re.exec(text)”,那么学习您的代码将非常有帮助、“index.index”等。我的猜测是可以在 Java Script (JS) 语言中找到语法。也许你有一些从哪里开始学习 JS 的好建议。谢谢。
    • 如果您认为自己的方式更容易理解,那么使用接受您的答案是合理的。最好的学习方法是有一个项目并尝试让它发挥作用。不要气馁,JS 和 GAS 有一千种方法可以做一件事,这使它们非常具有表现力,但有时也会令人困惑,所以如果您看到的解决方案与您的想法不同,请不要气馁。 GAS 参考有一些优秀的指南 (developers.google.com/apps-script/overview) 对于一般的 Javascript,你可以试试 codeacademy。希望这会有所帮助
    • 嗨罗宾,根据你的建议,我在stackoverflow.com/questions/33294140/… 的谷歌文档中启动了一个将句子大写的项目,但过了一会儿就卡住了。也许你可以帮忙。谢谢。
    【解决方案2】:

    用一个字符串替换另一个字符串可以通过简单的查找和替换来完成。

    将它们设置为粗体有点困难,因为您必须获取正文的文本元素,并且还要找到每个单词出现的开始和结束位置。

    由于 JS 中的正则表达式不返回匹配数组,而是返回当前匹配的属性数组,因此您必须循环遍历该函数,该函数始终在最后一次匹配之后开始。

     function docReplace(input, output) {
      var re = new RegExp(output,"g");
      var body = DocumentApp.getActiveDocument().getBody();
      body.replaceText(input, output);
    
      var text = body.getText();
      var index;
      while(true){
        index = re.exec(text)
        if(index == null){break}
        body.editAsText().setBold(index.index, output.length + index.index, true);
      }
    }
    

    【讨论】:

    • 谢谢,罗宾。附加 .setBold(true) 的问题是整个文档都设置为粗体,这 不是 我想要的。我只想将替换文本“Student A”设置为粗体,而文档中的其余文本保持不变。
    • 请检查更新后的函数,它将输入转换为输出并将所有出现的地方都加粗。
    • 谢谢,罗宾。您的新代码更加优雅和先进,我不知道如何使用它。我在您的代码中看不到任何可以用粗体字“Student A”替换文本“student 1”的地方。也许,我应该将输入设置为“学生 1”并将输出设置为“学生 A”。是的,没错,我明白了。你的代码确实有效。
    • 在我看到 Robin 的新代码之前,我已经找到了一种更普通的方式(不像 Robin 的那样优雅和先进)来实现相同的目标,并将在这里为像我这样的新手记录。我需要花一些时间来剖析 Robin 的代码,以便理解并从他的代码中学习。
    • 是的,我的函数带参数,所以你可以用任何其他粗体字符串替换任何字符串,我忘了提。
    猜你喜欢
    • 2013-08-02
    • 1970-01-01
    • 2018-04-15
    • 1970-01-01
    • 2023-02-02
    • 2017-12-18
    • 1970-01-01
    • 2015-05-10
    • 1970-01-01
    相关资源
    最近更新 更多