我想创建一个脚本来大写google doc中的句子,但不会改变某些单词中的现有属性。例如,在谷歌文档中,会有几个段落,每个段落都有几个句子。在这样的谷歌文档中,会有超链接,粗体中的单词,斜体中的单词,带下划线的单词等。我希望所有这些属性保持不变;脚本应该只对句子进行大写,而不删除这些单词的现有属性。
我编写了以下google doc脚本,它完成了大写句子的工作,但脚本删除了上面提到的其他单词(超链接,粗体,斜体,下划线)中的所有属性。
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是我的项目的延续,用于开发一个google脚本来大写句子,如帖子google doc script to capitalize sentences中所述。本文中的最终脚本cap7仅在所选文本上本地工作(即不在整个文档上),但也删除了所有属性,如超链接,粗体,斜体,下划线。
通过阅读右栏中列出的相关帖子,或多或少随机的方式,或许本能地引导,我偶然发现一个可能由专业人士写的好剧本,新手(像我一样)可以从中学到很多东西。所以我描述了我在下面做了什么,以防有人感兴趣。
来自帖子,与我目前的帖子相关,标题为Google Apps Script/Javascript search and replace with regex not working,我注意到另一篇相关帖子Find and change unknown strings to UPPERCASE in Google Apps Script Document using JS,其中Mogsdad发布了一个非常好的代码。首先,通过讨论阅读,我认为我必须尝试理解Mogsdad在答案中发布的代码。
然后我注意到句子“以下脚本是文档加载项的一部分,this gist中可用changeCase.js
中的源代码。” (我仍然需要找出“gist”的意思;与GitHub有关的东西。好的,“gist”在帖子What is the difference between github and gist? [closed]中有解释。)
所以我查看了链接this gist,实际上我发现脚本changeCase.js
包含ALMOST我正在尝试开发的内容(即“句子案例”;下面描述了一些问题):
changeCase.js - Document add-in, provides case-change operations in the add-in Menu.
onOpen - installs "Change Case" menu
_changeCase - worker function to locate selected text and change text case. Case conversion is managed via callback to a function that accepts a string as a parameter and returns the converted string.
helper functions for five cases
UPPER CASE
lower case
Title Case
Sentence case
camelCase
Fountain-lite, screenplay formatting - see http://fountain.io/
这是一个了不起的代码;我需要很长时间才能达到这个水平来开发这样的代码。
我在我的google doc中安装了脚本changeCase.js
,关闭了google doc再次重新打开它以激活加载项changeCase.js
。然后我测试了“句子案例”选项;该脚本工作得很好,我可以选择我希望将句子大写的文本,避免使用特殊格式的单词,如粗体,斜体,下划线等。
但是当我选择包含粗体字(和/或斜体字和/或下划线)的文本时,则会删除粗体属性(与我想要解决的问题完全相同)。所以脚本changeCase.js
没有解决我的问题,但提供了解决方法。
脚本changeCase.js
仅在所选文本上本地工作,而我的帖子google doc script to capitalize sentences中的脚本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();
});
}
即使用以下修改后的代码:
function _toSentenceCase (str) {
var rg = /(^\s*\w{1}|\.\s*\w{1})/gi;
return str.replace(rg, function(toReplace) {
return toReplace.toUpperCase();
});
}
它有效。
脚本changeCase.js
的另一个问题是它一次只能处理一个段落,效率不高。
我想开发一个可以处理整个文档的脚本,而不需要删除现有属性(超链接,粗体,斜体,下划线)。
如果有人可以在帖子google doc script, attributes (bold, italics, underline) not shown in log中的帖子cap12b
中指出错误/问题,我们将不胜感激。