如何使用Google App脚本将格式化后的文本从Google表格单元格保存到.rtf?

问题描述 投票:2回答:2

Tab "Newsticker" in Google Spreadsheet

我在Google App脚本中有一个简单的脚本,该脚本从google工作表(RSS-Feeds)的单元格中获取字符串值,并保存(更新)一些.rtf-文档。经过一些同步过程和宏帮助程序后,这些文本显示在滚动的LED栏上,可以通过WIFI更新。

这有效,但是我没有设法设置.rtf-文档中的文本格式。

我尝试过RichTextValueBuilder,该方法可以很好地为Google电子表格中的文本添加格式,但是对.rtf的文本进行格式设置却不成功...另一个实验是使用html标签。这在rtf文件中带来了所需的格式化效果,但是led栏的应用程序无法处理它。

有人知道在这种情况下如何帮助菜鸟吗?在此先多谢!

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);
  }
}
javascript google-apps-script google-sheets rtf
2个回答
1
投票
  • 您有一个Google Spreadsheet,在“ J2:J5”单元格中具有富文本格式。
  • 您想从“ J2:J5”的单元格中检索富文本格式,并希望将它们创建为mimeType为application/rtf的每个文件。
    • 在您的情况下,将创建4个RTF文件。
  • 您想使用Google Apps脚本来实现。

我可以像上面那样理解。如果我的理解是正确的,那么这个答案呢?请认为这只是几个可能的答案之一。

在此答案中,为了实现您的目标,我使用了RichTextApp的Google Apps脚本库。

用法:

1。安装GAS库。

请安装RichTextApp的GAS库。您可以在here中查看如何安装。

2。示例脚本。

请复制并粘贴以下示例脚本,然后运行myFunction。这样,当该文件夹存在时,将在该文件夹中创建4个RTF文件。

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);
  }
}

注意:

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

参考:


0
投票

[不确定,这是否对任何人都有用,但是我发现了可能的解决方法。欢迎提供更好的解决方案,因为这看起来很丑陋,并且在每种情况下都行不通...

RTF文件是预先格式化的,我只是在Google工作表中添加了文本,而不是替换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
    }
}

}

© www.soinside.com 2019 - 2024. All rights reserved.