如何使用 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);
  }
}

注:

  • 这是一个简单的示例脚本。所以请根据您的实际情况进行修改。

参考: