如何使用 Google App Script 将 google sheet 单元格中的格式化文本保存为 .rtf?
How to save formatted text from google sheet cells to .rtf with Google App Script?
我在 Google App Script 中有一个简单的脚本,它从 google sheet (RSS-Feeds) 中的单元格中获取字符串值并保存(更新)一些 . rtf - 文档。经过一些同步过程和宏帮助程序后,这些文本显示在滚动的 LED 条上,可以通过 WIFI 更新。
这行得通,但我没能格式化 .rtf - 文档中的文本。
我试验了 RichTextValueBuilder,它可以很好地向 google 传播sheet 中的文本添加格式,但无法成功地格式化 .rtf 中的文本...
另一个实验是使用 html-tags。这在 rtf 文件中带来了所需的格式效果,但 led-bar 的应用程序无法处理它。
有人知道在这种情况下如何帮助菜鸟吗?非常感谢!
function dataLED() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var ass = ss.getSheetByName("Newsticker");
//VALUES FROM CELLS IN GOOGLE SHEETS
var valuesLedBar = ass.getRange(2, 10, 4, 1).getValues();
var vak1 = valuesLedBar[0];
var vak2 = valuesLedBar[1];
var vak3 = valuesLedBar[2];
var vak4 = valuesLedBar[3];
var marge = ass.getRange("B16").getValue();
//SAVE IN .RTF-FILES (IN FOLDER dataLEDbar)
var folders = DriveApp.getFoldersByName("dataLEDbar");
if (folders.hasNext()) {
var folder = folders.next();
saveData(folder, "0808003135589.rtf", vak1);
saveData(folder, "0808003133343.rtf", vak2);
saveData(folder, "0808003136619.rtf", vak3);
saveData(folder, "0808003135964.rtf", vak4);
saveData(folder, "0808182631849.rtf", "Gewinnmarge diesen Monat:" + marge);
}
else {null}
};
//-------------------------------------------------SAVE
function saveData(folder, fileName, contents) {
var children = folder.getFilesByName(fileName);
var file = null;
if (children.hasNext()) {
file = children.next();
file.setContent(contents);
} else {
file = folder.createFile(fileName, contents);
}
}
不确定,这是否对任何人有帮助,但我找到了解决该问题的可能方法。欢迎更好的解决方案,因为这看起来很难看,而且并非在所有情况下都有效...
RTF 文件是预先格式化的,我只是附加 google sheet 中的文本,而不是替换 RTF 的内容和格式。
function appendText() {
//Search Params for File and Folder
var fileName = "testRtf.rtf";
var folderName = "dataLEDbar";
//New Text in .rtf
var content = "NEWTEXT";
// get list of folders with matching name
var folderList = DriveApp.getFoldersByName(folderName);
if (folderList.hasNext()) {
//folder
var folder = folderList.next();
// search for files with matching name
var fileList = folder.getFilesByName(fileName);
if (fileList.hasNext()) {
//file
var file = fileList.next();
//get rtf-file as string from Blob
var rtfContent = file.getBlob().getDataAsString();
//split Blob
var splitBlob = rtfContent.split("\");
var lenSplitBlob = splitBlob.length;
//and replace last array with new text
splitBlob[lenSplitBlob - 1] = "cf2 " + content + "}";
//new Blob
var newBlob = splitBlob.toString().replace(/,/g, '\');
//append text to already formatted .rtf-File
file.setContent(newBlob);
} else {
// file not found
null
}
}
}
这是我的理解:
- 您有一个 Google 电子表格,在 "J2:J5" 的单元格中包含富文本。
- 您想从 "J2:J5" 的单元格中检索富文本,并希望将它们创建为具有
application/rtf
的 mimeType 的每个文件。
- 在您的例子中,创建了 4 个富文本文件。
- 您想使用 Google Apps 脚本实现此目的。
在这个回答中,为了实现您的目标,我使用了 RichTextApp 的 Google Apps 脚本库。
用法:
1。安装 GAS 库。
请安装RichTextApp的GAS库。您可以在 here.
查看如何安装
2。示例脚本。
请复制并粘贴以下示例脚本,然后 运行 myFunction
。这样,当文件夹存在时,会在文件夹中创建4个富文本文件。
function myFunction() {
const filenames = ["0808003135589.rtf", "0808003133343.rtf", "0808003136619.rtf", "0808003135964.rtf"];
const folderName = "dataLEDbar";
const sheetName = "Newsticker";
const folders = DriveApp.getFoldersByName(folderName);
const folder = folders.hasNext() ? folders.next() : DriveApp.getRootFolder();
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName(sheetName);
for (let i = 2; i <= 5; i++) {
const range = sheet.getRange("J" + i);
const doc = DocumentApp.create("tempDocument");
const docId = doc.getId();
RichTextApp.SpreadsheetToDocument({range: range, document: doc});
doc.saveAndClose();
const url = "https://docs.google.com/feeds/download/documents/export/Export?exportFormat=rtf&id=" + docId;
const res = UrlFetchApp.fetch(url, {headers: {authorization: "Bearer " + ScriptApp.getOAuthToken()}});
folder.createFile(res.getBlob().setName(filenames[i - 2]));
DriveApp.getFileById(docId).setTrashed(true);
}
}
注:
- 这是一个简单的示例脚本。所以请根据您的实际情况进行修改。
参考:
我在 Google App Script 中有一个简单的脚本,它从 google sheet (RSS-Feeds) 中的单元格中获取字符串值并保存(更新)一些 . rtf - 文档。经过一些同步过程和宏帮助程序后,这些文本显示在滚动的 LED 条上,可以通过 WIFI 更新。
这行得通,但我没能格式化 .rtf - 文档中的文本。
我试验了 RichTextValueBuilder,它可以很好地向 google 传播sheet 中的文本添加格式,但无法成功地格式化 .rtf 中的文本... 另一个实验是使用 html-tags。这在 rtf 文件中带来了所需的格式效果,但 led-bar 的应用程序无法处理它。
有人知道在这种情况下如何帮助菜鸟吗?非常感谢!
function dataLED() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var ass = ss.getSheetByName("Newsticker");
//VALUES FROM CELLS IN GOOGLE SHEETS
var valuesLedBar = ass.getRange(2, 10, 4, 1).getValues();
var vak1 = valuesLedBar[0];
var vak2 = valuesLedBar[1];
var vak3 = valuesLedBar[2];
var vak4 = valuesLedBar[3];
var marge = ass.getRange("B16").getValue();
//SAVE IN .RTF-FILES (IN FOLDER dataLEDbar)
var folders = DriveApp.getFoldersByName("dataLEDbar");
if (folders.hasNext()) {
var folder = folders.next();
saveData(folder, "0808003135589.rtf", vak1);
saveData(folder, "0808003133343.rtf", vak2);
saveData(folder, "0808003136619.rtf", vak3);
saveData(folder, "0808003135964.rtf", vak4);
saveData(folder, "0808182631849.rtf", "Gewinnmarge diesen Monat:" + marge);
}
else {null}
};
//-------------------------------------------------SAVE
function saveData(folder, fileName, contents) {
var children = folder.getFilesByName(fileName);
var file = null;
if (children.hasNext()) {
file = children.next();
file.setContent(contents);
} else {
file = folder.createFile(fileName, contents);
}
}
不确定,这是否对任何人有帮助,但我找到了解决该问题的可能方法。欢迎更好的解决方案,因为这看起来很难看,而且并非在所有情况下都有效...
RTF 文件是预先格式化的,我只是附加 google sheet 中的文本,而不是替换 RTF 的内容和格式。
function appendText() {
//Search Params for File and Folder
var fileName = "testRtf.rtf";
var folderName = "dataLEDbar";
//New Text in .rtf
var content = "NEWTEXT";
// get list of folders with matching name
var folderList = DriveApp.getFoldersByName(folderName);
if (folderList.hasNext()) {
//folder
var folder = folderList.next();
// search for files with matching name
var fileList = folder.getFilesByName(fileName);
if (fileList.hasNext()) {
//file
var file = fileList.next();
//get rtf-file as string from Blob
var rtfContent = file.getBlob().getDataAsString();
//split Blob
var splitBlob = rtfContent.split("\");
var lenSplitBlob = splitBlob.length;
//and replace last array with new text
splitBlob[lenSplitBlob - 1] = "cf2 " + content + "}";
//new Blob
var newBlob = splitBlob.toString().replace(/,/g, '\');
//append text to already formatted .rtf-File
file.setContent(newBlob);
} else {
// file not found
null
}
}
}
这是我的理解:
- 您有一个 Google 电子表格,在 "J2:J5" 的单元格中包含富文本。
- 您想从 "J2:J5" 的单元格中检索富文本,并希望将它们创建为具有
application/rtf
的 mimeType 的每个文件。- 在您的例子中,创建了 4 个富文本文件。
- 您想使用 Google Apps 脚本实现此目的。
在这个回答中,为了实现您的目标,我使用了 RichTextApp 的 Google Apps 脚本库。
用法:
1。安装 GAS 库。
请安装RichTextApp的GAS库。您可以在 here.
查看如何安装2。示例脚本。
请复制并粘贴以下示例脚本,然后 运行 myFunction
。这样,当文件夹存在时,会在文件夹中创建4个富文本文件。
function myFunction() {
const filenames = ["0808003135589.rtf", "0808003133343.rtf", "0808003136619.rtf", "0808003135964.rtf"];
const folderName = "dataLEDbar";
const sheetName = "Newsticker";
const folders = DriveApp.getFoldersByName(folderName);
const folder = folders.hasNext() ? folders.next() : DriveApp.getRootFolder();
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName(sheetName);
for (let i = 2; i <= 5; i++) {
const range = sheet.getRange("J" + i);
const doc = DocumentApp.create("tempDocument");
const docId = doc.getId();
RichTextApp.SpreadsheetToDocument({range: range, document: doc});
doc.saveAndClose();
const url = "https://docs.google.com/feeds/download/documents/export/Export?exportFormat=rtf&id=" + docId;
const res = UrlFetchApp.fetch(url, {headers: {authorization: "Bearer " + ScriptApp.getOAuthToken()}});
folder.createFile(res.getBlob().setName(filenames[i - 2]));
DriveApp.getFileById(docId).setTrashed(true);
}
}
注:
- 这是一个简单的示例脚本。所以请根据您的实际情况进行修改。