google-apps-script - 如何选择段落中所有带下划线的文本
问题描述
我正在尝试创建一个谷歌应用程序脚本,它将格式化段落的某些部分。例如,带下划线的文本也将变为粗体/斜体。
我尝试过的一个文档插件具有类似的功能:https ://imgur.com/a/5Cw6Irn (这正是我想要实现的)
如何编写一个函数来选择某种类型的文本并格式化它?
**我设法编写了一个脚本,它遍历段落中的每个字母并检查它是否有下划线,但是随着段落变长,它变得非常慢,所以我正在寻找一个更快的解决方案。
function textUnderline() {
var selectedText = DocumentApp.getActiveDocument().getSelection();
if(selectedText) {
var elements = selectedText.getRangeElements();
for (var index = 0; index < elements.length; index++) {
var element = elements[index];
if(element.getElement().editAsText) {
var text = element.getElement().editAsText();
var textLength = text.getText().length;
//For every single character, check if it's underlined and then format it
for (var i = 0; i < textLength; i++) {
if(text.isUnderline(i)) {
text.setBold(i, i, true);
text.setBackgroundColor(i,i,'#ffff00');
} else {
text.setFontSize(i, i, 8);
}
}
}
}
}
}
解决方案
使用 getTextAttributeIndices:
无需检查选择中的每个字符。您可以使用getTextAttributeIndices()获取文本格式更改的索引。这种方法:
检索与不同文本格式化运行的开始相对应的文本索引集。
您只需要遍历这些索引(即检查文本格式更改的索引),它们只是所有字符索引的一小部分。这将大大提高效率。
代码示例:
function textUnderline() {
var selectedText = DocumentApp.getActiveDocument().getSelection();
if(selectedText) {
var elements = selectedText.getRangeElements();
for (var index = 0; index < elements.length; index++) {
var element = elements[index];
if(element.getElement().editAsText) {
var text = element.getElement().editAsText();
var textRunIndices = text.getTextAttributeIndices();
var textLength = text.getText().length;
for (let i = 0; i < textRunIndices.length; i++) {
const startOffset = textRunIndices[i];
const endOffset = i + 1 < textRunIndices.length ? textRunIndices[i + 1] - 1 : textLength - 1;
if (text.isUnderline(textRunIndices[i])) {
text.setBold(startOffset, endOffset, true);
text.setBackgroundColor(startOffset, endOffset,'#ffff00');
} else {
text.setFontSize(startOffset, endOffset, 8);
}
}
}
}
}
}
参考:
推荐阅读
- node.js - 如何防止将建议操作转换为文本?
- sql - sql server - 从联接更新表的有效方法
- google-calendar-api - Google Calendar API 重复事件重置
- groovy - Groovy如何将xml文件转换为单行字符串
- ruby-on-rails - 嵌套字段 - RoR - link_to_add_associations
- python - Python Matplotlib:强制数字具有相同的大小
- listview - 如何在颤动中制作水平滚动动画
- java - 在Java中用空格分割字符串时如何处理意外的空格
- ios - 如何使用 JSObjectMakeDeferredPromise 从 Swift 调用 JavaScript 中返回承诺的函数
- c# - 如何使用 System.Text.Json 忽略常量属性的 JSON 序列化?