如何使用 Google Apps 脚本在 Google 文档中的段落前设置一定数量的空格或缩进
How to set a certain number of spaces or indents before a Paragraph in Google Docs using Google Apps Script
我有一个 20 行的脚本,我想确保每个段落都缩进一次。
function myFunction() {
/*
This function turns the document's format into standard MLA.
*/
var body = DocumentApp.getActiveDocument().getBody();
body.setFontSize(12); // Set the font size of the contents of the documents to 9
body.setForegroundColor('#000000');
body.setFontFamily("Times New Roman");
// Loops through paragraphs in body and sets each to double spaced
var paragraphs = body.getParagraphs();
for (var i = 3; i < paragraphs.length; i++) { // Starts at 3 to exclude first 4 developer-made paragraphs
var paragraph = paragraphs[i];
paragraph.setLineSpacing(2);
// Left align the first cell.
paragraph.setAlignment(DocumentApp.HorizontalAlignment.LEFT);
// One indent
paragraph.editAsText().insertText(0, "\t"); // Adds one tab every time
}
var bodyText = body.editAsText();
bodyText.insertText(0, 'February 3, 1976\nMrs. Smith\nYour Name Here\nSocial Studies\n');
bodyText.setBold(false);
}
我试过的代码不起作用。但我的预期结果是,对于 myFunction()
中 for 循环中的每个段落,在每个段落的第一个单词之前恰好有 4 spaces。
这是一个示例:https://docs.google.com/document/d/1sMztzhOehzheRdqumC6PLnvk4qJgUCSE0irjTZ0FjTQ/edit?usp=sharing
如果用户使用自动套用格式,但段落已经缩进...
更新
我调查了 Paragraph.setIndentFirstLine()
方法的使用。当我将它设置为 4 时,它设置为 1 space。现在我意识到这是因为点数和 spaces 不是一回事。我需要乘以多少才能得到四 space 分?
让我们考虑一些基本的识别操作:手动和脚本。
下图显示了如何缩进当前段落(光标停留在这一段内)。
请注意,单位是厘米。另请注意,该段落不包含前导空格或制表符,我们不需要它们。
假设我们想获取脚本中的缩进值并将其应用到下一段。看下面的代码:
function myFunction() {
var ps = DocumentApp.getActiveDocument().getBody().getParagraphs();
// We work with the 5-th and 6-th paragraphs indeed
var iFirst = ps[5].getIndentFirstLine();
var iStart = ps[5].getIndentStart();
var iEnd = ps[5].getIndentEnd();
Logger.log([iFirst, iStart, iEnd]);
ps[6].setIndentFirstLine(iFirst);
ps[6].setIndentStart(iStart);
ps[6].setIndentEnd(iEnd);
}
如果您 运行 并查看日志,您会看到类似这样的内容:[92.69291338582678, 64.34645669291339, 14.173228346456694]
。毫不奇怪,我们使用排版 点 而不是 厘米 。 (1cm=28.3465pt) 所以我们可以精确测量和修改任何段落缩进值。
加法
出于某些原因,您可能希望控制段落开头的空格数。也可以通过脚本编写,但它对段落的 "left" 或 "right" 缩进没有影响。
下面的示例代码用于类似的任务:计算第 5 段的前导空格数,并在下一段的开头制作相同数量的空格。
function mySpaces() {
var ps = DocumentApp.getActiveDocument().getBody().getParagraphs();
// We work with the 5-th and 6-th paragraphs indeed
var spacesCount = getLeadingSpacesCount(ps[5]);
Logger.log(spacesCount);
var diff = getLeadingSpacesCount(ps[6]) - spacesCount;
if (diff > 0) {
ps[6].editAsText().deleteText(0, diff - 1);
} else if (diff < 0) {
var s = Array(1 - diff).join(' ');
ps[6].editAsText().insertText(0, s);
}
}
function getLeadingSpacesCount(p) {
var found = p.findText("^ +");
return found ? found.getEndOffsetInclusive() + 1 : 0;
}
我们使用了 deleteText() 和 insertText() 的方法 class Text for proper corrections and findText() to locate the spaces if any. Note, the last method argument is a string, representing a regular expression. It matches "all leading spaces", if they exist. See more details 关于正则表达式语法。
我有一个 20 行的脚本,我想确保每个段落都缩进一次。
function myFunction() {
/*
This function turns the document's format into standard MLA.
*/
var body = DocumentApp.getActiveDocument().getBody();
body.setFontSize(12); // Set the font size of the contents of the documents to 9
body.setForegroundColor('#000000');
body.setFontFamily("Times New Roman");
// Loops through paragraphs in body and sets each to double spaced
var paragraphs = body.getParagraphs();
for (var i = 3; i < paragraphs.length; i++) { // Starts at 3 to exclude first 4 developer-made paragraphs
var paragraph = paragraphs[i];
paragraph.setLineSpacing(2);
// Left align the first cell.
paragraph.setAlignment(DocumentApp.HorizontalAlignment.LEFT);
// One indent
paragraph.editAsText().insertText(0, "\t"); // Adds one tab every time
}
var bodyText = body.editAsText();
bodyText.insertText(0, 'February 3, 1976\nMrs. Smith\nYour Name Here\nSocial Studies\n');
bodyText.setBold(false);
}
我试过的代码不起作用。但我的预期结果是,对于 myFunction()
中 for 循环中的每个段落,在每个段落的第一个单词之前恰好有 4 spaces。
这是一个示例:https://docs.google.com/document/d/1sMztzhOehzheRdqumC6PLnvk4qJgUCSE0irjTZ0FjTQ/edit?usp=sharing
如果用户使用自动套用格式,但段落已经缩进...
更新
我调查了 Paragraph.setIndentFirstLine()
方法的使用。当我将它设置为 4 时,它设置为 1 space。现在我意识到这是因为点数和 spaces 不是一回事。我需要乘以多少才能得到四 space 分?
让我们考虑一些基本的识别操作:手动和脚本。 下图显示了如何缩进当前段落(光标停留在这一段内)。
请注意,单位是厘米。另请注意,该段落不包含前导空格或制表符,我们不需要它们。
假设我们想获取脚本中的缩进值并将其应用到下一段。看下面的代码:
function myFunction() {
var ps = DocumentApp.getActiveDocument().getBody().getParagraphs();
// We work with the 5-th and 6-th paragraphs indeed
var iFirst = ps[5].getIndentFirstLine();
var iStart = ps[5].getIndentStart();
var iEnd = ps[5].getIndentEnd();
Logger.log([iFirst, iStart, iEnd]);
ps[6].setIndentFirstLine(iFirst);
ps[6].setIndentStart(iStart);
ps[6].setIndentEnd(iEnd);
}
如果您 运行 并查看日志,您会看到类似这样的内容:[92.69291338582678, 64.34645669291339, 14.173228346456694]
。毫不奇怪,我们使用排版 点 而不是 厘米 。 (1cm=28.3465pt) 所以我们可以精确测量和修改任何段落缩进值。
加法
出于某些原因,您可能希望控制段落开头的空格数。也可以通过脚本编写,但它对段落的 "left" 或 "right" 缩进没有影响。
下面的示例代码用于类似的任务:计算第 5 段的前导空格数,并在下一段的开头制作相同数量的空格。
function mySpaces() {
var ps = DocumentApp.getActiveDocument().getBody().getParagraphs();
// We work with the 5-th and 6-th paragraphs indeed
var spacesCount = getLeadingSpacesCount(ps[5]);
Logger.log(spacesCount);
var diff = getLeadingSpacesCount(ps[6]) - spacesCount;
if (diff > 0) {
ps[6].editAsText().deleteText(0, diff - 1);
} else if (diff < 0) {
var s = Array(1 - diff).join(' ');
ps[6].editAsText().insertText(0, s);
}
}
function getLeadingSpacesCount(p) {
var found = p.findText("^ +");
return found ? found.getEndOffsetInclusive() + 1 : 0;
}
我们使用了 deleteText() 和 insertText() 的方法 class Text for proper corrections and findText() to locate the spaces if any. Note, the last method argument is a string, representing a regular expression. It matches "all leading spaces", if they exist. See more details 关于正则表达式语法。