Google Apps脚本---使用Curly Ones替换直引号

时间:2016-08-05 06:19:34

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

当我在Google Docs iPad应用程序上输入一本小说时,它使用了直接的上下引号,如下所示:"。现在,我想将所有这些引号更改为卷曲类,而不必手动更改所有引号。

我写了一个简单的Google Apps脚本文件来处理这个问题,但是当我运行它时,它似乎说"运行函数myFunction ......"下去。

这是我的代码。前几行使用简单的replaceText方法处理句子中间的引号。同时,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()重新打开文档。

我很感激所有这方面的帮助。提前谢谢!

2 个答案:

答案 0 :(得分:2)

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

即。当接近极限时,通过调用 Document.saveAndClose()来刷新/保存更改,然后通过使用 Document.openById() <重新打开文档再次使用主循环/ p>

答案 1 :(得分:0)

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();
  }
}

代码还存在一个问题。如果引用位于文档的最开头,如第一个字符,则脚本将插入错误的引用样式。但是,我打算手动修复它。