Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/361.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_Google Apps Script_Google Docs_Google Apps - Fatal编程技术网

Javascript 谷歌应用程序脚本——用卷曲的引号替换直引号

Javascript 谷歌应用程序脚本——用卷曲的引号替换直引号,javascript,google-apps-script,google-docs,google-apps,Javascript,Google Apps Script,Google Docs,Google Apps,当我在我的GoogleDocs iPad应用程序上输入一本小说时,它使用了上下引号,如下图所示:“.现在,我想把所有这些引号都改成卷曲的,而不必手动更改 我写了一个简单的GoogleApps脚本文件来处理这个问题,但当我运行它时,它似乎无限期地说“Running function myFunction…” 这是我的代码。前几行使用简单的RePrEtEXT方法处理句子中间的引号。同时,while语句测试在引用之前是否有断线(\n),并使用它来确定是否开始或结束引用。 function myFunc

当我在我的GoogleDocs iPad应用程序上输入一本小说时,它使用了上下引号,如下图所示:“.现在,我想把所有这些引号都改成卷曲的,而不必手动更改

我写了一个简单的GoogleApps脚本文件来处理这个问题,但当我运行它时,它似乎无限期地说“Running function myFunction…”

这是我的代码。前几行使用简单的RePrEtEXT方法处理句子中间的引号。同时,while语句测试在引用之前是否有断线(\n),并使用它来确定是否开始或结束引用。

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

  //Replace quotes that are not at beginning or end of paragraph
  body.replaceText(' "', ' “');
  body.replaceText('" ', '” ');

  var bodyString = body.getText();
  var x = bodyString.indexOf('"');
  var bodyText = body.editAsText();

  while (x != -1) {
    var testForLineBreaks = bodyString.slice(x-2, x);
    if (testForLineBreaks == '\n') { //testForLineBreaks determines whether it is the beginning of the paragraph
      //Replace quotes at beginning of paragraph
      bodyText.deleteText(x, x);
      bodyText.insertText(x, '“');
    } else {
      //Replace quotes at end of paragraph
      bodyText.deleteText(x, x);
      bodyText.insertText(x, '”');
    }
    x = bodyString.indexOf('"');
  }
}
我似乎找不到它有什么问题。更让人困惑的是,当我点击调试器时,它说

保存文档之前应用的更改太多。请使用document.saveAndClose()以较小的批保存更改,然后使用document.openById()重新打开文档


非常感谢您的帮助。提前谢谢!

我不确定确切的限制,但我认为您可以在while循环中包括一个计数器,每50或100,通过Logger.log()输出一个计数器;一旦您掌握了限制计数,您可以执行建议的操作


i、 e.当接近极限时,通过调用Document.saveAndClose()刷新/保存更改,然后使用Document.openById()重新打开文档,重新开始主循环

我不确定确切的限制,但我认为您可以在while循环中包括一个计数器,每50或100个计数器,通过Logger.log()输出一次;一旦您掌握了该限制计数,您可以按照建议执行


i、 e.接近极限时,通过调用Document.saveAndClose()刷新/保存更改,然后通过使用Document.openById()

重新打开文档,重新开始主循环。关于错误消息,some1是正确的,但不幸的是,这并没有找到问题的根源:

在while循环结束时,变量bodyString被用来查找要更改的引号的位置。问题是bodyString只是一个字符串,所以每次更改文档时我都需要更新它

另一个问题,尽管更基本,是Google将\n计算为一个字符,因此我必须将
var testForLineBreaks=bodyString.slice(x-2,x);
中的参数更改为
x-1,x

在修补了这些问题之后,我完成的代码如下所示:

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

  //Replace quotes that are not at beginning or end of paragraph
  body.replaceText(' "', ' “');
  body.replaceText('" ', '” ');

  var bodyString = body.getText();
  var x = bodyString.indexOf('"');
  var bodyText = body.editAsText();

  while (x != -1) {
    var testForLineBreaks = bodyString.slice(x-1, x);

    if (testForLineBreaks == '\n') { //testForLineBreaks determines whether it is the beginning of the paragraph
      //Replace quotes at beginning of paragraph
      bodyText.deleteText(x, x);
      bodyText.insertText(x, '“');
    } else {
      //Replace quotes at end of paragraph
      bodyText.deleteText(x, x);
      bodyText.insertText(x, '”');
    }

    body = DocumentApp.getActiveDocument().getBody();
    bodyString = body.getText();
    x = bodyString.indexOf('"');
    bodyText = body.editAsText();
  }
}

代码还有一个问题。如果引号位于文档的最开头(如第一个字符),则脚本将插入错误的引号样式。但是,我计划手动修复此问题。

some1对错误消息的看法是正确的,但不幸的是,这并没有找到问题的根源:

在while循环结束时,变量bodyString被用来查找要更改的引号的位置。问题是bodyString只是一个字符串,所以每次更改文档时我都需要更新它

另一个问题,尽管更基本,是Google将\n计算为一个字符,因此我必须将
var testForLineBreaks=bodyString.slice(x-2,x);
中的参数更改为
x-1,x

在修补了这些问题之后,我完成的代码如下所示:

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

  //Replace quotes that are not at beginning or end of paragraph
  body.replaceText(' "', ' “');
  body.replaceText('" ', '” ');

  var bodyString = body.getText();
  var x = bodyString.indexOf('"');
  var bodyText = body.editAsText();

  while (x != -1) {
    var testForLineBreaks = bodyString.slice(x-1, x);

    if (testForLineBreaks == '\n') { //testForLineBreaks determines whether it is the beginning of the paragraph
      //Replace quotes at beginning of paragraph
      bodyText.deleteText(x, x);
      bodyText.insertText(x, '“');
    } else {
      //Replace quotes at end of paragraph
      bodyText.deleteText(x, x);
      bodyText.insertText(x, '”');
    }

    body = DocumentApp.getActiveDocument().getBody();
    bodyString = body.getText();
    x = bodyString.indexOf('"');
    bodyText = body.editAsText();
  }
}
代码还有一个问题。如果引号位于文档的最开头(如第一个字符),则脚本将插入错误的引号样式。但是,我计划手动修复该问题