Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/391.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 使用JS在Google Apps脚本文档中查找未知字符串并将其更改为大写_Javascript_Regex_Google Apps Script - Fatal编程技术网

Javascript 使用JS在Google Apps脚本文档中查找未知字符串并将其更改为大写

Javascript 使用JS在Google Apps脚本文档中查找未知字符串并将其更改为大写,javascript,regex,google-apps-script,Javascript,Regex,Google Apps Script,我在谷歌文档中写下了喷泉降价。喷泉是用来写剧本的。我想通过自动大写某些元素(打开或使用按钮,无论什么),使喷泉中的书写更友好一些 这是一个格式正确的剧本(在fountain中): EXT.加油站-白天 苏西走出她的车,走向车站服务员。 苏西 嘿,汤米。 汤米 苏,你去哪儿了?进来吧。 他们一起向车站入口走去。 国际加油站-夜间 等 正如你所看到的,在剧本创作中有大量的大写字母和大写字母转换的业务,而且变得单调乏味 这就是为什么我想用小写字母(例如,int.gas station-day)编写,

我在谷歌文档中写下了喷泉降价。喷泉是用来写剧本的。我想通过自动大写某些元素(打开或使用按钮,无论什么),使喷泉中的书写更友好一些

这是一个格式正确的剧本(在fountain中):

EXT.加油站-白天
苏西走出她的车,走向车站服务员。
苏西
嘿,汤米。
汤米
苏,你去哪儿了?进来吧。
他们一起向车站入口走去。
国际加油站-夜间
等
正如你所看到的,在剧本创作中有大量的大写字母和大写字母转换的业务,而且变得单调乏味

这就是为什么我想用小写字母(例如,
int.gas station-day
)编写,让javascript/gas查找文本,并将其大写。与角色说话时相同:

苏西 嘿,汤米。 将成为

苏西 嘿,汤米。 说话的字符的名称上方总是有一个空行,下一行是文本。场景标题总是以EXT.或INT开头

到目前为止,我在Stackoverflow上得到了一些帮助,但我仍然在努力让它发挥作用。我得到了一个很好的正则表达式字符串,可以找到字符名,但GAS的正则表达式实现有限。该正则表达式是
[\n][\n]([^\n]+)[\n][^\n |\s]/gi
。我没有运气用正则表达式替换文本。我的JS技能是新生婴儿,但我已经完成了CodeAcademy的初学者JS课程


如果您能在正确的方向上提供帮助,我将不胜感激。

要更改Google文档中的文本,您需要获取各个元素并对其进行操作。在钱花出去之前,有相当多的工作要做,深入研究文件:

paragraphText.toUpperCase();
以下脚本是文档加载项的一部分,源代码位于
changeCase.js

代码.gs
/**
*扫描谷歌文档,应用喷泉语法规则。
*警告:这是一个部分实现。
*
*支持:
*在说话之前先说出字符名。
*
*不支持:
*其他一切。看见http://fountain.io/syntax
*/
功能喷泉(){
//私人助手函数;查找段落的文本长度
函数段落(PAR){
返回PAR.AtExter().GETTrEG()。
}
var doc=DocumentApp.getActiveDocument();
var段落=doc.getBody().getparations();
var numParagraphs=段落长度;
//扫描文件
对于(变量i=0;i 0){
//本段有正文。如果前一段为空,则
//如果有文本,则此段落可能是字符名。
如果((i==0 | | |段落(第[i-1]段))==0)和&(i0)){
var paragraphText=段落[i].asText().getText();
//如果没有超级用户覆盖,请将字符转换为大写
if(paragraphText.charAt(0)!='!'&¶phText.charAt(0)!='@')){
var convertedText=paragraphText.toUpperCase();
var regexEscaped=paragraphText.replace(/[-\/\\^$*+.()\\[\]{}]/g,'\\$&');//http://stackoverflow.com/a/3561711/1677912
段落[i].replaceText(regexcaped,convertedText);
}
}
}
}
}
这是用于在文档中大写表格元素的内容


