Управление файлами RTF с помощью GAS (в массовом порядке, в gdoc) - PullRequest
1 голос
/ 06 мая 2019

Есть ли способ программно конвертировать файлы RTF в gdocs, или если вы не можете конвертировать, просто скопируйте содержимое? У меня есть сотни для хранения в gdrive, поэтому я бы предпочел преобразовать их, чтобы потом было проще манипулировать ими и объединяться.

1 Ответ

2 голосов
/ 06 мая 2019
  • Вы хотите преобразовать файл RTF в Google Document.
  • Существует несколько сотен файлов RTF.

Если мое понимание верно, как насчет этого примера сценария?

В качестве простого преобразования вы можете использовать скрипт Drive.Files.copy({mimeType: MimeType.GOOGLE_DOCS}, fileId) с помощью Advanced Google Service.Но из твоего вопроса я подумал, что при конвертации большого количества файлов время выполнения может превышать 6 минут.Таким образом, в этом примере сценария я конвертирую файлы с помощью метода files.copy Drive API с помощью пакетного запроса.

Пример сценария:

При запуске сценария установите параметры вфункция main().И запустите main().

// Get file IDs of Microsoft Excel files in a specific folder including subfolders.
function getFileIds(folder, fileIds, q) {
  var files = folder.searchFiles(q);
  while (files.hasNext()) {
    fileIds.push(files.next().getId());
  }
  var folders = folder.getFolders();
  while (folders.hasNext()) {
    getFileIds(folders.next(), fileIds, q);
  }
  return fileIds;
}

// Convert Microsoft Docs to Google Docs
function convertToGoogleDocs(fileIds, dest, to) {
  var limit = 100;
  var split = Math.ceil(fileIds.length / limit);
  var reqs = [];
  for (var i = 0; i < split; i++) {
    var boundary = "xxxxxxxxxx";
    var payload = fileIds.splice(0, limit).reduce(function(s, e, i) {
      s += "Content-Type: application/http\r\n" +
        "Content-ID: " + i + "\r\n\r\n" +
        "POST https://www.googleapis.com/drive/v3/files/" + e + "/copy" + "\r\n" +
        "Content-Type: application/json; charset=utf-8\r\n\r\n" +
        JSON.stringify({"parents": [dest], "mimeType": to}) + "\r\n" +
        "--" + boundary + "\r\n";
      return s;
    }, "--" + boundary + "\r\n");
    var params = {
      method: "post",
      contentType: "multipart/mixed; boundary=" + boundary,
      payload: payload,
      headers: {Authorization: "Bearer " + ScriptApp.getOAuthToken()},
      muteHttpExceptions: true,
    };
    var req = UrlFetchApp.getRequest("https://www.googleapis.com/batch/drive/v3", params);
    reqs.push(req);
  }
  return UrlFetchApp.fetchAll(reqs);
}

// Please run this function.
function main() {
  var sourceFolderId = "###"; // Folder ID including source files. Please set this.
  var destinationFolderId = "###"; // Folder ID that the converted files are put. Please set this.

  var from = [MimeType.RTF, MimeType.MICROSOFT_WORD_LEGACY]; // Source mimeType
  var to = MimeType.GOOGLE_DOCS; // Destination mimeType
  var q = from.reduce(function(q, e, i) {return q += "mimeType='" + e + "'" + (i < from.length - 1 ? " or " : "")}, "");
  var fileIds = getFileIds(DriveApp.getFolderById(sourceFolderId), [], q);
  Logger.log(fileIds)
  var res = convertToGoogleDocs(fileIds, destinationFolderId, to);
  Logger.log(res);
}

Примечание:

  • Если размер файла большой, может произойти ошибка.
  • При получении файла RTF с помощьюDrive API, был случай, когда mimeType становится application/msword.Поэтому я выполнил поиск как application/rtf, так и application/msword.
  • К сожалению, на текущем этапе пакетный запрос не может использовать медиа-объект.Поэтому я использовал метод files.copy.В этом случае файлы могут быть преобразованы без использования медиа-объекта.

Ссылки:

Если я неправильно понял ваш вопрос, и это был не тот результат, который вы хотите, я прошу прощения.

...