【问题标题】:How to change only the *selected* text to uppercase, not the entire paragraph in which the selection exists如何仅将 *selected* 文本更改为大写,而不是选择所在的整个段落
【发布时间】:2014-07-19 18:40:35
【问题描述】:

在 Google 文档中,此函数将所选文本更改为黑色

function selectedFontColorBlack() {
//   DocumentApp.getUi().alert('selectedFontColorBlack');
   var sel = DocumentApp.getActiveDocument().getSelection();
   var elements = sel.getRangeElements();
   for (var i = 0; i < elements.length; i++) {
      var element = elements[i];

      // Only modify elements that can be edited as text; skip images and other non-text elements.
      if(element.getElement().editAsText) {
         var text = element.getElement().editAsText();

       // Bold the selected part of the element, or the full element if it's completely selected.
       if (element.isPartial()) {
         text.setForegroundColor(element.getStartOffset(), element.getEndOffsetInclusive(), "#000000");
       } else {
         text.setForegroundColor("#000000");
       }
     }
   }
}

此函数将光标(或选择)所在的整个段落更改为大写:

function uppercaseSelected() {
//  DocumentApp.getUi().alert('uppercaseSelected');
   var sel = DocumentApp.getActiveDocument().getSelection();
   var elements = sel.getRangeElements();
   for (var i = 0; i < elements.length; i++) {
      var element = elements[i];

      // Only modify elements that can be edited as text; skip images and other non-text elements.
      if(element.getElement().editAsText) {
         var text = element.getElement().editAsText();
         text.setText(text.getText().toUpperCase());
       }
   }
}

我没有看到任何对应的setText 函数适用于选择的“偏移”,setForegroundColor(Integer,Integer,String) 也是如此。 (这两个函数都在 Text 类中。)

如何将实际选择的文本改为大写,而不是选择所在的整个段落?

谢谢。

【问题讨论】:

    标签: javascript google-apps-script google-docs google-docs-api


    【解决方案1】:

    尝试使用setAttributes(startOffset, endOffsetInclusive, attributes) 方法。查看the documentation [编辑:我的错,我不认为那会做。我会看起来更长一点]
    @Mogsdad 所指的帖子中隐藏的宝石是:var selectedText = elementText.substring(startOffset,endOffset+1);
    关于如何使用它更详细一点:您可以在 DocumentApp.getActiveDocument().getSelection().getSelectedElements()[i].getElement().editAsText().getText() 等对象上使用字符串方法 substring 所以,本质上,抓取该子字符串,将其转换为大写,删除(selectedElement.getstartOffset,selectedElement.endOffsetInclusive) 范围内的文本并将粗体文本插入selectedElement.getstartOffset

    多田!看看吧:

    function uppercaseSelected() {
       // Try to get the current selection in the document. If this fails (e.g.,
       // because nothing is selected), show an alert and exit the function.
       var selection = DocumentApp.getActiveDocument().getSelection();
       if (!selection) {
          DocumentApp.getUi().alert('Cannot find a selection in the document.');
          return;
       }
    
       var selectedElements = selection.getSelectedElements();
       for (var i = 0; i < selectedElements.length; ++i) {
          var selectedElement = selectedElements[i];
    
          // Only modify elements that can be edited as text; skip images and other
          // non-text elements.
          var text = selectedElement.getElement().editAsText();
    
          // Change the background color of the selected part of the element, or the
          // full element if it's completely selected.
          if (selectedElement.isPartial()) {
            var bitoftext = text.getText().substring(selectedElement.getStartOffset(), selectedElement.getEndOffsetInclusive() + 1);
            text.deleteText(selectedElement.getStartOffset(), selectedElement.getEndOffsetInclusive());
            text.insertText(selectedElement.getStartOffset(), bitoftext.toUpperCase());
          }  else  {
            text.setText(text.getText().toUpperCase());
          }
       }
    }
    

    【讨论】:

    • 这似乎是我需要的一些其他东西,所以很好的信息。
    • 我还没弄明白!这是一个非常沙盒化的 API
    • 这很好用,只要选择不跨越多个段落。不过,这实际上可能是一个可以接受的解决方案。我想知道是否可以通过多段选择来完成这项工作。不管怎样,这绝对是我需要的!谢谢。
    • @alliteralmind 我修复了它。 else 代码块的内容被破坏
    • 是的!做到了。非常感谢@danaymachine。
    【解决方案2】:

    Google App script Document App get selected lines or words? 的代码开始,大约一年前就完成了。如果对你有帮助,我很高兴。

    “诀窍”是您需要删除原始文本并插入转换后的文本。

    此脚本生成一个菜单,其中包含 UPPER、lower 和 Title Case 选项。由于删除/插入,处理多个段落需要特别注意。我把它留给你了!

    function onOpen() {
      DocumentApp.getUi().createMenu('Change Case')
        .addItem("UPPER CASE", 'toUpperCase' )
        .addItem("lower case", 'toLowerCase' )
        .addItem("Title Case", 'toTitleCase' )
        .addToUi();
    }
    
    function toUpperCase() {
      _changeCase(_toUpperCase);
    }
    
    function toLowerCase() {
      _changeCase(_toLowerCase);
    }
    
    function toTitleCase() {
      _changeCase(_toTitleCase);
    }
    
    function _changeCase(newCase) {
      var doc = DocumentApp.getActiveDocument();
      var selection = doc.getSelection();
      var ui = DocumentApp.getUi();
      var report = "";  // Assume success
    
      if (!selection) {
        report = "Select text to be modified.";
      }
      else {
        var elements = selection.getSelectedElements();
        if (elements.length > 1) {
          report = "Select text in one paragraph only.";
        }
        else {
          var element = elements[0].getElement();
          var startOffset = elements[0].getStartOffset();      // -1 if whole element
          var endOffset = elements[0].getEndOffsetInclusive(); // -1 if whole element
          var elementText = element.asText().getText();       // All text from element
          // Is only part of the element selected?
          if (elements[0].isPartial())
            var selectedText = elementText.substring(startOffset,endOffset+1);
          else
            selectedText = elementText;
    
          // Google Doc UI "word selection" (double click)
          // selects trailing spaces - trim them
          selectedText = selectedText.trim();
          endOffset = startOffset + selectedText.length - 1;
    
          // Convert case of selected text.
          var convertedText = newCase(selectedText);
          element.deleteText(startOffset, endOffset);
          element.insertText(startOffset, convertedText);
        }
      }
      if (report !== '') ui.alert( report );
    }
    
    function _toUpperCase(str) {
      return str.toUpperCase();
    }
    
    function _toLowerCase(str) {
      return str.toLowerCase();
    }
    
    // https://stackoverflow.com/a/196991/1677912
    function _toTitleCase(str)
    {
        return str.replace(/\w\S*/g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();});
    }
    

    【讨论】:

      猜你喜欢
      • 2011-09-02
      • 1970-01-01
      • 2013-09-30
      • 1970-01-01
      • 1970-01-01
      • 2019-04-06
      • 1970-01-01
      • 1970-01-01
      • 2021-10-29
      相关资源
      最近更新 更多