【问题标题】:How to embolden specific text within multiple instances of parentheses in Google Apps Script?如何在 Google Apps 脚本的多个括号实例中加粗特定文本?
【发布时间】:2019-11-26 07:29:34
【问题描述】:

我一直在尝试编写一个 Google Apps 脚本来搜索文档并更改括号的所有实例(包括括号本身):

Hello (C)world, nice to (D)meet you, You are (G) my sunshine, my (Em)only sunshine.

到这里:

Hello **(C)**world, nice to **(D)**meet you, You are **(G)** my sunshine, my **(Em)** only sunshine.

我已经成功地做到了:

function onOpen() {
  DocumentApp.getUi()
      .createMenu('Utilities')
      .addItem('Bold Parentheses', 'replaceParentheses')
      .addToUi();
};

function replaceParentheses() {
  var body = DocumentApp.getActiveDocument().getBody();      

  var found = body.findText("\\(.+?\\)");
  while (found) {
    var elem = found.getElement();
    if (found.isPartial()) {
      var start = found.getStartOffset();
      var end = found.getEndOffsetInclusive();
      elem.setBold(start, end, true);
    }
    else {
      elem.setBold(true);
    }
    found = body.findText("\\(.+?\\)", found);
  }
};

但我想知道是否有更有效的方法来做到这一点。

我正在使用它来增加括号中的和弦名称......所以如果歌词中有呼叫和响应,并且某些歌词周围有括号 - 我将如何排除这些括号?换句话说,我怎样才能使一组变量总是像 (A,B,C,A#,B#,C#,Ab,Bb,Cb,Am,Bm,Cm,Adim7,Bb7add9, etc) 一样加粗

【问题讨论】:

    标签: regex google-apps-script parentheses


    【解决方案1】:

    您的代码可以很好地将括号内的所有内容加粗。但是,如果您想设置一个应该加粗的变量列表而忘记其余的,您可以尝试创建和排列并将其插入正则表达式。

    您可以像这样更改您的代码:

    function replaceParentheses() {
      var body = DocumentApp.getActiveDocument().getBody();  
      var targetVariables = ['A', 'B', 'C', 'A#']
    
      var searchPattern = "\\([" + targetVariables.join("|") + "].?\\)"
    
    
      var found = body.findText(searchPattern);
      while (found) {
        var elem = found.getElement();
        if (found.isPartial()) {
          var start = found.getStartOffset();
          var end = found.getEndOffsetInclusive();
          elem.setBold(start, end, true);
    
        }
        else {
          elem.setBold(true);
        }
        found = body.findText(searchPattern, found);
      }
    };
    

    考虑到现在您只匹配 targetVariables 内部的值,例如:

    你好 (Caa)world (C) (A#),很高兴 (D) 认识你,你是 (G) 我的阳光,我 (Em) 唯一的阳光。

    将被转换为:

    Hello (Caa)world (C) (A#),很高兴(D)认识你,你是(G)我的阳光,我的(Em)唯一阳光。

    【讨论】:

    • 上面的代码非常适合加粗两个字母。通过反复试验,我在 searchPattern 变量中的句点和问号之间添加了一个“+”,以使所有和弦无论有多少字符都加粗。就像这样var searchPattern = "\\([" + targetVariables.join("|") + "].+?\\)" 所以谢谢你!现在我的问题是:是否有更有效的方法以编程方式将 Maj,m,#,b,dim,dim7,(b5) 等添加到字母 A-G 而不是在 targetVariables 变量中写入每个可能的和弦名称?例如。 Am、Amaj7、E#(b5)9 等
    • 我真的不知道和弦是如何工作的,但如果你知道所有的字母和所有可能的附录,你可以为嵌套循环创建并轻松解决这个问题。创建一个包含所有字母 ['A', 'B', 'C', 'D', 'E', 'F', 'G'] 的数组和一个包含所有附录 ['Maj','m','#','b','dim','dim7'] 的数组,并在嵌套循环中连接所有可能性。如果您仍有疑问,您应该提出一个新问题,以便正确回答。
    • 谢谢@raserhin,我将把它作为一个单独的问题发布。你完全回答了我的问题,我感谢你。我喜欢通过示例学习,所以这非常有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    • 2014-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多