Как сохранить отформатированный текст из ячеек листа Google в .rtf с помощью Google App Script? - PullRequest
2 голосов
/ 17 апреля 2020

Tab

У меня есть простой скрипт в Google App Script, который берет строковые значения из ячеек в листе Google (RSS-каналы) и сохраняет (обновляет) некоторые .rtf - Документы. После некоторых syn c -процессов и макро-помощников эти тексты отображаются на прокручиваемой светодиодной панели, которую можно обновлять через WIFI.

Это работает, но мне не удалось отформатировать тексты в .rtf - Документы.

Я экспериментировал с RichTextValueBuilder, который прекрасно работает для добавления форматирования к тексту в электронной таблице Google, но не смог отформатировать текст в .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);
  }
}

Ответы [ 2 ]

2 голосов
/ 18 апреля 2020
  • У вас есть электронная таблица Google, в которой форматированный текст находится в ячейках "J2: J5".
  • Вы хотите извлечь расширенные тексты из ячеек "J2: J5" и хотите создать их как каждый файл с mimeType application/rtf.
    • В вашем случае создаются 4 расширенных текстовых файла.
  • Вы хотите добиться этого с помощью скрипта Google Apps.

Я мог бы понять, как указано выше. Если мое понимание верно, как насчет этого ответа? Думайте об этом как об одном из нескольких возможных ответов.

В этом ответе для достижения вашей цели я использовал библиотеку сценариев Google Apps RichTextApp .

* 1019. * Использование:

1. Установите библиотеку GAS.

Пожалуйста, установите библиотеку GAS RichTextApp. Вы можете увидеть, как установить на здесь .

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

Примечание:

  • Это простой пример сценария. Поэтому, пожалуйста, измените это для вашей реальной ситуации.

Ссылка:

0 голосов
/ 18 апреля 2020

Не уверен, если это кому-нибудь помогает, но я нашел возможное решение этой проблемы. Приветствуются лучшие решения, так как это выглядит некрасиво и не будет работать во всех случаях ...

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

}

...