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 个问题。如果引号位于文档的最开头,如第一个字符,则脚本将插入错误的引号样式。不过,我打算手动修复它。
当我在我的 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 个问题。如果引号位于文档的最开头,如第一个字符,则脚本将插入错误的引号样式。不过,我打算手动修复它。