Google Apps 脚本 --- 将直引号替换为弯引号

Google Apps Script---Replace Straight Quotation Marks with Curly Ones

当我在我的 Google 文档 iPad 应用程序上输入小说时,它使用了直接上下引号,如下所示:“。现在,我想更改所有这些引号变成了卷曲的类型,而无需手动更改所有引号。

我写了一个简单的 Google Apps 脚本文件来处理这个问题,但是当我 运行 它时,它似乎无限期地说 "Running function 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('"');
  }
}

我似乎找不到它有什么问题。更令人困惑的是,当我单击调试器时,它显示

Too many changes applied before saving document. Please save changes in smaller batches using Document.saveAndClose(), then reopen the document with Document.openById().

感谢所有对此的帮助。提前致谢!

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

即当接近极限时,flush/save 通过调用 Document.saveAndClose() 进行更改,然后通过使用 [ 重新打开文档再次开始主循环=23=]()

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

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