Google 应用程序脚本;文档;将所选元素转换为 HTML
Google Apps Script; Docs; convert selected element to HTML
我刚开始使用 Google Apps 脚本并遵循附加组件快速入门
https://developers.google.com/apps-script/quickstart/docs
在快速入门中,您可以创建一个简单的插件来从文档中获取选择并使用 LanguageApp 服务进行翻译。该示例使用此获取基础文本:
function getSelectedText() {
var selection = DocumentApp.getActiveDocument().getSelection();
if (selection) {
var text = [];
var elements = selection.getSelectedElements();
for (var i = 0; i < elements.length; i++) {
if (elements[i].isPartial()) {
var element = elements[i].getElement().asText();
var startIndex = elements[i].getStartOffset();
var endIndex = elements[i].getEndOffsetInclusive();
text.push(element.getText().substring(startIndex, endIndex + 1));
} else {
var element = elements[i].getElement();
// Only translate elements that can be edited as text; skip images and
// other non-text elements.
if (element.editAsText) {
var elementText = element.asText().getText();
// This check is necessary to exclude images, which return a blank
// text element.
if (elementText != '') {
text.push(elementText);
}
}
}
}
if (text.length == 0) {
throw 'Please select some text.';
}
return text;
} else {
throw 'Please select some text.';
}
}
它只获取文本:element.getText()
,没有任何格式。
我知道底层对象不是 html,但有没有办法将选择转换为 HTML 字符串?例如,如果选择包含多种格式,例如粗体:
this is a sample with bold text
那么有没有任何方法、扩展、库等——比如element.getHTML()
——可以return这个?
this is a sample with <b>bold</b> text
而不是这个?
this is a sample with bold text
Omar AL Zabir 有一个剧本 GoogleDoc2HTML。它的目的是将整个文档转换成HTML。由于您只想在所选元素内转换富文本,因此与您的任务相关的函数是脚本中的 processText
,如下所示。
方法 getTextAttributeIndices
给出文本属性每次更改的起始偏移量,例如从正常到粗体或后退。如果只有一个变化,那就是整个元素(通常是段落)的属性,这在 if 语句的第一部分中处理。
第二部分处理一般情况,遍历索引并插入与属性对应的 HTML 标记。
脚本未维护,因此请将其视为您自己的代码的起点,而不是现成的库。有一些未合并的 PR 改进了转换过程,特别是对于内联链接。
function processText(item, output) {
var text = item.getText();
var indices = item.getTextAttributeIndices();
if (indices.length <= 1) {
// Assuming that a whole para fully italic is a quote
if(item.isBold()) {
output.push('<b>' + text + '</b>');
}
else if(item.isItalic()) {
output.push('<blockquote>' + text + '</blockquote>');
}
else if (text.trim().indexOf('http://') == 0) {
output.push('<a href="' + text + '" rel="nofollow">' + text + '</a>');
}
else {
output.push(text);
}
}
else {
for (var i=0; i < indices.length; i ++) {
var partAtts = item.getAttributes(indices[i]);
var startPos = indices[i];
var endPos = i+1 < indices.length ? indices[i+1]: text.length;
var partText = text.substring(startPos, endPos);
Logger.log(partText);
if (partAtts.ITALIC) {
output.push('<i>');
}
if (partAtts.BOLD) {
output.push('<b>');
}
if (partAtts.UNDERLINE) {
output.push('<u>');
}
// If someone has written [xxx] and made this whole text some special font, like superscript
// then treat it as a reference and make it superscript.
// Unfortunately in Google Docs, there's no way to detect superscript
if (partText.indexOf('[')==0 && partText[partText.length-1] == ']') {
output.push('<sup>' + partText + '</sup>');
}
else if (partText.trim().indexOf('http://') == 0) {
output.push('<a href="' + partText + '" rel="nofollow">' + partText + '</a>');
}
else {
output.push(partText);
}
if (partAtts.ITALIC) {
output.push('</i>');
}
if (partAtts.BOLD) {
output.push('</b>');
}
if (partAtts.UNDERLINE) {
output.push('</u>');
}
}
}
}
最终制作了一个脚本来支持我的粗体+链接+斜体的用例:
function getHtmlOfElement(element) {
var text = element.editAsText();
var string = text.getText();
var indices = text.getTextAttributeIndices();
var output = [];
for (var i = 0; i < indices.length; i++) {
var offset = indices[i];
var startPos = offset;
var endPos = i+1 < indices.length ? indices[i+1]: string.length;
var partText = string.substring(startPos, endPos);
var isBold = text.isBold(offset);
var isItalic = text.isItalic(offset);
var linkUrl = text.getLinkUrl(offset);
if (isBold) {
output.push('<b>');
}
if (isItalic) {
output.push('<i>');
}
if (linkUrl) {
output.push('<a href="' + linkUrl + '">');
}
output.push(partText);
if (isBold) {
output.push('</b>');
}
if (isItalic) {
output.push('</i>');
}
if (linkUrl) {
output.push('</a>');
}
}
return output.join("");
}
您可以简单地使用如下方式调用它:
getHtmlOfElement(myTableCell); // returns something like "<b>Bold</b> test."
这显然是一种解决方法,但您可以 copy/paste 将 Google 文档转换为 Gmail 中的草稿,然后可以使用
将该草稿转换为 HTML
GmailApp.getDraft(draftId).getMessage().getBody().toString();
我发现此线程试图通过直接从文档转到 HTML 来跳过该步骤,但我想我会分享。
我刚开始使用 Google Apps 脚本并遵循附加组件快速入门
https://developers.google.com/apps-script/quickstart/docs
在快速入门中,您可以创建一个简单的插件来从文档中获取选择并使用 LanguageApp 服务进行翻译。该示例使用此获取基础文本:
function getSelectedText() {
var selection = DocumentApp.getActiveDocument().getSelection();
if (selection) {
var text = [];
var elements = selection.getSelectedElements();
for (var i = 0; i < elements.length; i++) {
if (elements[i].isPartial()) {
var element = elements[i].getElement().asText();
var startIndex = elements[i].getStartOffset();
var endIndex = elements[i].getEndOffsetInclusive();
text.push(element.getText().substring(startIndex, endIndex + 1));
} else {
var element = elements[i].getElement();
// Only translate elements that can be edited as text; skip images and
// other non-text elements.
if (element.editAsText) {
var elementText = element.asText().getText();
// This check is necessary to exclude images, which return a blank
// text element.
if (elementText != '') {
text.push(elementText);
}
}
}
}
if (text.length == 0) {
throw 'Please select some text.';
}
return text;
} else {
throw 'Please select some text.';
}
}
它只获取文本:element.getText()
,没有任何格式。
我知道底层对象不是 html,但有没有办法将选择转换为 HTML 字符串?例如,如果选择包含多种格式,例如粗体:
this is a sample with bold text
那么有没有任何方法、扩展、库等——比如element.getHTML()
——可以return这个?
this is a sample with <b>bold</b> text
而不是这个?
this is a sample with bold text
Omar AL Zabir 有一个剧本 GoogleDoc2HTML。它的目的是将整个文档转换成HTML。由于您只想在所选元素内转换富文本,因此与您的任务相关的函数是脚本中的 processText
,如下所示。
方法 getTextAttributeIndices
给出文本属性每次更改的起始偏移量,例如从正常到粗体或后退。如果只有一个变化,那就是整个元素(通常是段落)的属性,这在 if 语句的第一部分中处理。
第二部分处理一般情况,遍历索引并插入与属性对应的 HTML 标记。
脚本未维护,因此请将其视为您自己的代码的起点,而不是现成的库。有一些未合并的 PR 改进了转换过程,特别是对于内联链接。
function processText(item, output) {
var text = item.getText();
var indices = item.getTextAttributeIndices();
if (indices.length <= 1) {
// Assuming that a whole para fully italic is a quote
if(item.isBold()) {
output.push('<b>' + text + '</b>');
}
else if(item.isItalic()) {
output.push('<blockquote>' + text + '</blockquote>');
}
else if (text.trim().indexOf('http://') == 0) {
output.push('<a href="' + text + '" rel="nofollow">' + text + '</a>');
}
else {
output.push(text);
}
}
else {
for (var i=0; i < indices.length; i ++) {
var partAtts = item.getAttributes(indices[i]);
var startPos = indices[i];
var endPos = i+1 < indices.length ? indices[i+1]: text.length;
var partText = text.substring(startPos, endPos);
Logger.log(partText);
if (partAtts.ITALIC) {
output.push('<i>');
}
if (partAtts.BOLD) {
output.push('<b>');
}
if (partAtts.UNDERLINE) {
output.push('<u>');
}
// If someone has written [xxx] and made this whole text some special font, like superscript
// then treat it as a reference and make it superscript.
// Unfortunately in Google Docs, there's no way to detect superscript
if (partText.indexOf('[')==0 && partText[partText.length-1] == ']') {
output.push('<sup>' + partText + '</sup>');
}
else if (partText.trim().indexOf('http://') == 0) {
output.push('<a href="' + partText + '" rel="nofollow">' + partText + '</a>');
}
else {
output.push(partText);
}
if (partAtts.ITALIC) {
output.push('</i>');
}
if (partAtts.BOLD) {
output.push('</b>');
}
if (partAtts.UNDERLINE) {
output.push('</u>');
}
}
}
}
最终制作了一个脚本来支持我的粗体+链接+斜体的用例:
function getHtmlOfElement(element) {
var text = element.editAsText();
var string = text.getText();
var indices = text.getTextAttributeIndices();
var output = [];
for (var i = 0; i < indices.length; i++) {
var offset = indices[i];
var startPos = offset;
var endPos = i+1 < indices.length ? indices[i+1]: string.length;
var partText = string.substring(startPos, endPos);
var isBold = text.isBold(offset);
var isItalic = text.isItalic(offset);
var linkUrl = text.getLinkUrl(offset);
if (isBold) {
output.push('<b>');
}
if (isItalic) {
output.push('<i>');
}
if (linkUrl) {
output.push('<a href="' + linkUrl + '">');
}
output.push(partText);
if (isBold) {
output.push('</b>');
}
if (isItalic) {
output.push('</i>');
}
if (linkUrl) {
output.push('</a>');
}
}
return output.join("");
}
您可以简单地使用如下方式调用它:
getHtmlOfElement(myTableCell); // returns something like "<b>Bold</b> test."
这显然是一种解决方法,但您可以 copy/paste 将 Google 文档转换为 Gmail 中的草稿,然后可以使用
将该草稿转换为 HTMLGmailApp.getDraft(draftId).getMessage().getBody().toString();
我发现此线程试图通过直接从文档转到 HTML 来跳过该步骤,但我想我会分享。