似乎你不能在正则表达式中使用捕获组和模式修饰符,所以这并不容易。只是想知道。。。你为什么要在没有Wisyyg编辑器的情况下在Google文档中写作?我在Google文档中的fountain markdown中写作。但喷泉解析器要求某些元素为大写。创建的javascript函数Modsdad允许懒惰的书写者(me)用小写字母书写,以后自动用大写字母书写。疯狂!就像魔法一样。非常感谢你!我从来都不明白文档正文中的每一行都是一个段落,我相信这里是这样的吗?你的代码对我来说很有意义,但有几个问题。当你在最后进行转换时,有没有特别的原因让你寻找“!”那么“@”呢?而且,
regexEscaped
是如何工作的?这是一种解决方法,因为您不能简单地将正则表达式放入replaceText()中吗?是的,每当您在文档中点击return时,您都会创建一个新段落。你是在中,它们描述了两种情况,可以使用这两种情况保持字符名不变。(例如,一个像McCLOUD这样的名字。)如果一行以任何一个字符开头,这个脚本期望你知道你在做什么,而不去管它。
regexEscaped
的目的是允许文本包含regex特殊字符,如
*
$
等。通过首先转义它们,它们被视为文本-如果没有它们,像
BRICK^
EDWARD(V.O.)这样的名称将不起作用。
。。。。像“结尾有句点的字符串”(您已经遇到过!)这样的名称可能是离题的,但我为
fountainLite()
函数添加了更多的功能(右对齐过渡、粗体描述行、大写描述),它可以在一个小文档上工作-慢慢地。但是对于一个大文档(50页),Google给了我一个错误:“服务在短时间内调用了太多次:属性。尝试实用程序。调用之间睡眠(1000)”。不是很有经验,但似乎每个段落运行这么多IF语句会减慢速度。任何纯javascript都非常快,因此IF语句不太可能是罪魁祸首。看看谷歌服务调用——在这种情况下,听起来你是在循环访问
属性
服务。t重点关注更改以减少服务调用的数量。
/**
 * Scan Google doc, applying fountain syntax rules.
 * Caveat: this is a partial implementation.
 *
 * Supported:
 *  Character names ahead of speech.
 *
 * Not supported:
 *  Everything else. See http://fountain.io/syntax
 */
function fountainLite() {
  // Private helper function; find text length of paragraph
  function paragraphLen( par ) {
    return par.asText().getText().length;
  }

  var doc = DocumentApp.getActiveDocument();
  var paragraphs = doc.getBody().getParagraphs();
  var numParagraphs = paragraphs.length;

  // Scan document
  for (var i=0; i<numParagraphs; i++) {

    /*
    ** Character names are in UPPERCASE.
    ** Dialogue comes right after Character.
    */
    if (paragraphLen(paragraphs[i]) > 0) {
      // This paragraph has text. If the preceeding one was blank and the following
      // one has text, then this paragraph might be a character name.
      if ((i==0 || paragraphLen(paragraphs[i-1]) == 0) && (i < numParagraphs && paragraphLen(paragraphs[i+1]) > 0)) {
        var paragraphText = paragraphs[i].asText().getText();
        // If no power-user overrides, convert Character to UPPERCASE
        if (paragraphText.charAt(0) != '!' && paragraphText.charAt(0) != '@') {
          var convertedText = paragraphText.toUpperCase(); 
          var regexEscaped = paragraphText.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); // http://stackoverflow.com/a/3561711/1677912
          paragraphs[i].replaceText(regexEscaped, convertedText);
        }
      }
    }
  }
}
var par2 = table.getCell(i,j).getChild(0).asParagraph();
     
      if(i>=1&&j>=3){
      var paragraphText = par2.asText().getText();
      var newexp = paragraphText.toUpperCase();
      table.getRow(i).getChild(j).asText().setText(newexp);
      }