Google apps script 如何用包含编号的标识符替换编号的列表元素
我今天在这里得到了惊人的帮助 我想做点别的事。我在谷歌文档中有一个编号的问题列表,我想用其他东西来替换这些数字 例如,我想替换列表中的数字,例如:Google apps script 如何用包含编号的标识符替换编号的列表元素,google-apps-script,google-docs,Google Apps Script,Google Docs,我今天在这里得到了惊人的帮助 我想做点别的事。我在谷歌文档中有一个编号的问题列表,我想用其他东西来替换这些数字 例如,我想替换列表中的数字,例如: 地球在一年中哪个月离太阳最近? ~7月 ~June =一月 ~3月份 ~9月 在澳大利亚(南半球),什么时候白天最短,夜晚最长? ~12月底 ~3月底 六月下旬 ~z~四月底 ~z~在澳大利亚,白天和黑夜的长度一年四季都差不多 与: ::Q09::地球在一年中的哪个月离太阳最近? ~7月 ~June =一月 ~3月份 ~9月 在澳大利亚(南半球)
function questionName2(){
var body = DocumentApp.getActiveDocument().getBody();
var text = body.editAsText();
var pattern = "^[1-9]";
var found = body.findText(pattern);
var matchPosition = found.getStartOffset();
while(found){
text.insertText(matchPosition,'::Q0');
found = body.findText(pattern, found);
}
}
正则表达式
使用一个字符串,该字符串将被解析为使用Google的搜索模式进行搜索的字符串。以这种方式使用字符串需要在删除字符的特殊含义时添加一个额外的反斜杠,例如匹配问题编号后的句点,或对数字使用字符匹配集,如\d
^\\s*\\d+?\.
将匹配一组以任何长度(包括零)的前导空格开头的非零长度的数字\d
表示数字,+
表示一个或多个,组合+?
使匹配延迟。这里不需要惰性部分,但我的习惯是默认为惰性以避免bug。另一种方法是\d{1,2}
专门匹配1到2位数字
为了从匹配的文本中提取数字,我们可以使用JavaScript对象。与Doc正则表达式不同,此正则表达式不需要额外的反斜杠,并允许我们使用括号来使用捕获组
^\s*(\d+?)\。
几乎与上述相同,只是没有多余的斜杠,我们现在将“保存”数字,以便在替换字符串中使用它们。我们用括号标记要保存的内容。因为这将是一个普通的JavaScript正则表达式文本,所以我们将用斜杠将整个内容括起来:/^\s*(\d+?)\./
,但开头和结尾的/
只是为了表明这是一个RegExp文本
文本元素和文本字符串
Text.findText
可以返回的不仅仅是我们要求的精确匹配:它返回包含文本的整个元素以及正则表达式匹配内容的索引。为了执行搜索并替换为捕获组,我们必须使用索引删除旧文本,然后插入新文本
下面的赋值为我们提供了执行搜索和替换所需的所有数据:首先是元素,然后是开始和停止索引,最后使用提取匹配的文本字符串(注意,slice使用一个独占的结束,而Doc API使用一个包含的结束,因此使用+1)
警告
正如塔奈克在评论中指出的,这假设编号不是自动生成数字,而是您手动键入的数字。如果您使用的是自动生成的编号列表,则API不允许您编辑编号的格式
这个答案还假设在本例中,当您将“9.”映射到“::Q09::”和“10.”映射到“::Q11::”时,10到11的映射是一个打字错误。如果这是有意的,请更新问题,以澄清编号可能更改的规则
还假设数字应该小于100,给出了“Q09”的零填充示例。该示例应该足够灵活,允许您在需要时将其更新为不同的填充方案
完整示例
由于问题没有使用任何V8功能,因此假设使用的是较旧的Rhino环境
/**
*将“1.”替换为“::Q01::”
*/
函数updateQuestionNumbering(){
var text=DocumentApp.getActiveDocument().getBody();
var pattern=“^\\s*\\d+?\”;
var found=text.findText(模式);
while(找到){
var matchStart=found.getStartOffset();
var matchEnd=found.getEndOffsetInclusive();
var matchElement=found.getElement().asText();
var matchText=matchElement.getText().slice(matchStart、matchEnd+1);
matchElement.deleteText(matchStart、matchEnd);
matchElement.insertText(matchStart,matchText.replace(/^\s*(\d+?)\。/,replace));
find=text.findText(模式,find);
}
/**
*@param{string}\完全匹配(忽略)
*@param{string}number-匹配的数字序列
*/
函数替换程序(\ ux,编号){
返回“::Q“+padStart(数字,2,“0”)+”:”;
}
//在V8环境中使用String.prototype.padStart()
//上述用法将变成'number.padStart(2,“0”)`
函数padStart(string、targetLength、padString){
而(string.length
正则表达式
使用一个字符串,该字符串将被解析为使用Google的搜索模式进行搜索的字符串。以这种方式使用字符串需要在删除字符的特殊含义时添加一个额外的反斜杠,例如匹配问题编号后的句点,或对数字使用字符匹配集,如\d
^\\s*\\d+?\.
将匹配一组长度任意非零的数字,这些数字以lea的任意长度(包括零)开始
var found = DocumentApp.getActiveDocument().getBody().findText(pattern);
var matchStart = found.getStartOffset();
var matchEnd = found.getEndOffsetInclusive();
var matchElement = found.getElement().asText();
var matchText = matchElement.getText().slice(matchStart, matchEnd + 1);