Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 谷歌文档脚本,在不删除其他属性的情况下大写句子_Javascript_Regex_Google Apps Script_Google Docs_Google Apps - Fatal编程技术网

Javascript 谷歌文档脚本,在不删除其他属性的情况下大写句子

Javascript 谷歌文档脚本,在不删除其他属性的情况下大写句子,javascript,regex,google-apps-script,google-docs,google-apps,Javascript,Regex,Google Apps Script,Google Docs,Google Apps,我想创建一个脚本,使谷歌文档中的句子大写,但不改变某些单词中的现有属性。例如,在谷歌文档中,会有几个段落,每个段落都有几个句子。在这样的谷歌文档中,会有超链接、黑体字、斜体字、下划线等。我希望所有这些属性保持不变;脚本应仅大写句子,而不删除这些单词的现有属性 我写了下面的GoogleDoc脚本,它完成了句子大写的工作,但是脚本删除了上面提到的其他单词(超链接、粗体、斜体、下划线)中的所有属性 function cap12() { // define function "replacemen

我想创建一个脚本,使谷歌文档中的句子大写,但不改变某些单词中的现有属性。例如,在谷歌文档中,会有几个段落,每个段落都有几个句子。在这样的谷歌文档中,会有超链接、黑体字、斜体字、下划线等。我希望所有这些属性保持不变;脚本应仅大写句子,而不删除这些单词的现有属性

我写了下面的GoogleDoc脚本,它完成了句子大写的工作,但是脚本删除了上面提到的其他单词(超链接、粗体、斜体、下划线)中的所有属性

function cap12() {

  // define function "replacement" to change the matched pattern to uppercase
  function replacement(match) { return match.toUpperCase(); }

  // define regex "period, followed by zero or any number 
  // of blank spaces, followed by any lowercase character"
  var regex1 = "(^|\.)(\s*)[a-z]";
  var regex2 = /(^|\.)(\s*)[a-z]/;
  // Logger.log(regex1, regex2);

  // get text matching pattern "regex"
  var body = DocumentApp.getActiveDocument().getBody();
  var foundElement = body.findText(regex1);
  // Logger.log(foundElement);

  while (foundElement != null) {
    // Get the text object from the element
    var foundText = foundElement.getElement().asText();   

    // capitalize the character after the period   
    var str1 = foundText.getText();
    var str2 = str1.replace(regex2, replacement);
    foundText.setText(str2);

    // Find the next match
    foundElement = body.findText(regex1, foundElement);
  }

}
我感谢任何人帮我指出我的错误。多谢各位

注意:上面的脚本cap12是我的项目的延续,我的项目是开发一个谷歌脚本,将文章中记录的句子大写。这篇文章中的最后一个脚本cap7只对所选文本进行了局部处理(即,不覆盖整个文档),还删除了所有属性,如超链接、粗体、斜体和下划线

通过阅读右栏中列出的相关帖子,或多或少是随机的,也许是出于本能,我偶然发现了一个很好的脚本,很可能是由专业人士编写的,新手(像我一样)可以从中学到很多东西。所以我在下面描述了我所做的,以防有人感兴趣

从我现在的帖子标题相关的帖子中,我注意到了另一篇相关的帖子,里面有一个非常好的代码。一开始,通过阅读讨论,我认为我必须试着理解作者在答案中发布的代码

然后我注意到一句话“下面的脚本是文档附加组件的一部分,源代码在,
changeCase.js
中可用”(我仍然需要了解“gist”的含义;与GitHub相关的内容。好的,“gist”在文章中有解释。)

因此,我查看了链接,确实找到了脚本
changeCase.js
,它几乎包含了我试图开发的内容(即“句子案例”;下面描述了一些问题):

这是一个惊人的代码;我需要很长时间才能达到这个水平来开发这样的代码

我在我的google文档中安装了脚本
changeCase.js
,关闭google文档重新打开它以激活插件
changeCase.js
。然后我测试了“句子案例”选项;脚本工作得很好,因为我可以选择我想要大写句子的文本,避免使用黑体、斜体、下划线等特殊格式的单词

但是当我选择包含粗体字(和/或斜体字和/或下划线)的文本时,粗体字属性将被删除(与我想要解决的问题完全相同)。因此,脚本
changeCase.js
并没有解决我的问题,而是提供了一种解决方法

脚本
changeCase.js
只对所选文本起作用,而我的帖子中的脚本
cap7
对整个段落起作用,尽管我只选择了段落的一部分

换句话说,我可以修改脚本
cap7
,作为脚本
changeCase.js
的“句子大小写”选项。我认为问题在于我在所选文本中进行了“全局”搜索和替换,而不是“局部”搜索和替换

脚本
changeCase.js
的“句子大小写”选项的一个问题是,它将所选文本中的所有字符都转换为小写,这不是我想要的,因为我想保留大写字符(例如人名等)。我只想将所选文本中的句子大写,而不修改这些句子中的任何内容

要执行上述操作,只需删除代码中的方法“toLowerCase”:

// https://stackoverflow.com/a/19089667/1677912
function _toSentenceCase (str) {
  var rg = /(^\s*\w{1}|\.\s*\w{1})/gi;
  return str.toLowerCase().replace(rg, function(toReplace) {
    return toReplace.toUpperCase();
  });
}
i、 e.使用以下修改后的代码:

function _toSentenceCase (str) {
  var rg = /(^\s*\w{1}|\.\s*\w{1})/gi;
  return str.replace(rg, function(toReplace) {
    return toReplace.toUpperCase();
  });
}
成功了

脚本
changeCase.js
的另一个问题是,它一次只能处理一个段落,效率不高

我想开发一个脚本,可以处理整个文档,并且不删除现有属性(超链接、粗体、斜体、下划线)


如果有人能在帖子中指出我脚本
cap12b
中的错误/问题,我将不胜感激。

在这种情况下,您是否尝试直接使用正文的editAsText()属性进行替换?您可以在替换文本之前运行方法来扫描属性。感谢您的输入。我不确定我是否理解您在使用方法“editAsText()”方面的想法,但我确实看到我的代码中没有方法“editAsText()”。我将尝试在代码中包含此方法。你的第二句话有点晦涩;在使用方法“setText”之前,您建议运行哪种方法来扫描属性?可能是方法“getAttributes()”或方法“getAttributeIndices()”?我将尝试其中一些,并将在本页中报告结果。再次感谢您的提示。请注意,通常在保留格式的同时替换文本是不正确的。如果你想用“somenewthing”来代替“somenewthing”,谁知道“somenewthing”应该有什么风格呢。但当然,在您要替换的内容始终具有统一属性的情况下,您希望替换内容保留这些属性。我正在研究一种可以替换文本的东西,我发现很难不丢失格式。我希望至少我能够调用
attrs=text.getAttributes(startPos);text.deleteText(startPos,endPos);text.insertText(startPos,newText);text.setAttributes(startPos、startPos+new
function _toSentenceCase (str) {
  var rg = /(^\s*\w{1}|\.\s*\w{1})/gi;
  return str.replace(rg, function(toReplace) {
    return toReplace.toUpperCase();
  });
}